Cómo establecer el foco en un botón para que la frontera y se centran línea de puntos son visibles?

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

Pregunta

He creado una aplicación basada en diálogo sencillo, y en el defecto CDialog añadido tres botones (arrastrando y soltando ellos) usando el editor de Visual Studio.

El valor predeterminado botones Aceptar y Cancelar están allí también.

Quiero ajustar el enfoque al botón 1 cuando el botón 3 hago clic.

I establece la propiedad plana de cierto en las propiedades de los botones Muy.

I codificado esto:

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

    Invalidate();

}

Pero el boder en el botón 1 no se dibuja. El símbolo de intercalación (la línea de puntos que indica el foco), sólo se dibuja si lo presionaba TAB cualquier momento antes de hacer clic el botón 3.

Quiero el botón para mirar exactamente como se ve después de que haga clic en él. Mostrando la línea de puntos dentro del botón mediante programación, sería una ventaja.

Lo que quiero:

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

Lo que me sale:

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

¿Fue útil?

Solución 3

Esto dibuja el borde grueso alrededor del botón:

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

Una forma más elegante de hacer esto sería definir una variable miembro CButton en CbuttonfocusDlg y asociarla con el control IDC_BUTTON1, y luego llamando a

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

Esto hace que el botón al que estoy configurando el foco en el botón por defecto, pero tenga en cuenta que cuando el foco va a un control (dentro del diálogo) que no es un botón, el botón predeterminado es una vez más el botón de original predeterminado set en el recurso de diálogo, en este caso el botón "OK".

Otros consejos

Con WM_NEXTDLGCTL.

Reymond Chen de "cómo establecer el foco en un cuadro de diálogo cuadro ":

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

Al llamar UpdateWindow, el botón se están dibujando de nuevo antes de que el cambio de enfoque puede tener efecto. La invalidación debe ser suficiente por sí mismo, conseguirá repintado la ventana cuando todo se establece.

Estoy siguiendo la sugerencia de Joel. Pero ligeramente diferente con el API utilizado en ese enlace, mi es:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top