当WM_PAINT消息不是由函数InvalidateRect产生的时(即通过最大话,最小化,移动,下拉菜单等),系统会先产生连续产生若干个WM_ERASEBKGND消息,紧接着在产生WM_PAINT消息. 如果程序没有自己处理WM_ERASEBKGND消息则默认由函数DefWindowProc函数处理(此函数使用在注册窗口类时使用的画刷擦除无效区域wndclass.hbrBackground)函数返回FLASE,如果程序自己处理WM_ERASEBKGND消息则返回TRUE. 紧接着程序处理WM_…
做windows开发这么久了,一直以来对WM_PAINT和WM_ERASEBKGND消息总是感觉理解的不准确,每次要自绘一个窗口都因为知其然不知其所以然,偶然发现一篇文章,详细透彻地分了这个两个消息的用途和设计初衷,这篇文章也是我见过最深入也是最准确关于WM_PAINT和WM_ERASEBKGND消息的,文中每一句话都值得咀嚼.先转载如下: 一直以来,对于WM_PAINT和WM_ERASEBKGND消息不是很清楚,从书上和网上找了很多资料,大体上有以下几点说法:1>WM_PAINT先产生,WM_…
1.OnPaint()函数是窗口重绘消息WM_PAINT的响应函数,当窗口重绘时会产生WM_ERASEBKGND消息和WM_PAINT消息,而且WM_ERASEBKGND会先于WM_PAINT产生,所以窗口重绘时,会先调用OnEraseBkGnd()擦除窗口,再调用OnPaint绘制窗口.如果你在OnPaint()里自绘了窗口,在窗口重绘的时候会发现窗口会闪一下,原因就是OnEraseBkGnd()函数中使用默认的画刷(一般为灰白色)来擦除窗口.解决这个问题有三个方法: ① 在OnEraseBk…
使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息. 使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_PAINT消息. WM_ERASEBKGND消息的作用以背景色填充客户区,因此他会将之前绘制的图像情况,然后响应WM_PAINT消息后,会调用OnPaint函数,进行响应图像绘制工作.故Invalidate(TRUE)相当于将原来画的内容清空后,重新绘制. 而Invalidate(TRUE)只发送WM…
WM_PAINTWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. WM_NCPAINT当窗口客户区以外的部分(如窗口标题栏.菜单栏等)需要需要重画时,系统向程序发出该消息.因标准窗口的客户区以外部分为窗口必需部分,因而该消息将默认被发送到DefWindowProc函数进行默认处理.程序可通过截获该消息来实现窗口其他部分的自定义绘制. WM_ERASEBKGND The WM_ERASEBKGND message is sent when t…
1)当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE. 2)当WM_PAINT由InvalidateRect产…
一直对这两个消息的关系不是太了解,借重新深刻学习windows编程的机会研究一番. 1)当窗口从无效变为有效时,比方将部分覆盖的窗口恢复时会重绘窗口时:程序首先会通过发送其他消息调用DefWindowProc,它内部会发送WM_ERASEBKGND消息,然后才会发送WM_PAINT消息,而且不经过消息队列(笔记:这结论从而何来?).用Delphi的代码当场验证: procedure TWinControl.WMSize(var Message: TWMSize); begin UpdateBou…
1. 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE. 2.当WM_PAINT由InvalidateRect…
一直以来,对于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用来绘制背景 经过调试.分析…
WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作:大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过Invalidat…
#define WM_ERASEBKGND                   0x0014 Parameters wParam A handle to the device context. // 设备上下文的句柄 lParam This parameter is not used. Return value Type: LRESULT An application should return nonzero if it erases the background; otherwise, it…
写在属于自己的体会,哪怕只是一点点,也是真的懂了.否则有那么多书,如果只是不过脑子的学一遍看一遍,又有谁真的掌握了这些知识呢? 这样你或许就明白了为什么不能直接用SendMessage和PostMessage发送WM_PAINT的原因:由于没有invalidate,系统认为窗口没有更新的必要,于是就对发来的WM_PAINT消息不理不睬.解决方案就是——我们自己invalidate!相关的API就是InvalidateRect()和InvalidateRgn(). 还想说一下Invalidate和…
核心思想:由于Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景.通过TImage组件也可以实现,但是重写WM_ERASEBKGND消息的效率更高一些,所以还是推荐使用这种方法. (2)声明重绘背景消息响应函数 void fastcall OnWMEraseBkgnd(TWMEraseBkgnd& Msg);  (3)添加消息映射 BEGIN_MESSAGE_MAP //拦截重画背景的事件 MESSAGE…
来自万一的帖子:http://www.cnblogs.com/del/archive/2008/04/27/1173658.html的确做到了一行代码设置TForm控件的颜色(一点感想:Delphi程序员真幸福).但真实的情况是,VCL框架在这个过程中做了大量的工作,经过多次消息的发送和响应,才达到了目的,大致顺序如下: procedure TForm1.Button1Click(Sender: TObject); begin Self.Color := clRed; end; procedur…
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序主动地刷新用户区,强制Windows发送一条WM_PAINT消息,这将引发视类OnDraw函数简单地将所有的图形对象重画,这样才完成了图形的 显示工作,但在刷新的同时会引起较明显的闪烁尤其是当画面面积较大.图像元素过多时尤为明显甚至达到无法正常工作的地步.因此,我们需要做相应的处理.本 文介绍了采用…
MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的: 当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息. 如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRU…
emWIN里面的无效重绘和windows很类似. WM_InvalidateArea()和WM_InvalidateRect()只重绘指定的区域,其他区域不会重绘,这样避免了闪烁,重绘发生在下次WM_PAINT消息中.WM_InvalidateWindow()重绘整个窗口,可以看到明显的闪烁. //////////////////////////////////////////////////////////////////////////////////////////////////////…
1.       Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历史开始.不过,我不会以精确到年月日的那种方式详细讲述,而是选取几个对我们的编程生涯有重要影响的关键点. Windows 是真正的图形化界面操作系统的普及者,无论任何人,争夺什么第一个实现的GUI.第一个商业化的GUI之类的虚名,都替代不了 Windows 的历史功绩,让最普通的用户能够容易地操纵PC…
1.背景模式 SetBkMode(TRANSPARENT/OPACITY) 用来反应文字,图形与窗口背景交互混合模式.透明则表示文字背景与窗口背景之间透明,互不干扰. 2.背景颜色 SetBkColor(RGB()) 背景颜色不是指窗口的背景颜色,而是文字背景色,或者虚线间隙颜色.想要改变窗口背景色用FillRect()函数. 3.OnEraseBkgnd(CDC* pDC) 在响应WM_PAINT之前调用该函数 响应WM_ERASEBKGND消息,默认是用在WINCLASS中hbrBackgr…
各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->Controls 查得. Delphi里的Windows消息(一共227个基本消息) WM_NULL = $; WM_CREATE = $; WM_DESTROY = $; WM_MOVE = $; WM_SIZE = $; WM_ACTIVATE = $; WM_SETFOCUS = $; WM_KILLFO…
1.关于LoadIcon/LoadCursor,这两个函数,第一个参数为实例句柄,如果是从保存在磁盘中的可执行文件中加载资源,则需要则需要指定可执行文件的hInstance,如果是系统资源,该句柄为NULL. 2.关于窗口的Style,有的在窗口类中指定,有的在CreateWindow时指定,是因为有些参数是每个实例都不同的,因此需要在Create时指定. 3.进入消息循环前的UpdateWindow是给消息队列增加第一条WM_PAINT. 4.队列消息:按键消息(WM_KEYDOWN,WM_K…
上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32Test.h #pragma once #include <windows.h> #include <atltypes.h> #include <tchar.h> //资源ID #define ID_BUTTON_DRAW 1000 #define ID_BUTTON_SW…
Windows 是一个消息驱动的操作系统.一个消息由一个消息名称(UINT 类型)和两个参数(WPARAM,LPARAM)构成.当用户进行了输入或是窗口的状态发生改变时,系统会发送消息到某一个窗口.例如当菜单选中之后会有WM_COMMAND 消息发送,WPARAM 的高字中(HIWORD(wParam))是命令的ID 号,对菜单来说就是菜单ID.当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据.一个消息必须由一个窗口接收.在窗口的消息处理函数中可以对消息进行分析,对自己…
窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的   而标题栏处于非客户区中,所以WM_PAINT消息.OnPaint()方法.GetDC()API函数都用不上   GetWindowDC()是获得整个窗体的画布句柄(Device Context翻译为:设备清单,我习惯称为画布句柄),包括非客户区   GDI的绘制都离不开DC,因为操作系统必须知道你要在什么…
1. 消息机制     过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序继续执行,直到程序结束.       事件驱动:程序的执行顺序是无序的.某个时间点所执行的代码,是由外界通知.由于我们无法决定用户执行顺序,所以代码的执行也是无序.             Win32的消息机制 - 事件驱动 2. Win32消息程序 2.1.Win32消息循环 2.1.1.GetMessasge BOOL GetMessage(LPMSG lpMsg,//存放获取到的消息…
在windows程序中,消息是一个重要的概念,最常见的消息一般都是以WM_开头,WM就是window message,窗口消息的缩写,通过处理标准的windows消息,我们可以改变窗口的外观,如使用WM_ERASEBKGND消息可以改变窗口默认的窗口背景,窗口每次需要绘制窗口的背景的时候,就会发送一次这个消息,如果我们处理这个消息,我们就可以绘制我们自己的特性化的背景,如果不处理,默认窗口过程就会处理,绘制背景.通过处理标准的windows消息,我们可以对用户的输入做出响应,如WM_LBUTTO…
windows发送窗口消息 所需工具:spy++,visual studio 2017,c#语言 技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为: [DllImport("user32.dll")]       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 此函数获得目标窗口的句柄,如果要获得某个子窗口的句柄,通过以下函数可获得: [DllImpo…
WM_GETMINMAXINFO 0X0024 WM_NCCREATE 0X0081 WM_NCCALCSIZE 0X0083   WM_CREATE 0X0001 WM_SIZE 0X0005 WM_MOVE 0X0003 WM_SETFONT 0X0030 WM_NOTIFYFORMAT 0X0055 WM_QUERYUISTATE 0X0129 WM_NOTIFYFORMAT 0X0055 WM_QUERYUISTATE 0X0129 WM_INITDIALOG 0X0110 WM_SET…
WM_PAINT(父子窗口间) 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注父窗口还是子窗口. 当任意一个窗口接受到WM_PAINT消息产生重绘,更新区绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区有交集,就向这个发送wm_paint消息,周而复始,直到执行到顶层窗口.才算完成. 对于一个对话框(主窗口来说,设置了WS_CLIPCHILDREN样…
引用:http://www.cnblogs.com/rainbowzc/archive/2010/06/02/1749872.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理: 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制: 3. 熟悉OOP理论和技术: 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助. 1. 美化界面之开题篇 相信使用过<金山毒霸>.<瑞…