这是一个MFC的DIALOG工程。
首先,我需要处理下拉框控件IDC_COMBO1的回车事件,我的方法是:在OnOK函数中,通过switch (pWnd->GetDlgCtrlID())的方式判断当前回车的控件ID是否为IDC_COMBO1,然后进行处理。处理完后,将光标跳转到指定的下一个控件上。
我发现,对于Style是DropList风格的Combo控件,GetDlgCtrlID()可以正确获得控件ID,但是DropDown风格的Combo控件返回的控件ID是不正确的,并且所有的DropDown风格的Combo控件返回的ID都是1001。这样一来,我只能处理一个DropDown风格的Combo控件了,对于第二个、第三个这种控件根本无法处理其回车事件。
注:1、OnOK函数还需要处理另外的很多控件的回车事件。
2、此处大部分的回车事件都是跳转到指定控件,类似TAB的功能,因为TAB已经被我用为按控件排布顺序跳转,此处用回车实现控件之间的大跳转。
直接在父窗口的PreTranslateMessage里过滤WM_KEYDOWN消息,处理VK_RETURN键不是更简单一些吗?
CWnd* pWnd = GetNextDlgTabItem(GetFocus()); ASSERT(pWnd); PostMessage(WM_NEXTDLGCTL, (WPARAM)pWnd->GetSafeHwnd(), TRUE);
PreTranslateMessage里MSG结构体的hwnd参数。
pWnd是当前窗口的句柄,Combo是当前窗口的一个控件。
pWnd->GetDlgCtrlID()可以获得当前窗口上的控件ID,对于EDIT、Static等控件都能正确获得其唯一的ID,但是DropDown风格的Combo控件返回的ID都是1001,这是不正常的。
Combo由edit+list组成。所以:
getfocus如果得到的是edit,那么它的父窗口就是combo。