我试图通过使用PostMessage从CFormView更改CDialog控件的焦点:
[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 ++的对话框的日志文件。
&LT; 01128&GT; 0016013E R WM_GETDLGCODE fuDlgCode:0000
&LT; 01129&GT; 0016013E P WM_KEYDOWN nVirtKey:00726574 c重复:2 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
&LT; 01130&GT; 0016013E S WM_NEXTDLGCTL wCtlFocus :( null)(下一个控件获得焦点)fHandle:False
&LT; 01131&GT; 0016013E R WM_NEXTDLGCTL
&LT; 01132&GT; 0016013E S WM_GETDLGCODE
答案 0 :(得分:0)
您发布的{Parame值为2
,但检查'2'
- 它们不一样!
尝试
if(pMsg-&gt; wParam =='r'&amp;&amp; pMsg-&gt; wParam == 2)
编辑:在rrirower回答之后意识到:它当然应该是
if (pMsg->wParam == 'r' && pMsg->lParam == 2)
答案 1 :(得分:0)
您编写的PreTranslateMessage处理程序将永远不会工作。这一行,
if (pMsg->wParam=='r' && pMsg->wParam==2){
NextDlgCtrl();
return TRUE;
永远不会是真的。 pMsg-&gt; wParam如何同时等同于两个值?我想你想检查lParam?