Winapi 摆脱MDI框架窗口的3d外观
我有一个MFC MDI应用程序,我想摆脱(现在有些过时)3d外观 原始3d外观: 我想要的外观: 我通过重载我的CMDIFrameWnd派生类的Winapi 摆脱MDI框架窗口的3d外观,winapi,mfc,Winapi,Mfc,我有一个MFC MDI应用程序,我想摆脱(现在有些过时)3d外观 原始3d外观: 我想要的外观: 我通过重载我的CMDIFrameWnd派生类的CMDIFrameWnd::CreateClientvirtual方法并替换dwExStyle=WS_EX_CLIENTEDGE与dwExStyle=0在某个点 这是可行的,但每次文档窗口从最大化状态转到平铺状态以及其他一些情况下,都会调用CMDIChildWnd::UpdateClientEdge函数,该函数会将样式修改回WS_EX_CLIENTE
CMDIFrameWnd::CreateClient
virtual方法并替换dwExStyle=WS_EX_CLIENTEDGE代码>与dwExStyle=0代码>在某个点
这是可行的,但每次文档窗口从最大化状态转到平铺状态以及其他一些情况下,都会调用CMDIChildWnd::UpdateClientEdge
函数,该函数会将样式修改回WS_EX_CLIENTEDGE
,从而恢复到三维矩形。不幸的是,UpdateClientEdge
方法不是虚拟的,因此如果我重载它,将调用原始的CMDIChildWnd::UpdateClientEdge
,而不是重载的cmymidhildwnd::UpdateClientEdge
CMDIChildWnd::UpdateClientEdng
和CMDIChildWnd::CreateClient
函数都位于winmdi.cpp中
所以我被困在这里了。有人知道如何实现这一点吗?根据我在MFC源目录中的搜索,此CMDIChildWnd::UpdateClientEdge()
,仅从三个位置调用:
- CMDIChildWnd::OnMDIActivate()
- CMDIChildWnd::onWindowPosChangeing()
- CMDIChildWnd::OnDestroy()
这三个都是Windows消息的处理程序WM\u mdiactive
,WM\u WINDOWPOSCHANGING
和WM\u DESTROY
。我将为这些消息创建处理程序,并克隆MFC代码,减去对CMDIChildWnd::UpdateClientEdge()的调用
我同意,这很难看,但将这种WS_EX_CLIENTEDGE
风格强加于人…UpdateClientEdge
包含以下代码:
BOOL bIsTabbedMDIChild = pChild != NULL && pChild->IsTabbedMDIChild();
if ((pChild == NULL || pChild == this) && !bIsTabbedMDIChild)
{
//change the border
}
istabeddmichild
是虚拟的,因此您可以为istabeddmichild
返回TRUE
以愚弄UpdateClientEdge
并阻止它进行更改
BOOL CMyMDIChildWnd::IsTabbedMDIChild() { return TRUE; }
(据我所知,istabbedmichild
在其他任何地方都没有使用过)也想过类似的事情,真的很难看。MFC应该为选择这些东西提供适当的功能。也许他们会在一两年内想出这个办法;-)。我比我更喜欢这个答案:)我也找不到任何关于那个神秘的istabbedmichild
的参考,除了UpdateClientEdge
++8小时后,谷歌仍然没有返回任何关于istabbedmichild
;-)Hack'ish,但整洁。实际上重写istabeddmichild
是不够的,因为CMDIChildWnd::UpdateClientEdge
也是从CMDIChildWnd::OnDestroy()
调用的,因为没有更多的子窗口,如果((pChild==NULL | pChild==this),则中的bistabbeddmichild
的计算&&!bistabbedmdhild)
短路。因此,必须在CMyMDIChildWnd
和CFrameWnd::ondstroy()中实现一个ON_WM_DESTROY()
处理程序应该在那里调用code>,而不是CMDIChildWnd::OnDestroy()代码>。