原文地址:http://www.baidu.com/s?bs=mfc+%B0%EF%D6%FA%CE%C4%B5%B5&f=3&wd=wm_paint%CF%FB%CF%A2&oq=wm_pai&rsp=1
WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为 “无效”,以致于必须“更新画面”时,将由这个消息通知程序。
显示区域的显示内容怎么会变得无效呢?在最初建立窗口的时候,整个显示区域都是无效的,因为程序还没有在窗口上画什么东西。第一条WM_PAINT消息(通常发生在WinMain中调用UpdateWindow时)指示窗口消息处理程序在显示区域上画一些东西。在用户改变HELLOWIN窗口的大小后,显示区域的显示内容重新变得无效。wndclass结构的style字段设定为标志 CS_HREDRAW和CS_VREDRAW,这样的格式设定指示Windows,在窗口大小改变后,就把整个窗口显示内容当成无效。然后,窗口消息处理程序将收到一条WM_PAINT消息。当用户将最小化,然后再次将窗口恢复为以前的大小时,Windows将不会保存显示区域的内容。在图形环境下,窗口显示区域涉及的数据量很大。因此,Windows令窗口无效,窗口消息处理程序接收一条WM_PAINT消息,并自动恢复其窗口的内容。在移动窗口以致其相互重迭时,Windows不保存一个窗口中被另一个窗口所遮盖的内容。在这一部分不再被遮盖之后,它就被标志为无效。窗口消息处理程序接收到一条 WM_PAINT消息,以更新窗口的内容。
对WM_PAINT的处理几乎总是从一个BeginPaint调用开始:hdc = BeginPaint (hwnd, &ps) ;而以一个EndPaint调用结束:EndPaint (hwnd, &ps) ;
在这两个调用中,第一个参数都是程序的窗口句柄,第二个参数是指向型态为 PAINTSTRUCT的结构指针。PAINTSTRUCT结构中包含一些窗口消息处理程序,可以用来更新显示区域的内容。我们将在下一章中讨论该结构的各个字段。现在我们只在BeginPaint和EndPaint函数中用到它。
在BeginPaint调用中,如果显示区域的背景还未被删除,则由Windows来删除。它使用注册窗口类别的WNDCLASS结构的hbrBackground字段中指定的画刷来删除背景。一般, 这是一个白色备用画刷。这意味着,Windows将通过把窗口背景设定为白色来删除窗口背景。BeginPaint调用令整个显示区域有效,并传回一个 “设备上下文句柄”。设备上下文是指实体输出设备(如视频显示器)及其设备驱动程序。在窗口的显示区域显示文字和图形需要设备上下文句柄。但是从 BeginPaint传回的设备上下文句柄不能在显示区域之外绘图,读者可以试一试。EndPaint释放设备上下文句柄,使之不再有效。
如果窗口消息处理程序不处理WM_PAINT消息(这是很少见的),它们必须被传送给 DefWindowProc。DefWindowProc只是依次调用BeginPaint和EndPaint,以使显示区域有效。调用完 BeginPaint之后,WndProc接着调用GetClientRect:
GetClientRect (hwnd, &rect) ;
第一个参数是程序窗口的句柄。第二个参数是一个指针,指向一个RECT型态的 rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。WndProc除了将该 RECT结构指针作为DrawText的第四个参数传递外,不再对它做其它处理
分享到:
相关推荐
WM_PAINT 消息 WM_PAINT 消息是 Windows 操作系统中的一种消息类型,隶属于 Platform SDK Windows GDI 绘图消息。该消息被发送到应用程序窗口,以请求绘制窗口的某个部分。当系统或其他应用程序请求绘制某个应用...
这是个MFC程序,检测Windows窗口程序发送消息WM_PAINT的时机,根据检测到WM_PAINT的次数绘制椭圆,从而确定发送消息WM_PAINT的时机。 经过实验,发送WM_PAINT的时机是窗口创建时、改变窗口大小时。 窗口的坐标系为...
在本文中,我们将深入探讨如何利用Duilib实现半透明和异形窗口,并着重讲解如何修改`WM_PAINT`消息处理来达成这一目标。 半透明窗口是一种能够透过窗口看到部分或全部底层窗口的效果,这在现代软件设计中很常见,...
WM_PAINT是Windows消息机制中的一个关键消息,当窗口的部分或全部需要重绘时,系统会发送这个消息。默认情况下,WM_PAINT消息处理程序会调用系统提供的函数来绘制标准的矩形窗体。为了实现不规则窗体,我们需要覆盖...
这允许开发者拦截并处理特定的消息,例如WM_PAINT、WM_MOUSEMOVE等,从而实现定制的绘制效果。子类化通常用于那些无法通过标准属性和方法改变其行为的控件,或者为了实现特殊功能,如透明控件、自定义滚动条等。 在...
为了按下鼠标左键时、键盘按下的按键输出在窗口,应设置在LButtonDown消息以及KeyDown消息处理中发送WM_PAINT给窗口。 CMainWindow类有数据成员px,py,key,分别是鼠标按下左键所在的位置(x,y)以及键盘按键。
2. **处理WM_PAINT消息**:在自定义的ComboBox类中,我们需要重写`OnPaint`方法或处理WM_PAINT消息。当ComboBox需要更新其视图时,操作系统会发送WM_PAINT消息。在这个消息处理函数中,我们将执行我们的自定义绘制...
ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON4, OnButton4) ON_BN...
在Visual C++ 6.0(简称VC6.0)中,开发者可以通过重载WM_PAINT消息处理函数来自定义窗口的外观,包括标题栏、边框以及客户区的背景等元素。在你遇到的问题中,你已经尝试过根据他人的示例进行窗体自绘,但遇到了...
本文将深入解析一系列WM_消息,这些消息对于理解和实现Windows应用程序至关重要。 #### WM_NULL (0x0000) 这是一个空消息,通常用于测试或调试目的,不携带任何数据。 #### WM_CREATE (0x0001) 此消息在窗口创建时...
1. WM_PAINT:通知窗口需要进行重绘。 2. WM_LBUTTONDOWN/WM_LBUTTONUP:左键按下和释放。 3. WM_KEYDOWN/WM_KEYUP:键盘按键按下和释放。 4. WM_SIZE:窗口大小发生变化。 二、WM消息处理 在VC++中,我们通常通过...
当标准的消息(如WM_PAINT、WM_MOUSEMOVE等)无法满足特定需求时,开发者可以通过注册并发送自定义消息来实现特定功能。本文将深入探讨在Visual C++ 6.0(简称VC6)环境下如何创建和处理自定义消息,尤其是与WM_USER...
需要注意的是,Invalidate 只是放一个 WM_PAINT 消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出 WM_PAINT,才执行 PAINT。因此,Invalidate 并不意味着立刻进行重绘。 InvalidateRect ...
通常,程序会在初始化阶段调用UpdateWindow函数来触发第一次WM_PAINT消息,然后在窗口大小改变、滚动、部分区域被覆盖或程序主动标记为需要重绘时,都会收到WM_PAINT消息。 处理WM_PAINT消息时,程序员需要考虑以下...
在Windows环境下,使用汇编语言进行文本输出和绘图涉及到多个方面,包括窗口的客户区管理、WM_PAINT消息处理、设备描述表句柄的获取与释放,以及文本输出的具体实现。掌握这些知识可以帮助开发者更好地理解Windows...
为了绘制窗口,应用程序必须处理绘图相关的消息,特别是WM_PAINT消息。 WM_PAINT消息是在窗口需要重绘其客户区的一部分时由Windows系统发送的。这个消息会告诉应用程序窗口的哪一部分需要更新,以便应用程序可以只...
Invalidate() 函数和 InvalidateRect() 函数都是在 Windows 编程中用于触发重绘窗口的函数,它们的作用是使窗口或窗口的一部分无效,从而导致 Windows 发送 WM_PAINT 消息以重绘窗口。但是,它们之间存在一些关键的...
WM_PAINT消息是Windows操作系统向应用程序发送的一个关键消息,用于通知应用程序其窗口需要重新绘制。这通常发生在以下几种情况: 1. **创建窗口**:当窗口首次创建时,整个客户区都处于无效状态,此时系统会发送第...