MFC多文档(MDI)去边框

来源:互联网 发布:乎的偏旁是什么 编辑:程序博客网 时间:2024/04/30 10:32
毕业设计还没做完,但是我的老毛病又犯了,为了一个小小的问题纠结了我很久,但是借着百度和google的风,我始终找不到答案,终于在一次意外的思考中解决了问题。
前几天开始写多文档的MFC程序,当然,一开始纠结下界面的东西也很正常,好了,我就想把mainframe完全去掉边框,首先去掉菜单,工具栏,很简单,百度一下,答案几乎都正确,只不过要注意多文档的去菜单,跟单文档不一样,主要是因为每一个view都可以使mainframe有不同菜单,何况默认情况下还有一个主菜单,所以需要在app和mainframe里面去掉菜单,直接setMemu(NULL);注意app里面不太一样
BOOL CWePingApp::InitInstance()
{
....
::AfxGetMainWnd()->SetMenu(NULL);
....
}

好了,但是你很快发现这样一点都不好看,再想方设法去掉childframe的菜单,view的菜单。或者用更简单的方法:

在CXXXApp的InitInstance()中的AddDocTemplate(pDocTemplate);
后面加上pDocTemplate->m_hMenuShared=NULL;
在CMainFrame中OnCreate,加个SetMenu(NULL);就可以了。

最后就成了一个很白的东西,但是仍有影响美观的边框效果,经过查文档和百度,知道去掉一个CWnd的边框,可以设风格,可以有两种做法:

第一,在PreCreateWindow重载中对CREATESTRUCT& cs折腾,主要是折腾dwExStyle和style,一个是扩展风格,一个本来的风格,
第二,是同过ModifyStyleEx和ModifyStyle,类似上面,查了文档才知道也调用了SetWindowsLong函数,当然,我们不用那么麻烦,直接把风格传给这两个函数就行,注意在Oncreate里面使用


那么要设置哪些风格,经过我研究,设置下面风格即可,虽然有些累赘,
WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE,扩展风格
WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU 原来风格




好了,我采用第二种,还特意写了个宏,容易看些。
#define DELETE_BORDER_HWND(pCWndClass) \
{\
pCWndClass->ModifyStyleEx(WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE,0,SWP_DRAWFRAME);\
pCWndClass->ModifyStyle(WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU , 0, SWP_DRAWFRAME);\
}
#define DELETE_BORDER_CS(cs) \
{\
cs.dwExStyle &= ~(WS_EX_CLIENTEDGE|WS_EX_WINDOWEDGE|WS_EX_STATICEDGE);\
cs.style &= ~(WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_SYSMENU);\
}


如果你也百度过很多地方,就可以知道,要使mainframe,childframe,和view的边框完全没有的话,需要在这个三个类的Oncreate或者PreCreateWindow去掉这些风格,这样你马上可以得到一个比较完美的去边框效果,这里说完美,主要是因为细心的人就会发现,其实主边框还有一个框框消除不了,好了,耐心的同学就试了一次风格又风格,激进的同学就去搜怎么重绘非客户区,然后走别的通道,但是还有一种同学是,想知道为什么还会有边框出现,当然好的容易的解决办法往往就在这里出现。


好了,本来想让那边框变得明显些,然后证明我不是眼花,所以我打算重载绘画函数,去掉背景重绘,但是结果我失败了,背景完全去不掉呀,这不可能吧,在经过一轮百度和迷茫,我查到了mainframe有m_hWndMDIClient这么一个成员,从名字看,我们知道我们找到了嫌疑犯,就是他遮盖了我们的客户区,导致我们重绘不了背景的。那么纠结于不能重绘背景已经没意义了,回到最初目的,除掉边框,如果说这个CWnd挡住背景,那他的边框肯定也污染我们的客户区,用宏改掉它的习气。Bingo!我们得到完美的去边框!




当然,这里没有对SDI进行解释,但是从这里你完全可以自己去解决这些问题。希望这篇东西可以减少你百度的时间,但我花了两天时间去百度。
原创粉丝点击