GDI 设备环境句柄(2)
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)的更多相关文章
- VB中的GDI编程-1 设备环境DC
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- Visual C++ 打印编程技术-内存设备环境
1.内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示 ...
- Wince 设备环境和画笔应用
本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会 ...
- [转]Device Context 设备环境 设备上下文 理解
http://blog.csdn.net/p424671075/article/details/7235601
- DirectDraw读书笔记
DirectDraw对象 DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用Dire ...
- DirectX中文手册
目 录 第一章 DirectX基础(初级篇) 第一节 什么是DirectX 一.什么是DirectX ? 二.DirectX的组成部分 三.关于DirectDraw 四.为什么要使用DirectD ...
- Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤
http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...
- 06 Windows编程——设备句柄 和 WM_PAINT消息
windows程序在现实方式上属于图形方式,和文字方式的显示,有显著的不同. 什么是设备句柄,如何获取 使用统一的数据结构表示某一设备,这个结构就是设备句柄. 源码 #include<Windo ...
- 第5章 绘图基础_5.1-5.4 GDI绘图
5.1 GDI的原理和结构 (1)提供一种特殊机制彻底隔离应用程序与不同输出设备(eg.显示器或打印机),以便支持 与设备无关的图形. 光栅设备(如显示器.激光打印机):图像是由点构成的矩阵 图形输出 ...
随机推荐
- States of Integrity Constraints
States of Integrity Constraints As part of constraint definition, you can specify how and when Oracl ...
- Timus - 1213 - Cockroaches!
先上题目: 1213. Cockroaches! Time limit: 1.0 secondMemory limit: 64 MB It's well-known that the most ten ...
- Ningx初学
原文地址 1. 到官网下载Ningx 2. 启动 2.1双击nginx.exe图标,可见黑窗口一闪而过,启动完毕. 2.2 命令行到nginx目录,输入nginx启动.(注,此方式命令行窗口无任何提示 ...
- 洛谷—— P1784 数独
https://www.luogu.org/problem/show?pid=1784 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字 ...
- 关于使用sudo命令后找不到JAVA_HOME的问题
今天在虚拟机搭建zookeeper环境,结果死活运行不起来,唯一的信息只有out文件里“没有java命令”这一个提示,找来找去发现是找不到java运行环境.可是很奇怪,明明我已经配置了,而且在终端执行 ...
- HTML【2】表单提交与服务层的模拟(具体解释get与post提交方式的不同)
在HTML[1]中已经说明了HTML编程的基本方式,最后说到了表单提交的方式有get和post方式.那么究竟什么是get/post 方式呢,两者有什么差别?如今我就详细的介绍一下. 首先回想一下表单的 ...
- Google Style Guides-Shell Style Guide
作者声明 这篇翻译文章对我来说是有点小挑战的.由于我英语实在非常烂,勉强能够看懂一些技术文档,能够猜出大概的含义.可是翻译对我来说算是一个挑战,看英文文档已经不是一天两天的事了,可是这个篇文章却是我的 ...
- Linux Terminal fortune
Linux下,我们能够使用apt-get安装fortune,这是一个比較有趣的功能 在输入fortune之后,Terminal会输出一句名言.诗句,或一些有趣的话: 默认情况下.fortune仅仅会显 ...
- 64bit Centos6.4搭建hadoop-2.5.1
64bit Centos6.4搭建hadoop-2.5.1 1.分布式环境搭建 採用4台安装Linux环境的机器来构建一个小规模的分布式集群. 当中有一台机器是Master节点,即名称节点,另外三台是 ...
- HTTP详解工作原理
1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...