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)