1

簡単なダイアログ ベースのアプリケーションを作成し、既定の CDialog に、Visual Studio エディターを使用して (ドラッグ アンド ドロップで) 3 つのボタンを追加しました。

デフォルトの [OK] ボタンと [キャンセル] ボタンもそこにあります。

ボタン 3 をクリックしたときにボタン 1 にフォーカスを設定したい。

多くのボタンのプロパティでプロパティ Flat を true に設定しました。

私はこれをコーディングしました:

void CbuttonfocusDlg::OnBnClickedButton3()
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_BUTTON1)->SetFocus();

    Invalidate();

}

しかし、button1 のボーダーは描画されません。キャレット (フォーカスを示す点線) は、ボタン 3 をクリックする前にいつでも TAB を押した場合にのみ描画されます。

ボタンをクリックした後の見た目とまったく同じようにボタンを表示したい。プログラムでボタン内に点線を表示すると、プラスになります。

私が欲しいもの:

http://i33.tinypic.com/11t8pkl.png

私が得るもの:

http://i37.tinypic.com/160q5hw.png

4

4 に答える 4

4

を使用しWM_NEXTDLGCTLます。

Reymond Chen の「ダイアログ ボックスでフォーカスを設定する方法」を参照してください。

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
于 2008-12-16T22:51:21.230 に答える
0

これにより、ボタンの周囲に太い境界線が描画されます。

static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);

これを行うためのより洗練された方法は、CbuttonfocusDlgでCButtonメンバー変数を定義し、それをIDC_BUTTON1コントロールに関連付けてから、を呼び出すことです。

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

これにより、フォーカスを設定しているボタンがデフォルトボタンになりますが、フォーカスがボタンではないコントロール(ダイアログ内)に移動すると、デフォルトボタンがもう一度元のデフォルトボタンに設定されることに注意してください。ダイアログリソース、この場合は[OK]ボタン。

于 2008-12-16T15:54:22.680 に答える
0

私はジョエルの提案に従っています。しかし、そのリンクで使用されている API とは少し異なります。私のものは次のとおりです。

PostMessage(WM_NEXTDLGCTL, (WPARAM)(pwnd->GetSafeHwnd()), TRUE);

于 2014-06-24T01:58:50.560 に答える
0

UpdateWindow を呼び出すと、フォーカスの変更が有効になる前にボタンが再描画されます。Invalidate だけで十分なはずです。すべてが落ち着いたら、ウィンドウが再描画されます。

于 2008-12-15T21:47:43.417 に答える