Come impostare messa a fuoco a un pulsante in modo che il confine e mettere a fuoco la linea tratteggiata sono visibili?

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

Domanda

Ho creato una semplice applicazione basata su finestra di dialogo, e nel default CDialog aggiunto tre pulsanti (da loro drag-and-drop) utilizzando l'editor di Visual Studio.

Il valore predefinito pulsanti OK e Annulla sono troppo.

voglio impostare la messa a fuoco al tasto 1 quando clicco il tasto 3.

Ho impostato la proprietà Piso a true nelle proprietà per i pulsanti muy.

ho codificato questo:

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

    Invalidate();

}

Ma la boder in Button1 non è mai disegnato. L'accento circonflesso (la linea tratteggiata che indica fuoco) è disegnato solo se ho premuto TAB qualsiasi momento prima di cliccare il pulsante 3.

Voglio il pulsante per apparire esattamente come appare dopo lo scatto. Mostrando la linea tratteggiata all'interno del pulsante programatically, sarebbe un plus.

Quello che voglio:

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

Quello che ottengo:

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

È stato utile?

Soluzione 3

Questa disegna il bordo spesso attorno al pulsante:

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

Un modo più elegante per fare questo sarebbe quello di definire una variabile membro CButton in CbuttonfocusDlg e associarlo al controllo IDC_BUTTON1, e quindi chiamando

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

In questo modo il pulsante a cui sto la messa a fuoco il pulsante predefinito, ma si noti che quando l'attenzione va a un controllo (all'interno della finestra di dialogo) che non è un pulsante, il pulsante di default è ancora una volta il pulsante di default originale Situato nella risorsa finestra di dialogo, in questo caso il pulsante "Ok".

Altri suggerimenti

Usa WM_NEXTDLGCTL.

Reymond Chen "Come impostare lo stato attivo in una finestra box ":

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

Chiamando UpdateWindow, il pulsante è di essere ridisegnato prima del cambio di messa a fuoco può avere effetto. L'Invalidate dovrebbe essere sufficiente da sola, la finestra otterrà ridipinta quando tutto si sistema.

Sto seguendo il suggerimento di Joel. Ma un po 'diverso con l'API utilizzata in quel link, il mio unico è:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top