Windows编程文章翻译(1-4th)绘图

2017-12-16 08:28:57来源:CSDN作者:qq_37422196人点击

分享

父文章:你的第一个Windows桌面应用程序
上一篇文章:编写WindowProc函数(窗口过程)
下一篇文章:关闭窗口
原文链接:Painting the Window


你已经创建了你的窗口。现在你想绘制一些东西。在Windows术语中,这被称为绘制窗口。打个比方,一个窗口是一张空白的画布,等着你在上面画画。
有时你的程序会启动绘画来更新窗口的外观。在其他时候,操作系统会通知您必须重新绘制一部分窗口。发生这种情况时,操作系统将窗口发送WM_PAINT消息。必须重绘的窗口部分称为更新区域
第一次显示一个窗口时,窗口的整个客户区必须被绘制。因此,当您显示一个窗口时,您总会收到至少一条WM_PAINT消息。
这里写图片描述
显示窗口更新区域的图示
您只负责绘制客户区域。操作系统自动绘制包括标题栏在内的周围框架。完成客户区的绘制后,清除更新区域,该区域告诉操作系统在发生某些更改之前不需要发送另一个WM_PAINT消息。
现在假设用户移动另一个窗口,以便遮住窗口的一部分。当被遮挡的部分再次变为可见时,该部分被添加到更新区域,并且你的窗口接收到另一个WM_PAINT消息。
这里写图片描述
显示两个窗口重叠时更新区域如何变化的图示
如果用户拉伸窗口,更新区域也会改变。在下图中,用户向右拉伸窗口。窗口右侧新的区域被添加到更新区域:
这里写图片描述
显示调整窗口大小时更新区域变化的图示
在我们的第一个示例程序中,绘图例程非常简单。它只是用白色填充整个客户区域。然而,这个例子足以说明一些重要的概念。

switch(uMsg){    case WM_PAINT:        {            PAINTSTRUCT ps;            HDC hdc=BeginPaint(hwnd,&ps);            // All painting occurs here, between BeginPaint and EndPaint.            FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+1));            EndPaint(hwnd,&ps);        }        return 0;}

通过调用BeginPaint函数开始绘画操作。这个函数用重绘请求的信息填充PAINTSTRUCT结构。当前更新区域在PAINTSTRUCT的rcPaint成员中给出。此更新区域是相对于客户区域定义的:
这里写图片描述
显示客户区域的起始点的插图
在绘图代码中,大致有两种方法:

  • 绘制整个客户区,而不管更新区域的大小。任何超出更新区域的内容都会被剪切掉。也就是说,操作系统忽略它。
  • 通过在更新区域内部绘制窗口部分来优化。

如果你总是绘制整个客户区域,代码会更简单。但是,如果绘制逻辑复杂,跳过更新区域以外的区域会更有效。
以下代码行使用系统定义的窗口背景色(COLOR_WINDOW)以单一颜色填充更新区域。COLOR_WINDOW指示的实际颜色取决于用户当前的配色方案。

FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+1));

FillRect的细节对于这个例子并不重要,但是第二个参数给出了要填充的矩形的坐标。在这种情况下,我们传入整个更新区域(PAINTSTRUCT的rcPaint成员)。在第一个WM_PAINT消息上,整个客户区需要被绘制,所以rcPaint将包含整个客户区。在随后的WM_PAINT消息中,rcPaint可能包含一个较小的矩形。
FillRect功能是图形设备接口(GDI)的一部分,它已经为Windows图形界面提供了很长时间的支持。在Windows 7中,微软推出了一个名为Direct2D的新图形引擎,它支持高性能的图形操作,比如硬件加速。Direct2D还可以通过Windows Vista平台更新和Windows Server 2008平台更新(Windows Update 2008平台更新)用于Windows Vista(完全支持GDI)。
完成绘画后,调用EndPaint函数。此函数清除更新区域,它向Windows发出窗口已完成绘制的信号。


父文章:你的第一个Windows桌面应用程序
上一篇文章:编写WindowProc函数(窗口过程)
下一篇文章:关闭窗口
原文链接:Painting the Window

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台