Как отключить CComboBox MFC клавиатурную навигацию? - PullRequest
1 голос
/ 10 января 2011

Как я могу отключить CComboBox MFC клавиатурную навигацию, мне нужно, когда я нажимаю клавишу на клавиатуре с открытым выпадающим списком, элемент не должен выбираться. Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 октября 2014

Простое решение без выделения подклассов в выпадающем списке состоит в том, чтобы установить его первое дочернее окно (то есть поле CEdit) только для чтения, как это:

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

2 голосов
/ 10 января 2011

Если вы действительно имеете в виду: «как отключить изменение элемента управления?», Просто вызовите метод EnableWindow в CComboBox.

Но если вы действительно имеете в виду, что вы просто хотите заблокировать сообщения клавиатурыот удара по элементу управления, затем используйте подклассы окна , чтобы проглотить сообщения клавиатуры.(Не путайте термин «оконное наследование» с классами 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 также есть метод MFC, который называется SubclassWindow.Так что если вы хотите использовать чистый MFC, вы можете посмотреть и на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...