簡體   English   中英

如何禁用CComboBox mfc鍵盤導航?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM