Wie Fokus auf eine Schaltfläche, um so ein, dass die Grenze und die gestrichelte Linie sichtbar konzentrieren?

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

Frage

Ich habe eine einfache dialogbasierte Anwendung, und in der Standard-CDialog hinzugefügt drei Tasten (per Drag-and-Drop), um das Visual Studio-Editor.

Die Standard-Schaltflächen OK und Abbrechen sind auch da.

Ich möchte den Fokus auf die Taste 1 setzen, wenn ich klicken 3.

habe ich die Eigenschaft Wohnung auf true in den Eigenschaften für muy Tasten.

I codiert diese:

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

    Invalidate();

}

Aber die boder in button1 wird nie gezeichnet. Das Caret (die gestrichelte Linie Fokus angibt) nur gezogen, wenn ich TAB, bevor Sie auf eine beliebige Zeit gedrückte Taste 3.

Ich mag die Taste genau aussehen, wie es aussieht, nachdem ich es klicken. Zeigt die gestrichelte Linie in der Schaltfläche programatically, wäre ein Plus.

Was ich will:

Was erhalte ich:

War es hilfreich?

Lösung 3

Dies zieht den dicken Rahmen um die Schaltfläche:

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

Eine elegantere Art und Weise, dies zu tun wäre, eine CButton Membervariable in CbuttonfocusDlg zu definieren und an die IDC_BUTTON1 Steuerung zu verbinden, und dann rief

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

Dies macht die Taste, um die ich die Einstellung der Fokus der Standard-Schaltfläche, aber beachten Sie, dass, wenn der Fokus auf ein Steuerelement geht (im Dialog), die nicht ein Knopf ist, ist die Standard-Taste noch einmal die ursprüngliche Standard-Schaltfläche Satz im Dialogressource, in diesem Fall der Schaltfläche „Ok“.

Andere Tipps

Mit WM_NEXTDLGCTL.

Siehe Reymond Chens „Wie Fokus in einem Dialog setzen box ":

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}

Durch den Aufruf Update, wird der Button vor der Fokusänderung neu gezeichnet wird, wirksam werden kann. Die Invalidate sollte von selbst ausreichend sein, wird das Fenster neu gestrichen werden, wenn alles beruhigt hat.

Ich folge Joels Vorschlag. Aber etwas anders mit der API in dieser Verbindung verwendet wird, meine ist:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top