2011-01-10 74 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);