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. 抓取锁的sql语句-第二次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000);  --定义 v_sql 接受抓取锁的sql语句 CUR_LOCK SYS ...

  2. 四大跨平台的APP分析

    转载:http://blog.csdn.net/kenkao/article/details/50678269

  3. Objective-C 笔记二 类、对象和方法

    对象就是一个物件.面向对象的程序设计可以看成一个物件和你想对它做的事情.这与C语言不同,C语言通常称为过程性语言.在C语言中,通常是先考虑要做什么,然后才关注对象,这几乎总是与面相对象的思考过程相反. ...

  4. 关于jQuery表单校验的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. java获取天气信息

    通过天气信息接口获取天气信息,首先要给项目导入程序所需要的包,具体需要如下几个包: json-lib-2.4.jar ezmorph-1.0.6.jar commons-beanutils-1.8.3 ...

  6. jquery工具函数browser() 辨别浏览器

    1.browser属性不是一个函数是一个全局对象,可以辨别客户端浏览器. 2.属性1:$.browser.msie如果返回true则客户端浏览器是ie.相似的$.browser.safari返回tru ...

  7. [HttpClient]简单使用GET请求

    package com.jerry.httpclient; import java.io.IOException; import org.apache.http.HttpEntity; import ...

  8. 说一说&&符

    今天添加检测代码,还得添加好几套,好蛋疼. 为了省点事,全写在HTML的行间onclick里,为此专门琢磨了一下&&的用法. 一般用&&(除了逻辑判断里),是为了简写i ...

  9. Python按行读取文件

    1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...

  10. MSSQL BACKUP WEBSHELL

    Title:MSSQL BACKUP WEBSHELL -- Long Long Ago. Version:MSSQL 2005 && + ';alter/**/database/** ...