gpt4 book ai didi

c++ - 如何禁用 CComboBox mfc 键盘导航?

转载 作者:行者123 更新时间:2023-11-30 02:10:24 35 4
gpt4 key购买 nike

我如何禁用 CComboBox mfc 键盘导航,我需要在打开下拉列表的情况下按下键盘上的键时,不能选择项目。谢谢!

最佳答案

如果您真的只是想说:“我如何禁止控件被更改?”,那么只需调用 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,你也可以看看这个。

关于c++ - 如何禁用 CComboBox mfc 键盘导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4644649/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com