#winforms #onkeydown
#winforms #onkeydown
Вопрос:
У меня есть элемент управления WinForms (скажем, C) внутри CWinFormsView V приложения MDI. C переопределяет метод OnKeyDown. Я также переопределил OnMouseUp в C и вызываю там метод Focus(), поэтому, когда я нажимаю внутри C, сообщения с клавиатуры переходят непосредственно к нему, и все работает правильно.
Однако я хотел бы иметь возможность управлять C с помощью клавиатуры при переключении на V без необходимости щелкать внутри представления. Как я могу этого добиться? Нужно ли мне перехватывать сообщения WM_KEYDOWN в V и передавать их вручную размещенному элементу управления (другими словами, на C)? C на самом деле является дочерним окном V, разве оно не должно каким-то образом работать автоматически?
Комментарии:
1. Переопределите метод OnInitDialog() представления. В случае базовой реализации установите фокус на один из элементов управления и верните FALSE .
Ответ №1:
Если я понял ваш вопрос, то самый простой способ — заставить V перенаправлять нажатия на C.
Посмотрите на Form.KeyPreview
— для V — который позволит V видеть все нажатия клавиш, когда он или один из его дочерних элементов находятся в фокусе. Затем вы можете переслать его в C.
Ответ №2:
На самом деле я решил проблему с помощью следующего кода в V представлении:
BOOL CMyView::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN || pMsg->message == WM_MOUSEWHEEL )
{
::SendMessage( (HWND) m_myControl->Handle.ToInt32(), pMsg->message, pMsg->wParam, pMsg->lParam );
}
return CWinFormsView::PreTranslateMessage(pMsg);
}
Также я удалил код, который устанавливает фокус на C при щелчке мыши. Таким образом, он никогда не фокусируется, но получает сообщения родительского представления (мне нужны WM_KEYDOWN и WM_MOUSEWHEEL) из PreTranslateMessage. Важно не настраивать фокус, потому что в противном случае я потерял бы возможность переключаться между представлениями MDI с помощью Ctrl Tab (если был сфокусирован на C). Итак, теперь я могу свободно переключаться между ними, затем, когда V становится активным, я могу использовать клавиши для управления C, но я все еще могу использовать Ctrl Tab для переключения на другой вид без использования мыши.