win32 usar tutorial introduccion espaƱol ejemplos como winapi mfc

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)