2011-01-10 76 views

回答

2

如果你真的只是想说:“我怎么禁止改变控制?”,然后调用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即可。您可能需要进行一些实验。

还有一个名为SubclassWindow的CWnd类的MFC方法。所以如果你想要使用纯MFC,你也可以考虑一下。

+0

感谢您的回答! – lebron2323 2011-01-10 08:47:08

2

而不子类的组合框的简单的解决方法是设置它的第一子窗口(这是CEdit的框)为只读,像这样:

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