如何禁用CComboBox mfc键盘导航?

时间:2011-01-10 07:43:15

标签: c++ mfc combobox

我如何禁用CComboBox mfc键盘导航,我需要当我按下键盘打开下拉列表时,项目必须不选择。谢谢!

2 个答案:

答案 0 :(得分:2)

如果你的意思是:“如何禁止控制被更改?”,然后只需在CComboBox上调用EnableWindow方法。

但是,如果您真的想要阻止键盘消息点击控件,请使用window subclassing来吞下键盘消息。 (不要将术语“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);

}

仔细检查以确保这不会破坏标签键导航。我刚试过,似乎工作正常。您可能不需要吞下WM_CHAR,可能需要吞下WM_KEYUP和WM_KEYDOWN。您可能需要进行一些实验。

CWnd类上还有一个名为SubclassWindow的MFC方法。因此,如果您想要使用纯MFC,您也可以查看它。

答案 1 :(得分:2)

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

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