Compartir a través de


Ejemplo DLGCBR32: muestra cómo agregar una barra de estado y una barra de herramientas a cuadros de diálogo

Actualización: noviembre 2007

El ejemplo DLGCBR32 ilustra la forma de agregar una barra de estado y una barra de herramientas a un cuadro de diálogo. Además, muestra varias técnicas relacionadas con el uso de un cuadro de diálogo no modal como ventana principal de una aplicación MFC.

En una aplicación MFC puede agregar barras de controles, como barras de estado o barras de herramientas, a una ventana de marco. Sin embargo, para muchas aplicaciones es suficiente utilizar una interfaz de usuario basada en un cuadro de diálogo simple. MFC no proporciona compatibilidad integrada para agregar barras de controles a cuadros de diálogo.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo DLGCBR32

  1. Abra la solución Dlgcbr32.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

Para agregar una barra de controles a un cuadro de diálogo, cree la barra de controles de la manera habitual y haga sitio para ella en el área de cliente del cuadro de diálogo. Para que una barra de controles funcione correctamente, el cuadro de diálogo debe emular parte de la funcionalidad de una ventana de marco. Si desea utilizar controladores ON_UPDATE_COMMAND_UI para las barras de controles, también tiene que derivar nuevas clases de barra de controles y procesar el mensaje WM_IDLEUPDATECMDUI. Si el cuadro de diálogo no es la ventana principal de la aplicación, también tendrá que modificar su ventana de marco principal para pasar el mensaje WM_IDLEUPDATECMDUI a las barras de controles del cuadro de diálogo.

Para hacer sitio a una barra de controles en el área de cliente del cuadro de diálogo, siga los pasos siguientes en la función OnInitDialog del cuadro de diálogo:

  1. Cree las barras de controles. Calcule cuánto espacio necesitarán las barras de controles mediante la opción reposQuery de RepositionBars.

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. Mueva los controles del cuadro de diálogo para hacer sitio a las barras de controles en la parte superior o izquierda del área de cliente. Si el cuadro de diálogo contiene un menú, también tiene que tener en cuenta el espacio utilizado por el menú.

    CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                    rcClientNow.top - rcClientStart.top);
    CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);
    while (pwndChild)
        {
           pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild, FALSE);
           pwndChild = pwndChild->GetNextWindow();
        }
    
  3. Aumente las dimensiones de la ventana del cuadro de diálogo en la cantidad de espacio utilizadas por las barras de controles.

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. Coloque las barras de controles utilizando RepositionBars.

Para actualizar el primer panel de una barra de estado con texto de elementos de menú, debe controlar WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING y WM_POPMESSAGESTRING en la clase del cuadro de diálogo. Debe duplicar la funcionalidad de los controladores CFrameWnd para estos mensajes. En la clase CModelessMain del programa de ejemplo verá ejemplos de estos controladores de mensajes.

Para mostrar información sobre herramientas para los botones de la barra de herramientas tiene que procesar las notificaciones TTN_NEEDTEXTW y TTN_NEEDTEXTA.

Para permitir a los controladores ON_UPDATE_COMMAND_UI trabajar para otros paneles de barra de estado y para otros botones de barra de herramientas debe derivar las nuevas clases de barra de controles e implementar un controlador de mensajes para WM_IDLEUPDATECMDUI. Esto es necesario porque las implementaciones de la barra de controles predeterminada de OnUpdateCmdUI suponen que la ventana principal es la ventana de marco. Sin embargo, OnUpdateCmdUI no hace nada más que pasar el puntero de la ventana principal a una función que sólo requiere un puntero CCmdTarget. Por tanto, puede indicar temporalmente a OnUpdateCmdUI que el puntero de la ventana principal que ofrece es un puntero CFrameWnd para satisfacer los requisitos del compilador. Por ejemplo:

LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
   if (IsWindowVisible())
   {
      CFrameWnd* pParent = (CFrameWnd*)GetParent();
      if (pParent)
         OnUpdateCmdUI(pParent, (BOOL)wParam);
   }
   return OL;
}

Para pasar mensajes WM_IDLEUPDATECMDUI a los cuadros de diálogo que no sean la ventana principal, guarde punteros de cuadro de diálogo en la clase de la ventana de marco y cree un controlador WM_IDLEUPDATECMDUI en esa clase. El controlador debería enviar el mensaje WM_IDLEUPDATECMDUI a las ventanas secundarias mediante CWnd::SendMessageToDescendants. A continuación, realiza el procesamiento predeterminado para el mensaje en la ventana de marco.

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de MFC