Изменение настроек CDialog с другого диалога

Я пытаюсь изменить фокус элементов управления CDialog из CFormView с помощью PostMessage:

[CHelpView унаследован от CFormView. И m_wndDlg - объект CSampleDlg (унаследованный от CDialog)]

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: (null) (следующий элемент управления получает фокус) fHandle: False

<01131> 0016013E R WM_NEXTDLGCTL

<01132> 0016013E S WM_GETDLGCODE

2 ответа

Обработчик PreTranslateMessage, как написано, никогда не будет работать. Эта линия,

if (pMsg->wParam=='r' && pMsg->wParam==2){ NextDlgCtrl(); return TRUE;

никогда не может быть правдой. Как pMsg-> wParam приравнивается к двум значениям одновременно? Я думаю, вы хотели проверить lParam?


Вы отправляете значение lParam на 2, но проверяете '2' - они не то же самое!

Пытаться

if (pMsg-> wParam == 'r' && pMsg-> wParam == 2)

EDIT: реализовано после ответа rrirower: конечно, должно быть

if (pMsg->wParam == 'r' && pMsg->lParam == 2)

licensed under cc by-sa 3.0 with attribution.