您的位置:首页 > 其它

Windows桌面应用程序(1-2-2-4th) 绘画窗口

2017-12-31 22:55 260 查看
你已经创建了你的窗口。现在你想展示一些东西。在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结构。当前更新区域在PAINTSTRUCTrcPaint成员中给出。此更新区域是相对于客户区域定义的:



显示客户区域的起源的例证

在你的绘画代码中,你有两个基本的选择:

绘制整个客户区,而不管更新区域的大小。任何超出更新区域的内容都会被剪切掉。也就是说,操作系统忽略它。

通过在更新区域内部绘制窗口部分来优化。

如果你总是绘制整个客户区域,代码会更简单。但是,如果绘制逻辑复杂,跳过更新区域以外的区域会更有效。

以下代码行使用系统定义的窗口背景色(COLOR_WINDOW)以单一颜色填充更新区域。COLOR_WINDOW指示的实际颜色取决于用户当前的配色方案。

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


FillRect的细节对于这个例子并不重要,但是第二个参数给出了要填充的矩形的坐标。在这种情况下,我们传入整个更新区域(PAINTSTRUCTrcPaint成员)。在第一个WM_PAINT消息上,整个客户区需要被绘制,所以rcPaint将包含整个客户区。在随后的WM_PAINT消息中,rcPaint可能包含一个较小的矩形。

FillRect功能是图形设备接口(GDI)的一部分,它已经为Windows图形提供了很长时间的支持。在Windows 7中,微软推出了一个名为Direct2D的新图形引擎,它支持诸如硬件加速等高性能图形操作。Direct2D还可以通过Windows Vista平台更新和Windows Server 2008通过Windows Server 2008平台更新获得Windows Vista(GDI仍然完全受支持)。完成绘画后,调用EndPaint函数。此函数清除更新区域,它向Windows发出窗口已完成绘制自己的信号。

下一个

关闭窗口

原文链接:Painting the Window
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: