摘要: 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE. 当WM_PAINT由InvalidateRect产生时,先发送WM_PAINT消息(异步),如果InvalidateRect的bErase为 TRUE,Beg 阅读全文
posted @ 2013-04-17 15:34 归海一刀 阅读(523) 评论(0) 推荐(0) 编辑
摘要: 一直以来,对于WM_PAINT和WM_ERASEBKGND消息不是很清楚,从书上和网上找了很多资料,大体上有以下几点说法:1>WM_PAINT先产生,WM_ERASEBKGND后产生2.WM_PAINT产生后,在调用BeginPaint时hdc = BeginPaint(hWnd, &ps);如果ps.fErase为true,则BeginPaint会产生WM_ERASEBKGND消息3.BeginPaint函数用来擦除窗口背景4.WM_ERASEBKGND用来绘制背景经过调试、分析,发现上面的说法并不正确。以下是一些测试代码,代码后面附上一些分析。最后总结出几点,可以解释程序中出 阅读全文
posted @ 2013-04-17 15:29 归海一刀 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 在网上看到了这篇文章:并经过实验得知:from:http://blog.csdn.net/lyclowlevel/article/details/5481393影响背景刷新的因素有:1、注册窗口类时,是否指定了hbrBackground;2、调用InvalidateRect时,第三个参数的取值。可以分为以下三种情况:1、未指定hbrBackground BeginPaint返回的PAINTSTRUCT的成员fErase为TRUE//这个无论设置与否 都返回true 请高人指点2、指定了hbrBackground且调用InvalidateRect时第三个参数为FALSEBeginPaint返回的 阅读全文
posted @ 2013-04-17 15:03 归海一刀 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 在做一些异形窗口时,往往会响应以下NC消息:WM_NCPAINT, WM_NCACTIVATE, WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE。但是,对于NC区的处理方式会受到系统版本及桌面主题的影响。最明显的一个例子是,在XP和WIN7下,窗口标题栏的高度是不同的。正因为如此,采用响应NC消息进行窗口自绘是极其麻烦。另一种可行的方法是,将窗口的类型设置成无边框的,那么整个窗口区域都是客户区,客户区的绘图操作完全由程序员自己控制,不会受到系统、桌面主题的影响。采用这个方法的缺点在于,失去了标题栏的拖动功能。其实,只要响应WM_NCHITTEST,然后在适当的区域返回HTCA 阅读全文
posted @ 2013-04-17 14:41 归海一刀 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 在窗口与窗口之间毫无重叠的情况下,根本不需要关心z-order。然而,当窗口之间出现重叠时,系统就需要通过一个标准来确定窗口的显示顺序。这个标准就是z-order。存在多个因素影响一个窗口的z-order: 1、窗口类型是否为TOPMOST; 2、窗口间的父子关系; 3、窗口间的owner关系; 4、是否为active状态。 z-order的确定过程如下: 1、所有topmost窗口的zorder都比非topmost窗口高; 2、一个top-level窗口的zorder比它的owner的zorder高; 3、子窗口的zorder与父窗口的zorder一样高。 什么是top-level窗口? . 阅读全文
posted @ 2013-04-17 14:36 归海一刀 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 我是个喜欢瞎琢磨的人。尤其是这几天心情非常郁闷。于是开始琢磨了…….琢磨的问题就是WS_CLIPCHILDREN和WS_CLIPSIBLINGS两种窗口样式的理解。1.求助MSDN我的第一步当然是求助MSDN。在MSDN里面有详细的解释。1.1WS_CLIPCHILDRENWS_CLIPCHILDREN样式从字面上可以理解成ClipChildren,裁减子窗口。MSDN里的E文解释:Excludes the area occupied by child windows when drawing occurs within the parent window. This style is use 阅读全文
posted @ 2013-04-17 14:23 归海一刀 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 什么是对象的句柄?句柄术语一般用来指获取另一个对象的方法——一个广义的假指针。这个术语是(故意的)含糊不清的。含糊不清在实际中的某些情况下是有用的。例如,在早期设计时,你可能不准备用句柄来表示。你可能不确定是否将一个简单的指针或者引用或者指向指针的指针或者指向引用的指针或者整型标识符放在一个数组或者字符串(或其它键)以便能够以哈希表(hash-table)(或其他数据结构)或数据库键或者一些其它的技巧来查询。如果你只知道你会需要一些唯一标识的东西来获取对象,那么这些东西就被称为句柄。因此,如果你的最终目标是要让代码唯一的标识/查询一个Fred类的指定的对象的话,你需要传递一个Fred句柄给这些 阅读全文
posted @ 2013-04-17 10:05 归海一刀 阅读(538) 评论(0) 推荐(0) 编辑
摘要: 编辑器加我在很多书上看到程序要求对消息响应函数进行重栽,还遇到过对对话框的初始化函数重栽,我不太明白,消息响应函数对应一个消息响应,怎么还可以重栽?书上说重栽没说要改变参数。重栽对话框的初始化函数也没说参数要改变,请问是怎么回事? 回答1 :响应的是消息,重载的是响应后的操作。回答2:消息相应函数中调用虚函数,利用虚函数的特性,允许你修改相应行为,casyncsocket中就是典型的这种应用,如果得到一个连接的时候发送一个消息,casyncsocket处理这个消息的是虚函数onconnect(),你重载这个虚函数,那么处理这个消息的动作就变成重载以后的函数。 回答3:不是重载,而是改写 ... 阅读全文
posted @ 2013-04-17 09:51 归海一刀 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:typedef struct tagM 阅读全文
posted @ 2013-04-17 09:34 归海一刀 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 一、窗口样式WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)WS_CHILDWINDOW 子窗口(不能与WS_POPUP合用)WS_MINIMIZE 创建窗口拥有最小化按钮WS_MINIMIZEBOX 创建窗口拥有最小化按钮,须同时指定WS_SYSTEM样式WS_VISIBLE 可见状态WS_DISABLED 不可用状态WS_CLIPSIBLINGS 使窗口排除子窗口之间的相对区域WS_CLIPCHILDREN 当在父窗口内绘图时,排除子窗口区域WS_MAXIMIZE 具有最大化按钮WS_MAXIMIZEBOX 创建窗口拥有最大化按钮,须同时指定WS_SYSTEM 阅读全文
posted @ 2013-04-17 09:23 归海一刀 阅读(299) 评论(0) 推荐(0) 编辑