读书人

多编辑框输入焦点切换有关问题

发布时间: 2014-01-22 00:03:39 作者: rapoo

多编辑框输入焦点切换问题
多编辑框输入焦点切换有关问题

界面大概就是这样的,逻辑如下。
首先在CView下的PreTranslateMessage 拦截回车按键
IMEI1编辑框按下回车后MEID1.SetFocus()

MEID1编辑框按下回车后创建一个新的工作线程WorkThread


在WorkThread工作时通过全局函数获取到当前View的指针,用设个指针调用GetDlgItem获取到IMEI1编辑框句柄(pImei),用这个句柄pImei->SetFocus()


运行代码以后,IMEI1切换到MEID1没问题,但是在工作线程中设置IMEI1的焦点却没反应。

费解,于是不甘心就用发送消息的方式给IMEI1设置焦点,伪代码如下:
pImei->SendMessage(WM_SETFOCUS)

运行程序惊喜发现,光标终于在IMEI1中闪烁(内心小激动),但是又一个坑来了,此时光标在IMEI1中,我按下回车却发现一个新的WorkThrea创建了(也就是说光标虽然在IMEI1中,但是我按下回车却执行了MEID1按下回车时执行的动作。)


光标在IMEI1编辑框中,按下回车以后却执行了MEID1按下回车时执行的动作,也就是说光标是切换到IMEI1了,但是响应键盘的焦点却还在MEID1编辑框上。

求大神点拨下!

1,为什么我用pImei->SetFocus()会没反应??
2,为什么用pImei->SendMessage(WM_SETFOCUS),光标是变化了,但是按键响应却是停留在MEID1编辑框上






[解决办法]
1。
你在子线程里获得的控件的指针和主线程不是同一个,也就是获得子线程的控件只是个副本,并不是主线程的同一个控件。只能发送消息来实现
2。
你可以这么试试:先发送第一个控件的失去焦点的消息(类似WM_LEAVEFOCUS),再发送设置第二个焦点的消息。
[解决办法]
你的工作线程中PostMessage一个自定义消息到UI线程,在UI线程中消息的响应函数中SetFocus()你需要设置焦点的窗口
[解决办法]
试试:
WM_CANCELMODE
This message is sent to the focus window when a dialog box or message box is displayed; this enables the focus window to cancel modes, such as stylus capture.

读书人网 >VC/MFC

热点推荐