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

<01131> 0016013E R WM_NEXTDLGCTL

<01132> 0016013E S WM_GETDLGCODE

0

Решение

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

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

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

0

Другие решения

Вы публикуете значение lParam 2, но проверяю '2' — Они не то же самое!

Пытаться

if (pMsg-> wParam == ‘r’ && pMsg-> wParam == 2)

РЕДАКТИРОВАТЬ: поняла после ответа райриера: конечно должно быть

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

По вопросам рекламы [email protected]