您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> CEdit框的焦点问题

CEdit框的焦点问题

来源:网络整理     时间:2016/7/6 17:09:42     关键词:

关于网友提出的“ CEdit框的焦点问题”问题疑问,本网通过在网上对“ CEdit框的焦点问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: CEdit框的焦点问题
描述:

一个对话框上的Edit控件,如果要让它获得焦点,用控件变量或控件指针调用SetFocus方法都可以实现。
但如果用SendMessage(hwnd,WM_SETFOCUS,0,0)或SendDlgItemMessage(IDC_EDIT1,WM_SETFOCUS)
可以获得焦点,但Edit就无法输入字符了,而且失去焦点后鼠标点击也不能再获得焦点。
不知道是什么原因?


解决方案1:

引用楼主 shequay 的帖子:
一个对话框上的Edit控件,如果要让它获得焦点,用控件变量或控件指针调用SetFocus方法都可以实现。 
但如果用SendMessage(hwnd,WM_SETFOCUS,0,0)或SendDlgItemMessage(IDC_EDIT1,WM_SETFOCUS) 
可以获得焦点,但Edit就无法输入字符了,而且失去焦点后鼠标点击也不能再获得焦点。 
不知道是什么原因?

你的问题实际上就是"SetFocus()"与"SendMessage()"的区别在哪?
回答如下:
1.SetFocus函数要做3件事:1)发送kill_focus到前一个窗口;2)发送set_focus到现有窗口;3)让现有窗口出于激活状态.
2.SendMessage只做第2件事,并通过回调函数wndproc处理相应事件.
由此对比,不难发现出现你所说现象的原因. 解决方案2:

经过仔细读了MSDN后发现。如果要获得键盘输入,就要是 active窗口。所以LZ用消息当然是可以的,只是你少一步没做。
如下代码片段:
         m_edtTest.SendMessage(WM_SETFOCUS,0,0);
m_edtTest.SendMessage(WM_ACTIVATE, WA_ACTIVE,0);
这样就可以获得键盘输入。
www.bysj580.cn

解决方案3:

之前没注意到这个问题,我测试了一下,确实如此。
我查了一下,SetFocus函数执行了两个操作,一个是向最后一个有焦点的Window发了一个WM_KILLFOCUS,之后又发了一个WM_SETFOCUS。
但不知道和这个有什么关系 。

解决方案4:

The framework calls this member function after gaining the input focus.
所以SetFocus()函数不是WM_SETFOCUS消息.SetFocus()需要把原始输入队列连接到Edit窗口.


以上介绍了“ CEdit框的焦点问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2344393.html

相关图片

相关文章