2011-01-10 3 views

ответ

2

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

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

Существует также метод MFC в классе CWnd под названием SubclassWindow. Поэтому, если вы хотите перейти на чистую MFC, вы также можете изучить это.

+0

Спасибо за ответ !!! – lebron2323

2

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

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

Смежные вопросы