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窗口已经完成本身的绘制。

你的第一个Windows程序——绘制窗口的更多相关文章

  1. 第一个Windows程序讲解

    上次,我们一起写了第一个Windows程序,虽然程序非常简单,但是它却可以帮助大家建立学好windows开发的信心. 今天,就让我帮助大家分析一下这个程序的内容.首先,我们的程序包含了一个头文件:wi ...

  2. 第一个Windows程序

    今天,我们的任务就是和大家一起开发第一个Windows程序,这个程序的功能非常简单,就是弹出一个对话框,但是简单的程序可以帮助大家建立信心. 例1 第一个Windows程序 /* ********** ...

  3. 【C语言/C++编程学习笔记】你的第一个Windows程序!高级操作~

    什么是windows编程?了解到Windows API 编程.Windows编程.Windows SDK 编程是一个概念.今天我们运用C语言来实现你的第一个真正的Windows程序. windows. ...

  4. windows编程:第一个windows程序

    #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <math ...

  5. CreateProcess执行一个控制台程序,隐藏窗口

    STARTUPINFO   StartupInfo;//创建进程所需的信息结构变量 PROCESS_INFORMATION   ProcessInfo; GetStartupInfo(&Sta ...

  6. 我的第一个 Windows 窗口程序(1)

    一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...

  7. windows程序设计.第一个windos程序

    Windows程序设计(第5版) windows程序需要调用API. 第一个Windows程序 /*HelloMsg.c -- Displays "Hello World!" in ...

  8. Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

  9. 深入浅出话VC++(1)——Windows程序内部运行机制

    一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...

随机推荐

  1. Android-SVN

    服务器启动svn服务 svnserve -d -r /home/wbp/svn/actia/ 1 .svn  重新定位location , 改变新仓库的uuid , 今天操作SVN Client 发现 ...

  2. Android 自定义日历

    好久没来写博客了,这半年多发生了好多的事情,废话不多说,今天在公司里比较闲在,写一篇最近写的公司用到的控件——日历控件. 控件的功能比较少,根据需求只有选择开始时间和结束时间并返回时间段. 效果图如下 ...

  3. centos node卸载

    1.通过包管理工具 如果是通过包管理工具安装的话,那就和包管理工具卸载 yum remove nodejs npm -y 2.手动 如果是通过手动安装:官方下载后安装 进入到安装的路径 cd /opt ...

  4. VS2012 ActiveX控件_D接口添加方法事项

    自己写的是Clock控件,所以控件的接口是_DClock 使用向导添加方法后,会在紫色区域自动生成红色代码:(添加Hello方法) dispinterface _DClock { properties ...

  5. phpcms首页商机的调用,多种方式

    <hr /> {pc:get sql="select * from phpcms_yp_buy" order="updatetime DESC"} ...

  6. 无法解析属性“mode”的值。错误为: 枚举值必须是以下各值中的一个: RemoteOnly, On, Off。

    Off首字母要大写,注意大小写 <customErrors mode="Off">      <error statusCode="404" ...

  7. java jdbc 连接mysql 数据库

    JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com. ...

  8. 简化的nginx多进程模型demo

    //version 1:以下代码仅演示nginx多进程模型[test@vm c]$ cat mynginx.c#include <stdio.h> #include <string. ...

  9. JS之路——常用正则表达式

    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数 ...

  10. UIImageView设置为圆形

       CGFloat headimageX = self.view.frame.size.width * 0.2; CGFloat headimageY = self.view.frame.size. ...