VC (mfc)中列表可以像编辑框一样在里面用键盘输入值吗?
展开全部
先来看一下你上面说的是哪儿的错误哈:
首先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的值就可以了。
展开全部
可以,获取到鼠标点击的时候,在list的相应位置画一个edit,然后获取值再更新就可以了。
追问
大侠,可以说清楚点吗?
(有分加,谢谢)
追答
获取到鼠标点击事件之后,通过坐标判断点击的是哪个单元格,然后新建一个edit覆盖这个单元格。当输入完按下回车后,获取edit的内容,并销毁该edit。
然后把edit的内容更新到相应单元格即可。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以 呀,只要你绑定变量,在函数中用相应的代码获取其中的输入值就行了。
追问
我的列表对应的变量为m_list,我的意思是直接用键盘向列表中输入数字,而不是通过变量来给列表赋值,可以吗??
(我试了一下,光标无法点入列表中)
追答
不通过变量,好像不行呀,反正我没用过,还有,你不通过变量,怎么把值获取;
如果你不用获取值的话,有个readonly属性,你把它改成false看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
MFC中添加备册一孝滚让个List Control控件,然后设置该控件的”Edit Labels“属性为True,就可以直接编辑了巧局。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询