您的位置:首页 > 其它

MFC实现无标题栏的相对完美简易的方法

2013-06-07 08:30 169 查看
1、
修改窗口风格,去掉WM_SYSMENU风格。(MFC主窗口默认WS_OVERLAPPEDNWINDW风格,带有WS_THICKFRAME,这个风格很重要,如果没有,系统不会为你实现可以改变窗口大小的功能,需要自己实现,所以如果没有这个风格要设置。)
ModifyStyle(/*WS_BORDER | WS_THICKFRAME*/WS_SYSMENU, 0);
2、
处理WM_NCCALCSIZE消息:
3、 lpncsp->rgrc[0].top +=
GNOMECAPTION_HEIGHT -
m_rcBorders.top;
4、 lpncsp->rgrc[0].left += 6 -
m_rcBorders.left;
5、 lpncsp->rgrc[0].right -= 6 -
m_rcBorders.right + 1;
6、 lpncsp->rgrc[0].bottom -= 6 -
m_rcBorders.bottom + 1;
7、
8、 //CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
不要调用基类OnNcCalcSize函数,否则会混乱。
3、处理WM_NCPAINT消息,画自己的非客户区:
CWindowDC
dcWindow(this);
CRect
rc;
GetWindowRect(&rc);
CRect
rcClient;
GetClientRect(&rcClient);
ClientToScreen(&rcClient);

rcClient.OffsetRect(-rc.TopLeft());
rc.OffsetRect(-rc.TopLeft());

CRgn
rgnClient;
rgnClient.CreateRectRgnIndirect(rcClient);

CRgn
rgnWindow;
rgnWindow.CreateRoundRectRgn(rc.left,
rc.top,
rc.right, rc.bottom, 11, 11);

dcWindow.SelectClipRgn(&rgnWindow);
dcWindow.SelectClipRgn(&rgnClient,
RGN_XOR );
//画出非客户区即可。
4、特别重要的一步,处理WM_NCACTIVE消息,告诉系统,我们已经处理了,不需要系统再处理(否则系统将再会绘制出标题栏和外边框)

在消息中返回非0值即可。
5、All done!
为什么说相对完美,嗯,因为如果想带有标题栏时,如果最大化时,标题栏显示的不太完整(在垂直方向上少一些)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: