MFC计算器软键盘鼠标点击输入问题GetFocus()问题
在下在做一个MFC计算器有3个编辑框我想实现用鼠标点击0-9软键盘输入数字进编辑框12的这个功能假如说在编辑框1内输入数字20然后又在编辑框2内输入30最后按加法把结果求...
在下在做一个MFC计算器
有3个编辑框 我想实现用鼠标点击0-9软键盘输入数字进编辑框12的这个功能
假如说
在编辑框1内输入数字 20
然后又在编辑框2内输入 30
最后按加法
把结果求和在 第三个编辑框内
3个编辑框的
IDC_EDIT1
IDC_EDIT2
IDC_EDIT3
目前我用了GetDlgItem(IDC_EDIT1)->GetFocus()
但是实际情况是当我鼠标选定了编辑框1输入完数字之后
我再鼠标点击另一个编辑框 进行编辑框2的数字输入的时候
我输入的第2个数字还是继续显示在编辑框1中?
为什么ne ???
我想实现鼠标点在编辑框1然后鼠标点数字
然后我再点编辑框2 鼠标点数字
然后再点击求和 登出结果 但是未能如愿
void CMyDlg::OnButton14Num0()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if( GetDlgItem(IDC_EDIT1)->GetFocus())
{
m_num1=m_num1*10+0;
}
else if( GetDlgItem(IDC_EDIT2)->GetFocus())
{
m_num2=m_num2*10+0;
}
UpdateData(FALSE);
}
由于之前提问过多次,都未有人能回答全面,悬赏姑且先5分 热心的朋友另外追分
谢谢~!! 展开
有3个编辑框 我想实现用鼠标点击0-9软键盘输入数字进编辑框12的这个功能
假如说
在编辑框1内输入数字 20
然后又在编辑框2内输入 30
最后按加法
把结果求和在 第三个编辑框内
3个编辑框的
IDC_EDIT1
IDC_EDIT2
IDC_EDIT3
目前我用了GetDlgItem(IDC_EDIT1)->GetFocus()
但是实际情况是当我鼠标选定了编辑框1输入完数字之后
我再鼠标点击另一个编辑框 进行编辑框2的数字输入的时候
我输入的第2个数字还是继续显示在编辑框1中?
为什么ne ???
我想实现鼠标点在编辑框1然后鼠标点数字
然后我再点编辑框2 鼠标点数字
然后再点击求和 登出结果 但是未能如愿
void CMyDlg::OnButton14Num0()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if( GetDlgItem(IDC_EDIT1)->GetFocus())
{
m_num1=m_num1*10+0;
}
else if( GetDlgItem(IDC_EDIT2)->GetFocus())
{
m_num2=m_num2*10+0;
}
UpdateData(FALSE);
}
由于之前提问过多次,都未有人能回答全面,悬赏姑且先5分 热心的朋友另外追分
谢谢~!! 展开
1个回答
展开全部
先来看一下你上面说的是哪儿的错误哈:
首先GetDlgItem(IDC_EDIT1)获取了ID为IDC_EDIT1也就是编辑框CEdit类的对象的指针,继承了CWnd类,函数GetFocus是CWnd中的静态函数,来看一下函数原型:static CWnd* PASCAL GetFocus( );
返回值是CWnd* 类型的,也就是说如果当前对话框或是控件被focus,那么就返回这个对话框或控件的指针。而你在if语句中将这个指针返回值当作了判断条件,所以呢,如果指针为NULL则if不执行,否则if就会执行。因为CEdit是一个控件类,其父窗口是有的,就是你那个计算器的主窗口。对于CEdit控件类的父类CWnd中的成员变量并不是独立存在的,而是根据父窗口类中的成员变量动态改变的,也可以说是临时的(MSDN上的说法是temporary)。所以当程序运行的时候,无论是第一个编辑框被focus或是第二个编辑框被focus,只要主对话框被focus了,那么调用GetDlgItem(IDC_EDIT1)->GetFocus())还是调用GetDlgItem(IDC_EDIT2)->GetFocus())还是直接调用this->GetFocus()它们的返回值都是一样的,就是父对话框的指针。当然不为NULL,所以第一个if就会执行。所以就显示在第一个编辑框了。
建议多看看MSDN上的类库的说明,最具权威的说明和用法,你会收获很多。。。
祝你好运!
具体改的话,按照你的思路可以这么改:
先在主对话框类中增加一个int型的标识,假如是nEditFlag。
//nEditFlag = 0 表示编辑框都没被focus 等于1表示IDC_Edit1被focus 等于2表示IDC_EDIT2被focus
初始化函数OnInitDialog中初始化为:nEditFlag = 0;
为IDC_EDIT1和IDC_EDIT2关联消息映射,为它们各自增加EN_SETFOCUS消息,这个消息的含义是当鼠标点到IDC_EDIT1或IDC_EDIT2时自动发出EN_SETFOCUS消息,判断消息属于哪个编辑框,然后交给相应的消息处理函数(默认为OnSetfocusEdit1()或OnSetfocusEdit2())来处理,在OnSetfocusEdit1消息处理函数中将nEditFlag设为1,在OnSetfocusEdit2消息处理函数中将nEditFlag设为2。
然后再为主对话框中添加WM_LBUTTONDOWN消息,该消息的含义是当对主对话框中的空白地方鼠标左键落下的时候自动触发该消息,然后交给相应的处理函数来处理,默认处理函数为OnLButtonDown(),在该处理函数中这样写:
this->SetFocus();
nEditFlag = 0;
这样就差不多了,当单击按钮的时候只要判断一下nEditFlag的值就可以了。
首先GetDlgItem(IDC_EDIT1)获取了ID为IDC_EDIT1也就是编辑框CEdit类的对象的指针,继承了CWnd类,函数GetFocus是CWnd中的静态函数,来看一下函数原型:static CWnd* PASCAL GetFocus( );
返回值是CWnd* 类型的,也就是说如果当前对话框或是控件被focus,那么就返回这个对话框或控件的指针。而你在if语句中将这个指针返回值当作了判断条件,所以呢,如果指针为NULL则if不执行,否则if就会执行。因为CEdit是一个控件类,其父窗口是有的,就是你那个计算器的主窗口。对于CEdit控件类的父类CWnd中的成员变量并不是独立存在的,而是根据父窗口类中的成员变量动态改变的,也可以说是临时的(MSDN上的说法是temporary)。所以当程序运行的时候,无论是第一个编辑框被focus或是第二个编辑框被focus,只要主对话框被focus了,那么调用GetDlgItem(IDC_EDIT1)->GetFocus())还是调用GetDlgItem(IDC_EDIT2)->GetFocus())还是直接调用this->GetFocus()它们的返回值都是一样的,就是父对话框的指针。当然不为NULL,所以第一个if就会执行。所以就显示在第一个编辑框了。
建议多看看MSDN上的类库的说明,最具权威的说明和用法,你会收获很多。。。
祝你好运!
具体改的话,按照你的思路可以这么改:
先在主对话框类中增加一个int型的标识,假如是nEditFlag。
//nEditFlag = 0 表示编辑框都没被focus 等于1表示IDC_Edit1被focus 等于2表示IDC_EDIT2被focus
初始化函数OnInitDialog中初始化为:nEditFlag = 0;
为IDC_EDIT1和IDC_EDIT2关联消息映射,为它们各自增加EN_SETFOCUS消息,这个消息的含义是当鼠标点到IDC_EDIT1或IDC_EDIT2时自动发出EN_SETFOCUS消息,判断消息属于哪个编辑框,然后交给相应的消息处理函数(默认为OnSetfocusEdit1()或OnSetfocusEdit2())来处理,在OnSetfocusEdit1消息处理函数中将nEditFlag设为1,在OnSetfocusEdit2消息处理函数中将nEditFlag设为2。
然后再为主对话框中添加WM_LBUTTONDOWN消息,该消息的含义是当对主对话框中的空白地方鼠标左键落下的时候自动触发该消息,然后交给相应的处理函数来处理,默认处理函数为OnLButtonDown(),在该处理函数中这样写:
this->SetFocus();
nEditFlag = 0;
这样就差不多了,当单击按钮的时候只要判断一下nEditFlag的值就可以了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询