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. MySQL无法登录服务器解决方法

    提示:#2000 无法登录 MySQL 服务器 今天用本机装了个phpMyAdmin,版本3.4.8,想用它来连一台内网服务器上的Mysql,于是乎修改phpMyAdmin配置文件config.inc ...

  2. SystemConfig.getPropertyValue("test");配置文件已经加了test=abc,但是取得时候空字符串

    1.定位tomcat中System.properties是否配置了,发现配置了 2.定位myeclipse中修改的tomcat是不是自己配置的tomcat.发现是 3.定位如下位置配置是否读取我先在用 ...

  3. C语言零移位操作

    给定一个整形数组要求把其中的零元素移动到数组的末尾 非零元顺序保持不变 以下采用两种方法实现 #include <stdlib.h> #include <stdio.h> #i ...

  4. vi文本编辑器

    vi文本编辑器分为3个模式: 命令模式 插入模式 ex模式 在命令模式下我们可以使用一下功能 o 插入新的行 u 撤销 n yy  复制n行 p 粘贴 / 查找 i 进入插入模式 exc到命令模式 e ...

  5. CentOS7 开启关闭网卡

    ifdown ifcfg-enp7s0 关闭网卡 ifup ifcfg-enp7s0 开启网卡

  6. window.location.href问题,点击,跳转到首页

    onClick="window.location.href='./';" 点击,跳转到首页. location.href=url Js中实现跳转 window.location.h ...

  7. Css 描点

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  8. python之map和filter

    li = [11,22,33,44,55,66] ret = filter(lambda a:a>33,li) print(list(ret)) ret2 = map(lambda a:a+10 ...

  9. IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...

  10. The underlying provider failed on Open. EF

    本地测试是可以的:但是放到服务器上就不行了: 报错:"The underlying provider failed on Open." 这一情况和我以前遇上的一次错误有点相似啊:都 ...