如何在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的更多相关文章

  1. 【vue】如何在 Vue-cli 创建的项目中引入 iView

    根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save ...

  2. 【vue】如何在 Vue-cli 创建的项目中引入iView

    根据vue项目的搭建教程,一下记录下如何在Vue-cli创建的项目中引入iView. 1)安装iView,在项目下 cnpm install  iview  --save 2 ) 在 webpack ...

  3. 如何在Windows Server 2008 R2中更改桌面图标

    如何在Windows Server 2008 R2中更改桌面图标 Windows Server 2008 R2 已经在 MSDN 和 TechNet Plus 订阅上公布,gOxiA 在第一时间下载并 ...

  4. 在DevExpress程序中使用SplashScreenManager控件实现启动闪屏和等待信息窗口

    在我很早的WInform随笔<WinForm界面开发之"SplashScreen控件">有介绍如何使用闪屏的处理操作,不过那种是普通WInform和DevExpress ...

  5. MFC如何在有界面的应用程序中开启控制台窗口

    在有界面的应用程序中开启控制台窗口有时候非常有用,尤其是在调试多线程应用程序中,由于通过断点的方式调试程序时会导致线程挂起从而导致各种难于预料的结果.这时候就可以通过开启控制台窗口往窗口输出信息来查看 ...

  6. 如何在Hadoop的MapReduce程序中处理JSON文件

    简介: 最近在写MapReduce程序处理日志时,需要解析JSON配置文件,简化Java程序和处理逻辑.但是Hadoop本身似乎没有内置对JSON文件的解析功能,我们不得不求助于第三方JSON工具包. ...

  7. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  8. 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)

    前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...

  9. 阿里P7级教你如何在Spring Boot应用程序中使用Redis

    在Spring Boot应用程序中使用Redis缓存的步骤: 1.要获得Redis连接,我们可以使用Lettuce或Jedis客户端库,Spring Boot 2.0启动程序spring-boot-s ...

随机推荐

  1. 开发者需要知道的iOS 12

    总体概况 iOS 12总体来看是对现有iOS的一次改进,并没有太多突破性的功能或者框架,但是Apple在底层做了很多优化的工作,优化了性能,提供了更强大的安全性,增强了AR.Siri体验,让人工智能更 ...

  2. windows下线程库的使用

    下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可)   http://sourceware.org/pthreads-win32 ...

  3. Sublime Text 3 快捷键 一览

    Sublime Text 3 快捷键精华版 Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W ...

  4. MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  5. js算法-快速排序(Quicksort)

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...

  6. Oracle 事务处理

    事务的四大特性 1.原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的. 2.一致性(Consistency) 一致性是指数据库在事务操作前和事 ...

  7. centos、linux关机与重启命令详解

    Linux centos关机与重启命令详解与实战 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 1 ...

  8. dubbo用户指南-总结

    dubbo用户指南-总结 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用 ...

  9. SMM+maven下的log4j配置打印sql

    1加入依赖包 <!--LOG4日志 start --> <dependency> <groupId>org.slf4j</groupId> <ar ...

  10. spark学习13(spark RDD)

    RDD及其特点 1)RDD(Resillient Distributed Dataset)弹性分布式数据集,是spark提供的核心抽象.它代表一个不可变.可分区.里面的元素可并行计算的集合 2)RDD ...