我如何才能禁用mfc键盘导航,我需要当我按下键盘上的键打开下拉列表,项目一定不能选择。谢谢!
发布于 2011-01-10 16:21:45
如果您真正的意思是:“如何禁止更改控件?”,那么只需在CComboBox上调用EnableWindow方法即可。
但是,如果您真的想阻止键盘消息点击控件,那么可以使用window subclassing来接受键盘消息。(不要将术语“窗口子类化”与C++类混淆--这不是一回事)。基本上,我们只是要拦截与组合框关联的所有WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过。
执行以下操作:
WNDPROC g_prevFunc = NULL;
LRESULT MyWindowHook(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ((uMsg == WM_CHAR) || (uMsg == WM_KEYDOWN) || (uMsg == WM_KEYUP))
{
return 0; // swallow message
}
return ::CallWindowProcW(g_prevFunc, hWnd, uMsg, wParam, lParam);
}
void MySubclassWindow(HWND hwnd)
{
g_prevFunc = (WNDPROC)::SetWindowLongW(hwnd, GWL_WNDPROC, (LONG_PTR)MyWindowHook);
}
// wherever your code gets initialized
CYourWindow::OnInit()
{
// whatever other initialization you got going on...
// I'm assuming your CComboBox is named something like m_combobox.
::MySubclassWindow(m_combobox.m_hWnd);
}仔细检查以确保这不会破坏Tab键导航。我刚刚试过了,它似乎工作得很好。您可能不需要吞下WM_CHAR,只需要吞下WM_KEYUP和WM_KEYDOWN即可。您可能需要做一些实验。
在CWnd类上还有一个名为SubclassWindow的MFC方法。所以如果你想使用纯MFC,你也可以看看这个。
发布于 2014-10-02 18:07:29
一个没有子类化combobox的简单解决方案是将它的第一个子窗口(即CEdit框)设置为只读,如下所示:
GetDlgItem(IDC_MY_COMBO)->GetWindow(GW_CHILD)->SendMessage(EM_SETREADONLY,1,0);
https://stackoverflow.com/questions/4644649
复制相似问题