MFC实现无标题栏的相对完美简易的方法
来源:互联网 发布:去黑头方法 知乎 编辑:程序博客网 时间:2024/06/05 19:32
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!
为什么说相对完美,嗯,因为如果想带有标题栏时,如果最大化时,标题栏显示的不太完整(在垂直方向上少一些)。
- MFC实现无标题栏的相对完美简易的方法
- MFC无标题栏对话框移动的处理方法
- MFC无标题栏窗口的移动
- 拖动无标题栏的对话框(MFC)
- MFC 无标题栏的窗口移动
- MFC中无标题栏窗口的移动
- MFC中无标题栏窗口的移动
- Android 中实现全屏,无标题栏的两种方法
- Android 全屏无标题栏的三种实现方法
- Android 全屏无标题栏的三种实现方法
- android 无标题栏的设置方法
- Android无标题栏全屏的三个方法
- 无标题栏窗口拖动的实现
- 无标题栏Form的拖动实现
- c# 实现无标题栏的窗体移动
- VC实现无标题栏对话框的拖动
- C#实现无标题栏窗体的拖动
- 实现无标题栏对话框的拖动
- 熬之滴水穿石:JAVA的世界(12)
- 第十次实验任务
- 怎样获取访问者真实IP地址
- 使用Visifire+ArcGIS API for Silverlight实现Graphic信息的动态图表显示
- prestashop代码分析之config.inc.php
- MFC实现无标题栏的相对完美简易的方法
- 【OpenStack】No module named XXX问题解决
- 销售模块的可用性检查
- 使用DataReader读取数据即查询所有学生
- 程序员必知的java的11个特性
- 关与unity3d激活问题
- 电视制式标准
- prestashop代码分析之init.php
- 我的学习生涯(Delphi篇) - 18