首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何禁用CComboBox mfc键盘导航?

如何禁用CComboBox mfc键盘导航?
EN

Stack Overflow用户
提问于 2011-01-10 15:43:15
回答 2查看 1.9K关注 0票数 1

我如何才能禁用mfc键盘导航,我需要当我按下键盘上的键打开下拉列表,项目一定不能选择。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-10 16:21:45

如果您真正的意思是:“如何禁止更改控件?”,那么只需在CComboBox上调用EnableWindow方法即可。

但是,如果您真的想阻止键盘消息点击控件,那么可以使用window subclassing来接受键盘消息。(不要将术语“窗口子类化”与C++类混淆--这不是一回事)。基本上,我们只是要拦截与组合框关联的所有WM_CHAR和WM_KEYDOWN消息,并让所有其他消息通过。

执行以下操作:

代码语言:javascript
复制
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,你也可以看看这个。

票数 2
EN

Stack Overflow用户

发布于 2014-10-02 18:07:29

一个没有子类化combobox的简单解决方案是将它的第一个子窗口(即CEdit框)设置为只读,如下所示:

GetDlgItem(IDC_MY_COMBO)->GetWindow(GW_CHILD)->SendMessage(EM_SETREADONLY,1,0);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4644649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档