Я пытаюсь изменить фокус элементов управления CDialog из CFormView с помощью PostMessage:
[CHelpView наследуется от CFormView.void CHelpView::OnEnterbutton()
{
pSplitterFrame->m_dlgPane->m_wndDlg->PostMessage(WM_KEYDOWN, 'r', 2);
}
BOOL CSampleDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && // for performance
pMsg->message <= WM_KEYLAST)
{
if (pMsg->wParam=='r' && pMsg->lParam==2){
NextDlgCtrl();
return TRUE;
}
}
}
Диалог получает сообщение, но метод NextDlgCtrl не меняет фокус. Я понял, что если я изменю метод PreTranslateMessage, чтобы при нажатии клавиши Return в диалоге этот метод NextDlgCtrl правильно изменял фокусировку каждый раз, когда пользователь нажимал клавишу возврата (из диалога). Но этого я не смог достичь с помощью другого диалога.
Кто-нибудь, возможно, знает причину этого или какие-либо намеки или обходной путь?
Благодарю.
РЕДАКТИРОВАТЬ:
Вот (часть) файл журнала для диалога от SPY ++.
<01128> 0016013E R WM_GETDLGCODE fuDlgCode: 0000
<01129> 0016013E P WM_KEYDOWN nVirtKey: 00726574 cRepeat: 2 ScanCode: 00 fExtended: 0 fAltDown: 0 fRepeat: 0 fUp: 0
<01130> 0016013E S WM_NEXTDLGCTL wCtlFocus: (ноль) (следующий элемент управления получает фокус) fHandle: False
<01131> 0016013E R WM_NEXTDLGCTL
<01132> 0016013E S WM_GETDLGCODE
Ваш обработчик PreTranslateMessage, как написано, никогда не будет работать. Эта строка,
if (pMsg->wParam=='r' && pMsg->wParam==2){
NextDlgCtrl();
return TRUE;
никогда не может быть правдой. Как pMsg-> wParam может равняться двум значениям одновременно? Я думаю, что вы хотели проверить на lParam?
Вы публикуете значение lParam 2
, но проверяю '2'
— Они не то же самое!
Пытаться
if (pMsg-> wParam == ‘r’ && pMsg-> wParam == 2)
РЕДАКТИРОВАТЬ: поняла после ответа райриера: конечно должно быть
if (pMsg->wParam == 'r' && pMsg->lParam == 2)