1

CDialog 派生クラスがあります。そのインターフェース定義には、リソースファイルで次のように定義された、いくつかの画像ボックスといくつかのボタンがあります。

IDD_SELECT_ITEMS DIALOGEX 0, 0, 462, 274
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Select"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
    CONTROL         "",IDC_ITEM1,"Static",SS_BLACKFRAME,13,18,59,52
 //...
    CONTROL         "",IDC_ITEM18,"Static",SS_BLACKFRAME,373,178,59,52
    LTEXT           "Select",IDC_STATIC,7,256,40,8
    PUSHBUTTON      "All",IDC_ALL,47,253,50,14
    PUSHBUTTON      "None",IDC_NONE,101,253,50,14
    PUSHBUTTON      "Filter ...",IDC_FILTER,155,253,60,14
    DEFPUSHBUTTON   "OK",IDOK,353,253,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,405,253,50,14
END

IDC_ALL ボタンがフォーカスされているため、Enter キーを押しても IDOK ボタンに関連付けられたアクションがトリガーされません。これは望ましくありません。

その初期化ルーチンでは、

BOOL CSelectDialog::OnInitDialog() 
{
    CDialog::OnInitDialog();
//...
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

IDOK ボタンに焦点を合わせるためにあらゆることを試みましたが、成功しませんでした。私が追加した行にコメントを付けたり、コメントを外したりするのにうんざりするところまで:

BOOL CSelectParts::OnInitDialog() 
{
    SendDlgItemMessage(IDOK, DM_SETDEFID, 0);

    CDialog::OnInitDialog();
//  ...

    this->SetDefID(IDOK);

    GetDlgItem(IDOK)->SendMessage(BN_SETFOCUS, 0, 0);

    SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
    SendDlgItemMessage(IDOK, BN_SETFOCUS, 0, 0);
    SendDlgItemMessage(IDC_ALL, WM_KILLFOCUS, 0, 0);

    SendDlgItemMessage(IDOK, DM_SETDEFID, 0,0);
    ::SetFocus(GetDlgItem(IDOK)->GetSafeHwnd());

    GetDlgItem(IDOK)->SetFocus();
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

私が近づいたのは、ラインを使ったものでした

    SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);

これは非常に奇妙なことを行いました。画像でわかるように、2 つのボタンにフォーカス四角形を描画しました。

フォーカスされた2つのボタンによるダイアログ!

しかし、Enter キーはまだデフォルトのプッシュ ボタンをトリガーしていません!

OnOKメソッドを追加しようとしました

void CSelectDialog::OnOK()
{
    __super::OnOK();
}

まだ成功していません!

もう 1 つの実験: クラスのメッセージ マップにエントリを追加しました。

ON_COMMAND(IDOK, OnOK)

それでも失敗!

Enter キーで IDOK ボタンのアクションを実行するにはどうすればよいですか?

4

1 に答える 1

0

解決策はコメントで私の目の前にあり、私はそれを見ていないので完全に盲目でした!

Dialog Box Programming ConsiderationsWM_INITDIALOGの「The Message」セクションの最後を見て、FALSE を返す必要があることを理解しました。

追加した不要な行をすべて削除し、戻り値を に変更するFALSEと、すべてが期待どおりに機能し始めました:)

于 2016-02-02T01:03:01.070 に答える