Если вы действительно имеете в виду: «как отключить изменение элемента управления?», Просто вызовите метод 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, вы можете посмотреть и на это.