微信号:cpp_coder

介绍:最专业的C/C++编程学习和程序员发展的综合平台.提供C/C++、汇编语言等、STL、MFC、QT等等学习、数据结构算法思维分析、各领域项目经验分享、资源下载、招聘和资讯的综合服务.

Windows零基础入门:2.18 窗口类结构体之窗口类风格-水平重绘和垂直重绘

2015-09-12 00:36 CPP技术网

本节详细讲解了屏幕的物理刷新,然后介绍了什么是重绘,什么是垂直重绘和水平重绘。以及解释重绘和屏幕物理刷新的原理流程。并用一个窗口来验证只有垂直重绘而没有水平重绘的效果。

在上一节《Windows零基础入门:2.17 窗口类结构体之位或组合和位与去除窗口类风格》中,我们已经详细介绍了窗口类结构体第一个成员style如何赋值操作等详细深入的分析,对于使用上,你已经不是入门水平了。当然,你必须消化掉。如果有问题,请在文章后面留言。
那么本节课,我们就来讲讲窗口类风格这个成员的故事。讲完之后,我们再来介绍各种窗口类风格的具体的情况。
那么我们先要知道,什么是窗口类风格?既然是说的窗口类,就是指一类窗口,哪一类呢?就是用这个窗口类创建的所有窗口,这些窗口就叫做一类。那么就是说, 窗口类的风格,必将会作用于使用它创建的所有窗口。你可以将窗口类风格理解为最基础的样式或者窗口特性。窗口风格特性只是窗口的特性的一种而已。对于所有 窗口都适用而且还不必定制的地方,就都提取到了窗口类风格里了。这样,你不必在创建窗口时每次都指定一个不需要定制的样式。否则开发效率就变低了。
而创建窗口的时候,你又想稍微定制一下样式,比如窗口大小,窗口的位置等,这些窗口的样式,可以让你的窗口有不同的外表。然而,更加基本的特性,就不在创 建窗口时给定,因为这是通用性的特性,或者说是很少使用或者必不可少的特性,那么这些特性,都在窗口类风格里面。比如水平拉大窗口,窗口会重绘。这种特 性,基本上大多数的窗口都需要。所以,你不必经常去处理这些,就只要在窗口类风格设置好,以后创建一千个一万个窗口,都不用管了。
窗口类风格英文为Class Style,缩写成标识符则是CS_,所以,你看到CS_开头的这些都是窗口类风格。而对应的窗口类风格的英文为Windows Style,缩写标志位WS_,那么你看到的这种开头标志,则都可以用来设置窗口的风格。
那么说到这里,前面提到的疑问,就比较清楚了。窗口类风格是用来设置一类窗口的基本特性的,而窗口风格则只设置一个窗口的特定样式。他们都要设置,否则系统不知道你想要什么样的窗口。两者是不重复的,前者站的更高作用更广,后者只局限于自己一个。
对于窗口类风格,其实不多,只有12种,而窗口风格则有很多。窗口类风格就像一个衣服的款式,比如只有2-3种,而窗口风格就可以是衣服的尺寸、颜色衍生出各种各样的样式。款式就是一类衣服,最终形成一种,就要将尺寸和颜色等加进去,才能形成具体的一件衣服。
所以说,窗口类风格基础而重要,窗口风格则形象而具体。下面来具体的讲讲具体的窗口类的所有取值的知识。
我根据使用频率来先后讲述。


