做windows开发这么久了,一直以来对WM_PAINT和WM_ERASEBKGND消息总是感觉理解的不准确,每次要自绘一个窗口都因为知其然不知其所以然,偶然发现一篇文章,详细透彻地分了这个两个消息的用途和设计初衷,这篇文章也是我见过最深入也是最准确关于WM_PAINT和WM_ERASEBKGND消息的,文中每一句话都值得咀嚼。先转载如下: 一直...
MemDC, MemDC); // 结合上面的TWinControl.WMEraseBkgnd,可以观察到,要得就是这种效果,即双缓冲第一次绘制时候,需要删除背景Message.DC :=MemDC;// 构建一个消息,把MemDC传入,当前控件和子控件都在MemDC上画,不在原先的DC上作画了WMPaint(Message);// 递归调用,会引发...
如果 hbrBackground 为NULL,则应用程序应处理 WM_ERASEBKGND 消息并清除背景。如果应用程序处理消息并擦除背景,则应用程序应返回非零值以响应 WM_ERASEBKGND ;这表示不需要进一步擦除。 如果应用程序返回零,窗口将保持标记为要擦除。 (通常,这表示 PAINTSTRUCT 结构的 fErase 成员将为 TRUE.) ...
1)当窗口从无效变为有效时,比方将部分覆盖的窗口恢复时会重绘窗口时:程序首先会通过发送其他消息调用DefWindowProc,它内部会发送WM_ERASEBKGND消息,然后才会发送WM_PAINT消息,而且不经过消息队列(笔记:这结论从而何来?)。用Delphi的代码当场验证: procedure TWinControl.WMSize(var Message: TWMSize); ...
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_NCPAINT消息(非客户区消息),只说WM_ERASEBKGND消息和客户区的WM_PAINT消息 //此段代码摘自vc6应用程序向导自动生成的代码,并添加了一些测试代码 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ...
WM_ERASEBKGND消息是在指示HWND的整个背景窗体需要被擦除的时候才发送的。游戏编程中,一般来说总是全屏刷新重绘的,所以WM_ERASEBKGND的时候直接返回一个1即return 1,以告诉Windows你已经自己处理过了重绘了,所以接下来Windows不不会再做处理。否则,Windows会自己去重绘整个背景的。
2)当WM_PAINT由InvalidateRect产生时,先发送WM_PAINT消息(异步),如果InvalidateRect的bErase为TRUE,BeginPaint检查到更新区域需要删除背景,向窗口发送一个WM_ERASEBKGND消息,如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE。
WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制之前通知父窗口“我要绘制了,告诉我要绘制什么颜色,否则我就用默认的”。1.2.3 没分别,都要调用 这3个消息。因为这3个消息是关联的默认的 MoveWindow,RedrawWindow 都会触发 WM_ERASEBKGND,WM_PAINT,消息,而WM_...