[英]How to disable CComboBox mfc keyboard navigation?
我怎么能禁用CComboBox mfc鍵盤導航,我需要當我按下鍵盤打開下拉列表時,項目必須不選擇。 謝謝!
沒有子類化組合框的簡單解決方案是將其第一個子窗口(即CEdit框)設置為只讀,如下所示:
GetDlgItem(IDC_MY_COMBO) - > GetWindow(GW_CHILD) - > SendMessage(EM_SETREADONLY,1,0);
如果你真的只是說:“如何禁止控制被更改?”,然后只需在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);
}
仔細檢查以確保這不會破壞標簽鍵導航。 我剛試過,似乎工作正常。 您可能不需要吞下WM_CHAR,可能需要吞下WM_KEYUP和WM_KEYDOWN。 您可能需要進行一些實驗。
在CWnd類上還有一個名為SubclassWindow的MFC方法。 因此,如果您想要使用純MFC,您也可以查看它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.