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

转载于:https://www.cnblogs.com/suncoolcat/p/3299299.html

你的第一个Windows程序——绘制窗口相关推荐

  1. Windows编程01_应用程序分类,开发工具和库,第一个Windows程序,字符编码

    01 Windows应用程序分类 1.应用程序分类 控制台程序Console DOS程序,本身没有窗口,通过Windows DOS窗口执行(借的的操作系统的窗口) 窗口程序 拥有自己的窗口,可以与用户 ...

  2. Windows程序的窗口和消息 -- 一个Windows程序从生到死

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 1.一个完 ...

  3. 第一个Windows程序讲解

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

  4. vs2008编写第一个Windows程序

    vs2008编写第一个Windows程序 我们编写单击MouseClick事件的处理程序,当鼠标单击窗体时,在窗体的标题栏显示"这是我的第一个Windows程序". 1.在窗体设计 ...

  5. 自己的第一个windows程序

    自己完成的第一个程序,真心不容易...通过我大概齐学了6章之后,第一个windows程序终于做出来了... 今天实在是挺高兴的,发个博客记录一下,既是激励自己努力学习,也是肯定下一下自己真的坚持到了写 ...

  6. 学习C++ Windows 编程(你的第一个Windows程序)

    Module 1. Your First Windows Program (Windows) 模块1. 你的第一个Windows程序 In this module, we will write a m ...

  7. Windows程序设计【1】 第一个Windows程序 | 九七的Windows开发

    Windows程序设计[1] 第一个Windows程序 一.定义介绍   编写第一个Windows程序,使用VS2019. 二.功能作用   这里的步骤写的非常详细,旨在让大家入门. 三.使用方法 1 ...

  8. C#将另一个应用程序的窗口移动到前端的问题

    这个问题源于做C#项目的时候,要实现的一个功能:桌面应用程序,点击图标,弹出登录界面,输入用户名及密码,登录:如果该用户名已登录,则不创建程序的新实例,而是直接将该用户的应用程序弹出,置于桌面前端,类 ...

  9. Windows API程序设计入门(新手的第一个Windows程序)

    Windows API程序设计入门 一.实验目的 二.实验工具 三.参考资料 四.步骤 五.代码分析 六.运行效果 七.补充 一.实验目的 了解 windows操作系统应用程序开发的基本概念,win3 ...

  10. Windows应用程序~~第一个Windows程序

    前言 我们要告别控制台窗口进入Windows应用程序的开发,利用 Visual Studio 2019开发桌面应用程序 一. 创建 Windows 程序 打开Visual Studio → 创建新项目 ...

最新文章

  1. 驼峰命名法模态对话框
  2. 2015快捷键在哪里设置_炒股软件的选择通达信软件的基本设置
  3. JQuery弹出层,点击按钮后弹出遮罩层,有关闭按钮
  4. mysql 主从复制介绍_MySQL 主从复制介绍
  5. c#反混淆工具de4dot 一般混淆都可以解决
  6. LeetCode之最大回文串--动态规划
  7. 你需要知道的基础算法知识——STL和基础数据结构(一)
  8. 深入理解计算机系统——bomblab
  9. python中素数怎么求_用python怎么求素数
  10. 使用Ajax.dll前台调用后台方法及错误示例
  11. 2019牛客多校第一场I Points Division(DP)题解
  12. 老板要我开发一个简单的工作流引擎 !
  13. Node.js IP 库引擎 lib-qqwry v1.3.0 发布,支持命令行下使用
  14. 现代控制理论课程实验三:一阶倒立摆的LQR控制器设计
  15. aks Unable to connect to the server: x509
  16. 安装声卡驱动后还是没声音?Win10如何区分新旧面板
  17. java基础知识问题导航
  18. 联通没有4g显示无服务器,联通4G去哪了?解密“消失”的联通4G信号
  19. 搭建恋爱话术库一个月赚5万,一年全款车!投入不到两千
  20. 简单部署 rancher 管理kubernetes集群(3)

热门文章

  1. TCP模块如何处理连接包
  2. 详解:物理地址,虚拟地址,内存管理,逻辑地址之间的关系
  3. c#文件分割与合并 part 1 (转自互联网)
  4. 吐槽下CSDN编辑器
  5. RecyclerView 下拉刷新和加载更多
  6. CSS3 Gradient渐变
  7. misc on starcraft----starcraft2
  8. wince6移植之创建.pbcxml文件
  9. MySQL备份之mysqlhotcopy与注意事项
  10. 【UOJ 275】最短路径问题