词条 | WM_PAINT讯息 |
释义 | § 介绍 显示区域的显示内容怎么会变得无效呢?在最初建立视窗的时候,整个显示区域都是无效的,因为程式还没有在视窗上画什么东西。第一条WM_PAINT讯息(通常发生在WinMain中呼叫UpdateWindow时)指示视窗讯息处理程式在显示区域上画一些东西。 § 说明 在使用者改变HELLOWIN视窗的大小後,显示区域的显示内容重新变得无效。读者应该还记得,HELLOWIN中wndclass结构的style栏位设定为标志CS_HREDRAW和CS_VREDRAW,这样的格式设定指示Windows,在视窗大小改变後,就把整个视窗显示内容当成无效。然後,视窗讯息处理程式将收到一条WM_PAINT讯息。 当使用者将HELLOWIN最小化,然後再次将视窗恢复为以前的大小时,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栏位中指定的画刷来删除背景。在HELLOWIN中, 这是一个白色备用画刷。这意味著,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的第四个参数传递外,不再对它做其他处理: DrawText ( hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; DrawText可以输出文字(正如其名字所表明的一样)。由於该函式要输出文字,第一个参数是从BeginPaint传回的装置内容代号,第二个参数是要输出的文字,第三个参数是 -1,指示字串是以位元组0终结的。 DrawText最後一个参数是一系列位元旗标,它们均在WINUSER.H中定义(虽然由於其显示输出的效果,使得DrawText像一个GDI函式呼叫,但它确实因为相当高级的画图功能而成为User模组的一部分。此函式在/Platform SDK/Graphics and Multimedia Services/GDI/Fonts and Text中说明)。旗标指示了文字必须显示在一行上,水平方向和垂直方向都位於第四个参数指定的矩形中央。因此,这个函式呼叫将让字串「Hello, Windows 98!」显示在显示区域的中央。 一旦显示区域变得无效(正如在改变大小时所发生的情况一样),WndProc就接收到一个新的WM_PAINT讯息。WndProc通过呼叫GetClientRect取得变化後的视窗大小,并在新视窗的中央显示文字。 |
随便看 |
百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。