0

PostMessage を使用して、CDialog コントロールのフォーカスを CFormView から変更しようとしています。

[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 メソッドは、ユーザーが (ダイアログから) Return キーを押すたびにフォーカスを適切に変更することに気付きました。しかし、これは別のダイアログでは達成できませんでした。

その背後にある理由、またはヒントや回避策を知っている人はいますか?

ありがとう。

編集:

これは、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

の lParam 値を投稿していますが2、チェックしてい'2'ます - それらは同じではありません!

試す

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

EDIT:rrirowerの答えの後に実現:もちろんそうあるべきです

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