C++ 如何禁用CComboxMFC键盘导航?
如何才能禁用CComboxMFC键盘导航,我需要在按下键盘上的键时打开下拉列表,项目不能选择。谢谢 如果您的意思是:“如何禁止更改控件?”,那么只需调用CComboBox上的EnableWindow方法即可 但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与C++类混淆——不是一回事。基本上,我们只是截取所有与组合框相关的WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过 这样做:C++ 如何禁用CComboxMFC键盘导航?,c++,mfc,combobox,C++,Mfc,Combobox,如何才能禁用CComboxMFC键盘导航,我需要在按下键盘上的键时打开下拉列表,项目不能选择。谢谢 如果您的意思是:“如何禁止更改控件?”,那么只需调用CComboBox上的EnableWindow方法即可 但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与C++类混淆——不是一回事。基本上,我们只是截取所有与组合框相关的WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过 这样做: WNDPROC g_prevFunc = NULL; LRE
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类上还有一个名为Subclass Window的MFC方法。因此,如果您想使用纯MFC,您也可以研究一下这个问题。如果您的意思是:“如何禁用控件不被更改?”,那么只需调用cmbobox上的EnableWindow方法
但是,如果您真的想阻止键盘消息击中控件,请使用来吞咽键盘消息。(不要把术语“窗口子类化”与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类上还有一个名为Subclass Window的MFC方法。因此,如果您想使用纯MFC,您也可以研究这一点。一个不需要对combobox进行子类化的简单解决方案是将其第一个子窗口(即CEdit框)设置为只读,如下所示:
GetDlgItem(IDC\u MY\u组合)->GetWindow(GW\u CHILD)->SendMessage(EM\u SETREADONLY,1,0) 没有子类化combobox的简单解决方案是将其第一个子窗口(即CEdit框)设置为只读,如下所示: GetDlgItem(IDC\u MY\u组合)->GetWindow(GW\u CHILD)->SendMessage(EM\u SETREADONLY,1,0)