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. `~!$^*()[]{}\|;:'",<>/?在英文怎么读?

    `~!$^*()[]{}\|;:'",<>/?在英文怎么读? 'exclam'='!' 'at'='@' 'numbersign'='#' 'dollar'='$' 'perce ...

  2. iOS加载启动图的时候隐藏statusbar + 指定启动图显示多少秒

    只需需要在info.plist中加入Status bar is initially hidden 设置为YES 补充一下,现在手机越来越快,在6+下面启动图一闪而过,而美工童鞋辛辛苦苦做的图就看不到鸟 ...

  3. UIView之常用属性

    UIView之常用属性 1. view.tag = 200; // 系统保留0-1002. view.frame = CGRectMake(20, 30, 300, 300);3. view.cent ...

  4. 谈谈IT人的发展[转载]

    一个人如果能确定他喜欢的行业,他一生都会非常幸福.   相反,则往往痛苦,也许竟然会因此成为一个哲学家也说不定. 中国的贫穷决定了我们当中的大多数人不能根据自己的爱好来选择职业,而只是因为生活所迫,或 ...

  5. js 点名

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. jquery easy ui 学习 (7) TreeGrid Actions

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. django自带User管理中添加自己的字段方法

    #coding=utf-8 from django.db import models from django.contrib.auth.models import User, make_passwor ...

  8. Eclipse+Pydev +Django搭建开发环境时容易出错的几点

    1.注意安装的软件和系统的位数是否匹配. 2.安装Django框架的时候注意是否安装了setuptools工具.在Python中,安装第三方模块,是通过setuptools这个工具完成的.Python ...

  9. ADO.Net增、删、改、查

    数据访问 需要引用 对应命名空间:System.Data.SqlClient; SqlConnection:连接对象 SqlCommand:命令对象 SqlDataReader:读取器对象 Comma ...

  10. 去除win8.1这台电脑中的6个库文件夹

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace,备份之后删除 wi ...