He creado una sencilla aplicación basada en el diálogo, y en el valor predeterminado de CDialog añadido tres botones (arrastrando y soltando) utilizando el editor de Visual Studio.

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

Quiero para establecer el foco en el botón 1, cuando hago clic en el botón 3.

Me establezca la propiedad Plana a la verdad en las propiedades de muy botones.

Me codificado esto:

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

    Invalidate();

}

Pero la frontera en button1 nunca está dibujado. El símbolo de intercalación (la línea de puntos indica foco) sólo se dibujan si me presiona TAB cualquier momento antes de hacer clic en el botón 3.

Quiero que el botón para ver exactamente como se ve después de hacer clic en él. Mostrando la línea de puntos en el botón en forma programada, sería un plus.

Lo que quiero:

Cómo SetFocus para un CButton de forma que el borde y el enfoque de línea de puntos son visibles?

Lo que me pasa:

Cómo SetFocus para un CButton de forma que el borde y el enfoque de línea de puntos son visibles?

  • Sólo traté de duplicar la aplicación de prueba en VC6 y XP funciona correctamente, aunque el valor predeterminado borde del botón se alterna entre setfocus y ACEPTAR.
InformationsquelleAutor rec | 2008-12-15

4 Comentarios

  1. 4

    Uso WM_NEXTDLGCTL.

    Ver Reymond Chen «Cómo establecer el foco en un cuadro de diálogo»:

    void SetDialogFocus(HWND hdlg, HWND hwndControl)
    {
        SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
    }
    • +1. El OP está haciendo la pregunta equivocada, causada por un malentendido de cómo diálogos de trabajo. OP, por favor, tenga cuidado de que el comportamiento de implementar de la siguiente manera «normal» de la ventana de interfaz de usuario de las reglas por defecto de los botones, etc. (es decir, que presionando entrar después de abrir el cuadro de diálogo hace algo intuitivo).
  2. 0

    Llamando UpdateWindow, el botón se vuelve a dibujar antes de que el cambio de foco puede tomar efecto. La Invalidar debería ser suficiente por sí misma, la ventana obtendrá repintado cuando todo se calma.

    • Ok, he quitado UpdateWindow, mi problema original stil persiste.
  3. 0

    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 un CButton miembro de la variable en CbuttonfocusDlg y asociarla a la IDC_BUTTON1 de control y, a continuación, llamar a

    this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

    Esto hace que el botón en el que estoy de poner el foco en el botón predeterminado, pero tenga en cuenta que cuando el foco va a un control (en el interior del cuadro de diálogo) que no es un botón, el botón predeterminado es, una vez más, el original juego de botones en el cuadro de diálogo de recursos, en este caso el botón «Aceptar».

    • Aha, no he entendido la pregunta! Lo siento, no podría haber llegado con esta respuesta de ayer. Mantiene enfatizando la palabra «enfoque», y la línea punteada es el oficial del indicador de enfoque.
  4. 0

    Estoy siguiendo Joel sugerencia. Pero un poco diferente con la API utilizada en ese vínculo, a mi es :

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

Dejar respuesta

Please enter your comment!
Please enter your name here