Cambiar los estilos de una ventana creada por MFC
En su versión de la función WinMain
, MFC registra varias clases de ventana estándar automáticamente. Dado que normalmente no edita WinMain
de MFC, esa función no ofrece la oportunidad de cambiar los estilos de ventana predeterminados de MFC. En este artículo se explica cómo puede cambiar los estilos de una clase de ventana registrada previamente en una aplicación existente.
Cambiar estilos en una nueva aplicación MFC
Si usa Visual C++ 2.0 o posterior, puede cambiar los estilos de ventana predeterminados en el Asistente para aplicaciones al crear la aplicación. En la página Características de la interfaz de usuario del Asistente para aplicaciones, puede cambiar los estilos de la ventana de marco principal y las ventanas secundarias MDI. Para cualquier tipo de ventana, puede especificar su grosor de marco (grueso o fino) y cualquiera de las siguientes opciones:
Si la ventana tiene controles Minimizar o Maximizar.
Si la ventana aparece inicialmente minimizada, maximizada o ninguna de las dos.
Para las ventanas de marco principal, también puede especificar si la ventana tiene un menú del sistema. En el caso de las ventanas secundarias MDI, puede especificar si la ventana admite paneles divisores.
Cambiar estilos en una aplicación existente
Si va a cambiar los atributos de ventana en una aplicación existente, siga las instrucciones del resto de este artículo en su lugar.
Para cambiar los atributos de ventana predeterminados usados por una aplicación de marco creada con el Asistente para aplicaciones, invalide la función miembro virtual PreCreateWindow de la ventana. PreCreateWindow
permite que una aplicación tenga acceso al proceso de creación que normalmente administra internamente la clase CDocTemplate . El marco llama a PreCreateWindow
justo antes de crear la ventana. Al modificar la estructura CREATESTRUCT pasada a PreCreateWindow
, la aplicación puede cambiar los atributos usados para crear la ventana. Por ejemplo, para asegurarse de que una ventana no usa un título, use la siguiente operación bit a bit:
// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;
La aplicación de ejemplo CTRLBARS muestra esta técnica para cambiar los atributos de ventana. En función de lo que cambie la aplicación en PreCreateWindow
, puede que sea necesario llamar a la implementación de clase base de la función.
En la siguiente discusión se trata el caso de SDI y el caso de MDI.
El caso de SDI
En una sola aplicación de interfaz de documento (SDI), el estilo de ventana predeterminado en el marco es una combinación de los estilos WS_OVERLAPPEDWINDOW y FWS_ADDTOTITLE. FWS_ADDTOTITLE es un estilo específico de MFC que indica al marco que agregue el título del documento al título de la ventana. Para cambiar los atributos de la ventana en una aplicación SDI, invalide la función PreCreateWindow
de la clase derivada de CFrameWnd
(a la que el Asistente para aplicaciones denomina CMainFrame
). Por ejemplo:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Call the base-class version
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
// Create a window without min/max buttons or sizable border
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;
// Size the window to 1/3 screen size and center it
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;
return TRUE;
}
Este código crea una ventana de marco principal sin botones Minimizar y Maximizar y sin un borde ajustable. La ventana se centra inicialmente en la pantalla.
El caso de MDI
Se requiere un poco más de trabajo para cambiar el estilo de ventana de una ventana secundaria en una aplicación de interfaz de documento múltiple (MDI). De forma predeterminada, una aplicación MDI creada con el Asistente para aplicaciones usa la clase CMDIChildWnd predeterminada definida en MFC. Para cambiar el estilo de ventana de una ventana secundaria MDI, debe derivar una nueva clase de CMDIChildWnd
y reemplazar todas las referencias a CMDIChildWnd
en el proyecto por referencias a la nueva clase. Lo más probable es que la única referencia a CMDIChildWnd
en la aplicación se encuentre en la función miembro de la aplicación InitInstance
.
El estilo de ventana predeterminado usado en una aplicación MDI es una combinación de los estilos de WS_CHILD, WS_OVERLAPPEDWINDOW y FWS_ADDTOTITLE. Para cambiar los atributos de ventana de las ventanas secundarias de una aplicación MDI, reemplace la función PreCreateWindow en la clase derivada de CMDIChildWnd
. Por ejemplo:
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
Este código crea ventanas secundarias MDI sin un botón Maximizar.