从另一个对话框更改CDialog控件焦点

时间:2014-05-20 15:20:29

标签: c++ mfc cdialog

我试图通过使用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

2 个答案:

答案 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?