Comment définir le focus sur un bouton pour que la frontière et de se concentrer ligne en pointillé sont visibles?

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

Question

J'ai créé une application de dialogue-simple, et la valeur par défaut CDialog ajouté trois boutons (en les glisser-déposer) en utilisant l'éditeur Visual Studio.

La valeur par défaut boutons OK et Annuler sont là aussi.

Je veux mettre l'accent sur le bouton 1 lorsque je clique sur le bouton 3.

Je mets la propriété Appartement à vrai dans les propriétés des boutons muy.

Je codé ceci:

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

    Invalidate();

}

Mais le Boder en button1 est jamais dessiné. Le caret (la ligne en pointillés indiquant mise au point) est seulement établi si j'appuyé sur TAB tout moment avant cliquant sur le bouton 3.

Je veux que le bouton pour regarder exactement comme il a l'air après que je clique dessus. Affichage de la ligne en pointillés à l'intérieur du bouton programatically, serait un plus.

Ce que je veux:

Qu'est-ce que je reçois:

Était-ce utile?

La solution 3

dessine la bordure épaisse autour du bouton:

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

Une plus élégante façon de le faire serait de définir une variable membre CButton dans CbuttonfocusDlg et l'associer au contrôle de IDC_BUTTON1, puis appeler

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

Cela rend le bouton auquel je mettre l'accent sur le bouton par défaut, mais notez que lorsque l'accent va à un contrôle (dans la boîte de dialogue) qui n'est pas un bouton, le bouton par défaut est une nouvelle fois sur le bouton par défaut d'origine ensemble dans la ressource de dialogue, dans ce cas, le bouton « Ok ».

Autres conseils

Utilisez WM_NEXTDLGCTL.

Voir Chen Reymond « Comment définir le focus dans une boîte de dialogue boîte ":

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

En appelant UpdateWindow, le bouton est redessinée avant le changement de mise au point peut prendre effet. Le Invalider devrait être suffisant par lui-même, la fenêtre se repeint quand tout s'installe.

Je suis la suggestion de Joel. Mais un peu différent avec l'API utilisée dans ce lien, celui-ci est mon:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top