【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS
如何在MFC创建的程序中更改主窗口的属性
摘自:http://blog.sina.com.cn/s/blog_4bebc4830100aq1m.html
在MFC创建的单文档界面中:
(基于对话框的,直接在对话框的类向导中的虚函数里边添加PreCreateWindow函数,但是实际上有没有用就没有试过。望试验的告知,谢谢。)
在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中添加下面的代码可以固定窗口大小
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX;// | WS_THICKFRAME;
cs.style &= ~WS_BORDER;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
int iWinBorderX = GetSystemMetrics(SM_CXBORDER);
int iWinBorderY = GetSystemMetrics(SM_CYBORDER);
int iCaptionY = GetSystemMetrics(SM_CYCAPTION);
int iMenuY = GetSystemMetrics(SM_CYMENU);
int iStausY = GetSystemMetrics(SM_CYMENU);
cs.cx = 510 + iWinBorderX ;
cs.cy = 530 + iWinBorderY + iCaptionY + iStausY + iMenuY;
在上面的代码中:
前三行确定窗口风格。“|”表示添加风格,“&~”表示去掉风格。四到八行用函数GetSystemMetrics获取一些系统数据,以像素为单位。最后计算窗口的宽和高。
style:
WS_OVERLAPPED 有标题
WS_SYSMENU 有系统菜单:最小化、最大化和关闭
WS_MINIMIZEBOX 可以最小化窗口
WS_THICKFRAME 可以拖动改变窗口大小
WS_BORDER 带黑色边框
WS_MAXIMIZEBOX 可以最大化窗口
dwExStyle:
WS_EX_CLIENTEDGE 扩展属性,带阴影边框
GetSystemMetrics参数:
SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。
SM_CXBORDER、SM_CYBORDER 返回以像素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则等同于SM_CXEDGE参数
SM_CXCURSOR、SM_CYCURSOR 返回以像素值为单位的标准光标的宽度和高度
SM_CXDLGFRAME、SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
SM_CXDOUBLECLK、SM_CYDOUBLECLK 以像素值为单位的双击有效的矩形区域
SM_CXEDGE、SM_CYEDGE 以像素值为单位的3D边框的宽度和高度
SM_CXFIXEDFRAME、SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
SM_CXFRAME、SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
SM_CXFULLSCREEN、SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
SM_CXHSCROLL、SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
SM_CXHTHUMB 以像素为单位的水平滚动条上的滑动块宽度
SM_CXICON、SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
SM_CXICONSPACING、SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
SM_CXMAXIMIZED、SM_CYMAXIMIZED 处于顶层的最大化窗口的缺省尺寸
SM_CXMAXTRACK、SM_CYMAXTRACK 具有可改变尺寸边框和标题栏的窗口的缺省最大尺寸,如果窗口大于这个尺寸,窗口是不可移动的。
SM_CXMENUCHECK、SM_CYMENUCHECK 以像素为单位计算的菜单选中标记位图的尺寸
SM_CXMENUSIZE、SM_CYMENUSIZE 以像素计算的菜单栏按钮的尺寸
SM_CXMIN、SM_CYMIN 窗口所能达到的最小尺寸
SM_CXMINIMIZED、SM_CYMINIMIZED 正常的最小化窗口的尺寸
SM_CXMINTRACK、SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
SM_CXSCREEN、SM_CYSCREEN 以像素为单位计算的屏幕尺寸。
SM_CXSIZE、SM_CYSIZE 以像素计算的标题栏按钮的尺寸
SM_CXSIZEFRAME、SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
SM_CXSMICON、SM_CYSMICON 以像素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
SM_CXVSCROLL、SM_CYVSCROLL 以像素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
SM_CYCAPTION 以像素计算的普通窗口标题的高度
SM_CYMENU 以像素计算的单个菜单条的高度
SM_CYSMCAPTION 以像素计算的窗口小标题栏的高度
SM_CYVTHUMB 以像素计算的垂直滚动条中滚动块的高度
SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。
父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响
摘自:http://www.cppblog.com/zaccheo/articles/180331.html
写了下面的程序,测试下父窗口设置 WS_CLIPCHILDREN 前后,对父窗口调用 RedrawWindow 或 InvalidateRect 对子窗口刷新造成的影响
|
操作 |
有WS_CLIPCHILDREN |
无WS_CLIPCHILDREN |
|
InvalidateRect |
父窗口的无效区域增加 对子窗口无影响 |
父窗口的无效区域增加 子窗口的无效区域增加 且无效区域坐标相同(屏幕坐标系下) |
|
RedrawWindow FLAG: RDW_INVALIDATE |
父窗口的无效区域增加 对子窗口无影响 |
父窗口的无效区域增加 子窗口的无效区域增加 且无效区域坐标相同(屏幕坐标系下) |
|
RedrawWindow FLAG: RDW_INVALIDATE|RDW_ALLCHILDREN |
父窗口的无效区域增加 子窗口的无效区域增加 且无效区域坐标相同(屏幕坐标系下) |
父窗口的无效区域增加 子窗口的无效区域增加 且无效区域坐标相同(屏幕坐标系下) |
|
RedrawWindow FLAG: RDW_INVALIDATE|RDW_NOCHILDREN |
父窗口的无效区域增加 对子窗口无影响 |
父窗口的无效区域增加 对子窗口无影响 |
|
其他窗口在父子窗口上移动 |
父窗口会接收到WM_PAINT消息,但是无效区域是 父窗口 排除子窗口后的区域和 其他当前移动的窗口区域的交集 子窗口会接收到wm_paint消息,无效区域是 子窗口和当前移动的窗口的区域的交集 |
父窗口会接收到WM_PAINT消息,但是无效区域是 父窗口当前移动的窗口区域的交集 子窗口会接收到wm_paint消息,无效区域是 子窗口和当前移动的窗口的区域的交集 |
窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS
摘自: http://www.cnblogs.com/gleam/archive/2012/11/26/2789513.html
WS_CLIPCHILDREN,使得父窗体在绘制时留出其上的子窗体的位置不去画它,而那片区域留着子窗体去画。
WS_CLIPSIBLINGS,必须用于子窗体,使得该子窗体在收到WM_PAINT时同时令其共父的诸多子窗体(MSDN讲必须不在该区域,即不与之重叠)也会被PAINT。
//下面也是对WS_CLIPSIBLINGS的理解
所有的overlapped窗口和popup窗口,都有WS_CLIPSIBLINGS 属性,
这些窗口不能在它的sibling窗口上绘图
对于child窗口,如果没有这个属性,它能在它的sibling窗口上绘图
┌────────┐
│ A │
│ │
│ ┌─────┼───┐
│ │ C │ │
│ │ │ │
└──┼─────┘ │
│ │
│ B │
└──────────┘
如果A, B都是child窗口,
如果A具有WS_CLIPSIBLINGS属性,
那么A重绘时不会重绘C部分
clip是裁减,去除的意思 相当与英文的Exclude
WS_CLIPCHILDREN和WS_CLIPSIBLING都是为了减少重画,减少闪动,保证窗口的重叠部分只有一个窗口来实现PAINT。
【MFC】如何在MFC创建的程序中更改主窗口的属性 与 父窗口 WS_CLIPCHILDREN 样式 对子窗口刷新的影响 与 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS的更多相关文章
- 【vue】如何在 Vue-cli 创建的项目中引入 iView
根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install iview --save ...
- 【vue】如何在 Vue-cli 创建的项目中引入iView
根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install iview --save 2 ) 在 webpack ...
- 如何在Windows Server 2008 R2中更改桌面图标
如何在Windows Server 2008 R2中更改桌面图标 Windows Server 2008 R2 已经在 MSDN 和 TechNet Plus 订阅上公布,gOxiA 在第一时间下载并 ...
- 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口
在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...
- MFC如何在有界面的应用程序中开启控制台窗口
在有界面的应用程序中开启控制台窗口有时候非常有用,尤其是在调试多线程应用程序中,由于通过断点的方式调试程序时会导致线程挂起从而导致各种难于预料的结果.这时候就可以通过开启控制台窗口往窗口输出信息来查看 ...
- 如何在Hadoop的MapReduce程序中处理JSON文件
简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)
前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...
- 阿里P7级教你如何在Spring Boot应用程序中使用Redis
在Spring Boot应用程序中使用Redis缓存的步骤: 1.要获得Redis连接,我们可以使用Lettuce或Jedis客户端库,Spring Boot 2.0启动程序spring-boot-s ...
随机推荐
- HBase在数据统计应用中的使用心得
转载自:http://www.cnblogs.com/panfeng412/archive/2011/11/19/2254921.html 1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用 ...
- Linux 进程管理 kill、killall、pkill命令
Linux常用信号(进程间通信) 系统中可以识别的信号较多,我们可以使用命令"kill -l"或"man 7 signal"来查询.命令如下: [root@lo ...
- linux中的信号简介和trap命令
1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...
- 在非小细胞肺癌中,MET基因的14号外显子突变和年龄,依赖于癌症阶段的CNV,C-MET过表达的关系
背景:c-MET是肝细胞生长因子的酪氨酸激酶受体.MET 14号外显子编码部分c-MET的胞内跨膜结构域,包括重要的调节原件,比如酪氨酸1003,一个降解c-MET的相关酶的结合位点. 拥有MET 1 ...
- Secondary ,Supplementary alignment 和bwa mem的-M -Y参数
1.supplementary alignment supplementary alignment是指一条read的一部分和参考区域1比对成功,另一部分和参考区域2比对成功,参考区域1和参考区域2没有 ...
- 关于Simplicity Studio使用math.h编译出错
原因是未调用C标准库. 解决方法: 1.点项目右键——>properties——>C/C++Build——>Settings——>GNU ARM C Linker——>L ...
- React Native 网络请求封装:使用Promise封装fetch请求
最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...
- Linux下Wireshark的网络抓包使用方法
Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与很多其他网络工具一样,Wireshark也使用pcap network ...
- EF Code-First 学习之旅 EntityTypeConfiguration<TEntity>
之前我们配置的实体都都在OnModelCreating方法中,如果有很多实体的话,OnModelCreating方法管理很麻烦 我们可以用单独的类来管理配置,继承EntityTypeConfigura ...
- HDU 1159 Common Subsequence 动态规划
2017-08-06 15:41:04 writer:pprp 刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正) 题意如下: 给两个字符串,找到其中 ...