WM_PAINT 消息的触发

Windows 程序在以下情况会触发WM_PAINT消息:

  • 窗口被移动导致被遮盖部分暴露出来
  • 用户调整窗口的大小(当窗口类的 style 字段被设置为 CS_HREDRAW 和 CS_VREDRAW)
  • 调用 ScrollWindow 或 ScrollDC 函数滚动客户区
  • 调用 InvalidateRect 或 InvalidateRgn 函数生成 WM_PAINT

获取设备环境句柄

需要在屏幕上绘图的时候,需要先获取到设备环境句柄,这里有两种方式:

1、调用 BeginPaint 函数(用于响应 WM_PAINT 消息)

第一个参数是当前的窗口句柄,第二个参数是 PAINTSTRUCT 结构的地址,它将返回一个设备环境句柄。BeginPaint 函数的原型如下:

HDC BeginPaint(
HWND hwnd, // 当前的窗口句柄
LPPAINTSTRUCT lpPaint // PAINTSTRUCT 结构的地址
)

Windows 为每个窗口维护一个“绘制信息结构”,即 PAINTSTRUCT,这里给出了它的定义:

typedef struct tagPAINTSTRUCT {
HDC hdc; // 设备环境句柄,即 BeginPaint 函数的返回值
BOOL fErase; // 背景刷状态,如果为 TRUE,表示无效背景区域需要进行擦除,为 FALSE,表示已经擦除了无效区域的背景
RECT rcPaint; // 无效矩形边界,是一个 RECT 结构,包含 left、top、right、bottom 四个参数
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[];
} PAINTSTRUCT;

调用 BeginPaint 函数时,PAINTSTRUCT 结构中的字段将被自动填充。

当调用 BeginPaint 函数获得设备环境句柄,并处理 WM_PAINT 消息后,必须使用 EndPaint 函数释放获取到的设备环境句柄,该函数原型如下:

BOOL EndPaint(
HWND hWnd, // 当前的窗口句柄
CONST PAINTSTRUCT *lpPaint // PAINTSTRUCT 结构的地址
);

源码片段示例:

// ......
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// 其他GDI代码
EndPaint(hwnd, &ps);
return ;
// ......

2、调用 GetDC 函数(用于响应非 WM_PAINT 消息)

GetDC 函数只有一个参数,即当前的窗口句柄,它将设备环境句柄作为返回值返回。在使用完设备环境句柄后,必须调用 ReleaseDC 函数将其释放,它有两个参数,第一个是当前的窗口句柄,第二个是要释放的设备环境句柄。

源码片段示例:

// ......
hdc = GetDC(hwnd);
// 其他GDI代码
ReleaseDC(hwnd, hdc);
return 0;
// ......

GetDC / ReleaseDC 组合通常用于处理键盘消息或(与)鼠标消息。

需要注意的地方(小结)

  • WM_PAINT 消息的产生,表示窗口客户区需要重绘。
  • BeginPaint 函数返回的是无效矩形客户区(PAINTSTRUCT 结构中的 rcPaint 字段)的设备环境句柄,而 GetDC 函数返回的是整个客户区的设备环境句柄。
  • BeginPaint 函数调用后,无效矩形区域将变得有效化;而 GetDC 函数本身不会使客户区无效区域有效化,需要自行调用 ValidateRect 函数使客户区无效区域有效化。

GDI 设备环境句柄(2)的更多相关文章

  1. VB中的GDI编程-1 设备环境DC

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  2. Visual C++ 打印编程技术-内存设备环境

    1.内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示 ...

  3. Wince 设备环境和画笔应用

    本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会 ...

  4. [转]Device Context 设备环境 设备上下文 理解

    http://blog.csdn.net/p424671075/article/details/7235601

  5. DirectDraw读书笔记

    DirectDraw对象 DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用Dire ...

  6. DirectX中文手册

    目  录 第一章 DirectX基础(初级篇) 第一节  什么是DirectX 一.什么是DirectX ? 二.DirectX的组成部分 三.关于DirectDraw 四.为什么要使用DirectD ...

  7. Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤

    http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...

  8. 06 Windows编程——设备句柄 和 WM_PAINT消息

    windows程序在现实方式上属于图形方式,和文字方式的显示,有显著的不同. 什么是设备句柄,如何获取 使用统一的数据结构表示某一设备,这个结构就是设备句柄. 源码 #include<Windo ...

  9. 第5章 绘图基础_5.1-5.4 GDI绘图

    5.1 GDI的原理和结构 (1)提供一种特殊机制彻底隔离应用程序与不同输出设备(eg.显示器或打印机),以便支持 与设备无关的图形. 光栅设备(如显示器.激光打印机):图像是由点构成的矩阵 图形输出 ...

随机推荐

  1. windows下本地安装oracle忘记密码,账号被锁咋办

    忘记密码咋办: 进入cmd,输入set ORACLE_SID=ymxg  (ORACLE_SID的值为你想登录的oracle实例的SID) 然后输入:sqlplus / as sysdba 最后输入: ...

  2. Java内联函数

    1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,參数压栈,返回时參数出栈以及资源释放等,这样提高了程序运行速度. 2.Java语言中有一个keywordfinal来指明 ...

  3. bootstrap checkbox

    在使用bootstrap库中的checkboxlistrow时,我想要依据checkbox是否至少选中了一个选项来确定页面的跳转,即须要在js中操作checkbox.这样就存在一个问题,一般的chec ...

  4. 网络编程----堵塞、非堵塞和同步、异步IO

    我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...

  5. HDU 2586 How far away ?(LCA模板 近期公共祖先啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the vi ...

  6. Web API接口设计(学习)

    1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...

  7. sql处理高并发

    sql处理高并发,防止库存超卖 2014-08-14 23:44 13560人阅读 评论(2) 收藏 举报  分类: 数据库(43)  今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖 ...

  8. ios业务模块间互相跳转的解耦方案

    *此文章需有一点runtime的知识,假设你不了解runtime,<高速理解Runtime of Objective-C>: http://mp.weixin.qq.com/s?__biz ...

  9. Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D【转】

    本文转载自:http://blog.csdn.net/maopig/article/details/7230311 在源代码里面如果这样是定义的:#ifdef   MACRONAME//可选代码#en ...

  10. ReflectionSugar 通用反射类

    http://www.cnblogs.com/sunkaixuan/p/4635710.html