MFC实现无标题栏的相对完美简易的方法
2013-06-07 08:30
169 查看
1、
修改窗口风格,去掉WM_SYSMENU风格。(MFC主窗口默认WS_OVERLAPPEDNWINDW风格,带有WS_THICKFRAME,这个风格很重要,如果没有,系统不会为你实现可以改变窗口大小的功能,需要自己实现,所以如果没有这个风格要设置。)
2、
处理WM_NCCALCSIZE消息:
不要调用基类OnNcCalcSize函数,否则会混乱。
3、处理WM_NCPAINT消息,画自己的非客户区:
4、特别重要的一步,处理WM_NCACTIVE消息,告诉系统,我们已经处理了,不需要系统再处理(否则系统将再会绘制出标题栏和外边框)
在消息中返回非0值即可。
5、All done!
为什么说相对完美,嗯,因为如果想带有标题栏时,如果最大化时,标题栏显示的不太完整(在垂直方向上少一些)。
修改窗口风格,去掉WM_SYSMENU风格。(MFC主窗口默认WS_OVERLAPPEDNWINDW风格,带有WS_THICKFRAME,这个风格很重要,如果没有,系统不会为你实现可以改变窗口大小的功能,需要自己实现,所以如果没有这个风格要设置。)
ModifyStyle(/*WS_BORDER | WS_THICKFRAME*/WS_SYSMENU, 0); |
处理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); |
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 ); //画出非客户区即可。 |
在消息中返回非0值即可。
5、All done!
为什么说相对完美,嗯,因为如果想带有标题栏时,如果最大化时,标题栏显示的不太完整(在垂直方向上少一些)。
相关文章推荐
- javascript完美实现给定日期返回上月日期的方法
- 禁止窗口移动----API及MFC实现方法及原理
- 修改MFC主窗口界面标题和图标的方法
- JS实现简易图片轮播效果的方法
- Python使用ftplib实现简易FTP客户端的方法
- 在MFC中显示Jpg格式图片的简单实现方法
- MFC--快捷键(组合键/热键)与按钮实现操作按钮的方法
- 在DELPHI中实现无标题窗体的移动最简单的方法
- lua实现split的简易方法
- javascript完美拖拽的实现方法
- 按寻路路径连续移动(方法2)相对完美
- DIV相对于父DIV底部对齐的实现方法
- dedecms标题过长,截断标题加省略号的三种实现方法
- php实现的网络相册图片防盗链完美破解方法
- 完美实现wordpress禁止文章修订和自动保存的方法
- 关于Page_ClientValidate方法,完美实现验证控件成功后confirm确认效果
- 两种方法实现MFC 对话框最大化时控件也随比例最大化或者还原
- 修改MFC主窗口界面标题和图标的方法
- jQuery实现获取h1-h6标题元素值的方法
- javascript文字跟随鼠标移动简易实现方法