1.垂直重绘CS_VREDRAW(0x1) 和 水平重绘CS_HREDRAW(0x2)
什么叫做重绘?什么又叫做垂直重绘和水平重绘?这是我们需要首先了解的问题。
我们看到的电脑屏幕,时时刻刻都在不停的显示亮点,然后亮点熄灭,然后又重新显示,这样我们可以看到屏幕一直亮着。这是物理是的屏幕刷新。以前的阴极射线 管式的大屁股电视机,就是使用电子枪不停的扫射屏幕。然后你可以看到画面。你会不会问,为什么不一直显示呢?其实不是不可以,但是却没有意义,成本太大 了。
如果要一直显示,也就是让屏幕上所有的地方都亮着,根据不同的亮暗显示不同的亮度。那么你可以根据屏幕上有多少个显示单元,就设计多少个显示的通路。比如 电子枪,那么就是要聚集大量的电子枪,每一个电子枪只射到一个点,这个电子枪一直保持发射电子,那么如此下来,成本要多高呀。况且还没有必要。
因为根据人类眼睛有视觉残留的特性,只要亮度显示间隔时间不太长,人类眼睛认为就是一直是亮的。所以,基于这个技术,屏幕就只需要一个电子枪,隔一段时间 就从头到尾扫一遍,把该点亮的位置点亮,因为扫描速度实在是快,人眼根本感觉不到屏幕的变化。这就是屏幕刷新频率的技术参数的背景知识。
而在我们的Windows的重绘,是不是也是屏幕刷新呢?当然不是。哈哈哈,是不是有种被骗的感觉。但是呢,两者的道理想通的。因为我们的窗口被操作之 后,会有不同的效果。比如画图板里,选择画笔工具,然后划过的位置就应该产生应有的痕迹。如果窗口不重绘,那么这些变化就不能更新显示出来,你就不知道绘 画的效果。而真正的更新,则是系统将重绘的命令发给显卡,显卡再输出,就得到新的画面。重绘就是重新绘制的意思。重绘就是让界面和状态保持最新的。而重绘 的实现,要基于前面提到的物理的刷新屏幕。不过这些都是操作系统来完成的。我们只要处理重绘的消息WM_PAINT即可将重绘时要绘制的画面数据提交给操 作系统,操作系统再将这些数据处理后,写进显卡,显卡就读取这些数据,依次显示。
而我们这里设置的垂直重绘和水平重绘,就是让这个窗口能够产生窗口的客户区大小变化或者位置移动时的整个窗口的重绘消息。如果不使用这个窗口类风格,窗口 根本就接受不到这类消息,那么你拖大窗口后是没有重绘的。这里相当于一个开关。而在水平方向上改变客户区的位置或者宽度,则会产生重绘消息。垂直同理。这 个风格是给操作系统来识别的,告诉系统说,我设置了窗口类风格,你操作系统在我窗口有拖动等的时候,就可以给我窗口发送窗口重绘消息了。如果我不设置,即 使我拖动了,操作系统你哪边凉快哪边呆去。
客户区就是窗口中除了标题栏、状态栏工具栏和边框的窗口中间的区域。客户区的大小和位置的改变,都是相对于窗口来说的,不是相对于屏幕哦。所以,你在移动窗口的位置的时候,是不会产生窗口重绘的,但是你调整窗口的大小时就会产生重绘。至于客户区的位置,当客户区铺满的时候,感觉不出来。这个在后面的窗口部分再细讲。
例如,如下图所示:

这个窗口,我在窗口重绘消息WM_PAINT中设置文字始终显示在当前窗口的正中间,水平和垂直都是中间。如果你只使用垂直重绘风格时,那么你在横向拉宽 窗口时,那么文字就不再自动调整到水平的中心了。因为此时窗口不接收窗口重绘消息WM_PAINT。而在垂直方向上拉大窗口,文字会自动变到中心。因为它 接受了重绘消息。

所以你看到了左边图水平和垂直都是居中的,而右边的图,则垂直方向上是居中的,而水平上因为没有自动调整,因为没有重绘,所以就被边框遮盖了。


 
CPP技术网 更多文章 宏、常量、枚举、结构体和共用体对比分析之常量 宏、常量、枚举、结构体和共用体对比分析之结构体 C/C++声明定义初始化和赋值独家剖析深刻理解 mfc的消息机制,多窗口的互动 MFC中的窗口类:C++类与窗口句柄的结合深入浅出分析
猜您喜欢 Learn C The Hard Way示例代码 自信,人生的支点 Google-LevelDB简介 数据挖掘领域最有影响力的18个算法 Java程序员必知的8大排序