表示されている境界線とは、点線の焦点を合わせるように、どのようにボタンにフォーカスを設定するには?

StackOverflow https://stackoverflow.com/questions/369788

質問

Visual Studioのエディタを使用して、私は、単純なダイアログベースのアプリケーションを作成し、デフォルトでCDialogのは、(それらをドラッグ・アンド・ドロップすることで)3つのボタンが追加されました。

デフォルトOKボタンとCancelボタンあまりにもあります。

私はボタン3をクリックすると、ボタン1にフォーカスを設定します。

私はMUYボタンのプロパティにtrueにフラットプロパティを設定します。

私はこれをコード化されます:

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

    Invalidate();

}

しかし、ボタン1でboderが描かれることはありません。私はいつでもクリックする前に、TABを押した場合は、キャレット(点線は、フォーカスを示す)のみ描かれているボタン3

私はそれをクリックした後、それは見た目ほどボタンを正確に見てみたいです。 、プログラム的にボタンの内側に点線を表示することはプラスになります。

私が欲しいます:

私は何を得る:

役に立ちましたか?

解決 3

このボタンの周りに太い境界線を描画します:

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

これを行うには、よりエレガントな方法はCbuttonfocusDlgにCButtonのメンバ変数を定義し、IDC_BUTTON1コントロールに関連付けして、

を呼び出すことであろう
this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

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

他のヒント

WM_NEXTDLGCTLを使用します。

レイモン陳さん「ダイアログにフォーカスを設定する方法をご覧ください。ボックス "するます:

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
フォーカスの変更が有効になる前に、

UpdateWindowを呼び出すことにより、ボタンが再描画されています。無効化は、それ自体で十分なものでなければならないすべてが落ち着いたときに、ウィンドウが再描画されます。

私はジョエルの提案を以下しています。しかし、そのリンクで使用されるAPIと若干異なる、私の1は、次のとおりです。

のPostMessage(WM_NEXTDLGCTL、(WPARAM)(pwnd-> GetSafeHwnd())、TRUE);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top