winapi - usar - Deshacerse de la apariencia 3D de la ventana de marco MDI
winapi tutorial (2)
Este CMDIChildWnd::UpdateClientEdge()
, de acuerdo con mi búsqueda a través del directorio de origen de MFC, solo se llama desde tres lugares:
- CMDIChildWnd :: OnMDIActivate ()
- CMDIChildWnd :: OnWindowPosChanging ()
- CMDIChildWnd :: OnDestroy ()
Los tres son manejadores de los mensajes de Windows WM_MDIACTIVATE
, WM_WINDOWPOSCHANGING
y WM_DESTROY
. CMDIChildWnd::UpdateClientEdge()
controladores para estos mensajes y clonaría el código MFC menos la llamada a CMDIChildWnd::UpdateClientEdge()
.
Estoy de acuerdo, es feo, pero no más que forzar ese estilo WS_EX_CLIENTEDGE
en las personas ...
Tengo una aplicación MDI MFC y me gustaría deshacerme de la apariencia 3D (ahora algo obsoleta).
Aspecto 3d original:
El aspecto que quiero:
Pude hacer esto al sobrecargar el método virtual CMDIFrameWnd::CreateClient
de mi clase CMDIFrameWnd derivada y reemplazar dwExStyle = WS_EX_CLIENTEDGE;
con dwExStyle = 0;
en algún momento.
Esto funciona, pero cada vez que la ventana del documento pasa del estado maximizado al estado embaldosado y en algunas otras ocasiones, se llama a la función CMDIChildWnd::UpdateClientEdge
y esa función modifica el estilo de nuevo a WS_EX_CLIENTEDGE
volviendo así al rectángulo 3D. Lamentablemente, el método UpdateClientEdge
no es virtual, por lo tanto, si lo sobrecarga, se llama al CMDIChildWnd::UpdateClientEdge
original en lugar de a mi CMyMDICHildWnd::UpdateClientEdge
sobrecargado.
Las CMDIChildWnd::UpdateClientEdng
y CMDIChildWnd::CreateClient
se encuentran en winmdi.cpp.
Así que estoy atrapado aquí. ¿Alguien tiene una idea de cómo se podría lograr esto?
UpdateClientEdge
contiene el siguiente código:
BOOL bIsTabbedMDIChild = pChild != NULL && pChild->IsTabbedMDIChild();
if ((pChild == NULL || pChild == this) && !bIsTabbedMDIChild)
{
//change the border
}
IsTabbedMDIChild
es virtual, por lo que se devuelve TRUE
para IsTabbedMDIChild
para engañar a UpdateClientEdge
y evitar que realice cambios.
BOOL CMyMDIChildWnd::IsTabbedMDIChild() { return TRUE; }
(Hasta donde puedo decir que IsTabbedMDIChild
no se usa en ningún otro lado)