• 你的第一个Windows程序——绘制窗口


    MSDN原文(英文)

    绘制窗口

    你已经创建了你的窗口,现在你想在它里面显示东西。在WIndows术语里,这就是所谓的绘制窗口。混合隐喻,一个窗口是一个空白画布,等待你去填充它。

    有时你的程序将启动绘制更新你窗口的外观。在其它时候,操作系统会通知你,你必须重绘部分窗口。当这种情况发生时,操作系统个窗口发送一个WM_PAINT消息,窗口中必须重绘的部分被称为更新区域。

    一个窗口在第一时间显示时,窗口的整个客户区一定要绘制。因此,当你显示一个窗口,你总是会收到至少一个WM_PAINT消息。

    插图显示一个窗口更新区域

    你只负责绘制客户区。周围的框架,包括标题栏,由操作系统自动绘制。在你完成客户区的绘制,你要清除更新区域,这是告诉操作系统,它不需要发送另一个WM_PAINT消息直到有新的变化。

    现在假设用户移动另一个窗口,使它掩盖你的窗口的一部分。当被掩盖的部分再次成为可见,该部分被添加到更新区域,并你的窗口接受另一个WM_PAINT消息。

    插图显示两个窗口重叠时如何更改更新区域

    如果用户拉伸窗口,更新区域也会改变,在下面的插图,用户拉伸窗口到右边,在窗口右侧新暴露的区域添加到更新区域:

    插图显示窗口调整大小是如何更改更新区域

    在我们的一个例子程序,绘制程序是非常简单的。它只是用纯色填充整个客户区。尽管如此,这个例子足以证明一些重要的概念。
     
    通过调用BeginPaint函数开始绘制操作,这个函数在重绘请求时填充信息到PAINTSTRUCTS结构,PAINTSTRUCTS结构的成员rcPaint给出了当前的更新区域,此更新区域相对于客户区:

    插图显示客户区的原点

    在你的绘制代码中,你有两个基本的选择:
    • 绘制整个客户区,无论更新区域的大小。更新区域以外任何范围被裁剪,也就是说操作系统也忽略它。
    • 优化绘制,只是窗口的更新区域部分。
    如果你总是绘制整个客户区,代码会更简单。如果你具有复杂的绘制逻辑,但是,它可以更有效的调到更新区域以外的区域。

    下面的代码用一个单一的颜色填充更细区域,使用系统定义的窗口背景颜色(COLOR_WINDOW),由COLOR_WINDOW表示的实际颜色取决于用户的当前配色方案。
    FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
    
    在这个例子中,FillRect的细节并不重要,但第二个参数给出的要填充的矩形,在这种情况下,我们传入整个更新区域(PAINTSTRUCTS结构的成员rcPaint)。在第一次WM_PAINT消息,整个客户区需要绘制,所以rcPaint包含整个客户区。在随后的WM_PAINT消息,rcPaint可能包含一个较小的矩形。

    FillRect函数是图形设备接口(GDI)的一部分,已经支持WINDOWS图形很长一段时间。在WINDOWS7,微软推出了新的图形引擎,取名Direct2D,支持高性能的图形操作,例如硬件加速。另外Windows Vista和Windows Server 2008通过各自的平台更新也支持Direct2D(GDI仍然完全支持)。

    当你绘制完成以后,调用EndPaint函数。这个函数清除更新区域,某些信号传到WINDOWS窗口已经完成本身的绘制。

  • 相关阅读:
    跟着百度学习之ThinkPHP的认识/初窥
    Apache Rewrite 拟静态
    最新PHPcms9.6.0 任意文件上传漏洞
    最新phpcms v9.6.0 sql注入漏洞分析
    蓝牙攻击-基础篇
    emblog后台拿shell
    绕过云盾找真实IP-找真实IP-绕过CDN
    程序员最重要的品质是什么?
    VC++ 6.0中添加库文件和头文件
    程序的链接与装载
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3299299.html
Copyright © 2020-2023  润新知