Winapi 摆脱MDI框架窗口的3d外观

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

我有一个MFC MDI应用程序,我想摆脱(现在有些过时)3d外观

原始3d外观:

我想要的外观:

我通过重载我的CMDIFrameWnd派生类的
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()
处理程序,而不是
CMDIChildWnd::OnDestroy()