0

我正在尝试使用 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++ 对话框的(部分)日志文件。

<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

4

2 回答 2

0

你写的 PreTranslateMessage 处理程序永远不会工作。这条线,

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

永远不可能是真的。pMsg->wParam 如何同时等于两个值?我想你是想检查 lParam 吗?

于 2014-05-21T12:26:24.420 回答
0

您发布的 lParam 值为2,但检查'2'- 它们不一样!

尝试

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

编辑:在 rrirower 的回答之后意识到:当然应该是

if (pMsg->wParam == 'r' && pMsg->lParam == 2)
于 2014-05-21T06:18:44.520 回答