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

Windows桌面 专栏收录该内容
78 篇文章 4 订阅

你已经创建了你的窗口。现在你想展示一些东西。在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

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值