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[32];
} 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 0;
// ......

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 函数使客户区无效区域有效化。

原文地址:https://www.cnblogs.com/yenyuloong/p/9076528.html

时间: 2024-11-01 17:57:10

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

点击回应、关闭确认以及另一种获取设备环境句柄的方法

API模板:https://www.cnblogs.com/eternalmoonbeam/p/10793080.html 点击回应: switch (message) { …… case WM_LBUTTONUP://当鼠标左键弹起 MessageBox(NULL, TEXT("I was clicked"), TEXT("Client"), MB_OK); return 0; …… } 关闭确认: switch (message) { …… case WM_CL

[00016]-[2015-09-05]-[00]-[Window GDI编程 --- 设备环境]

[设备环境] DC(Device Context)在这里我们需要明白一点 Windows SDK 和 MFC类封装 绘图编程的一点区别Window SDK 由于是纯粹采用WindowAPI 来实现编程 有自己的应用程序测基本框架MFC 由于采用采用类封装的机制 将C++面向对象编程和windows的消息机制很好地结合在一起 Window SDK 绘图注重句柄的操作所以 HDC HBRUSH HBITMAP等类型的变量比较常用MFC中 CDC CBURSH CBitmap等类的变量操作比较常见,但

Wince -06设备环境和画笔应用

本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会用到. 画笔颜色的表示: 颜色用COLORREF类型标识 PGR(cRed,cGreen,cBlue)给COLORREF赋值: 这里一般英文前面都加一个小写字母,而相应的单词首字母是大写.(这里涉及到匈牙利命名法) 取值范围为0~255之间,举例: RGB(0X00,0X00,00)------表示

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

内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示的位图复制到内存设备环境中,最后再从内存设备环境复制到真实的设备环境,从而把位图显示出来. eg: void CMainFrame::OnBitmapDraw() { CDC* pCDC=GetDC(); //获取当前设备上下文 CBitmap bitmap; //定义CBitmap对象 bitmap.

aix裸设备环境下为数据库添加新的数据文件

裸设备环境下,数据如果要添加数据文件比其他环境要稍微麻烦点,因为一个裸设备下面只能创建一个数据文件,以下为一次添加数据文件的记录,如下: 1.查看卷组lsvg 2查看物理卷 3.查看逻辑卷  lspv显示在卷组中的物理卷信息 4.lsvg  datavg 5.如果有closed就表示没用的 6.alter tablespace ZL9EPRLOB Add datafile '/dev/rora_data017_8g' size 5000m AUTOEXTEND OFF; 7.如果没有就需要先创建

根据当前设备环境来做pc端和手机端网页显示

当你的网页使用了两套代码(移动端和pc端代码)来显示你的网页时,就需要用到这种方法: 手机端: if (!/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { window.location.href = "http://你的pc端网址"; } 电脑端: if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { wi

DirectX中文手册

目  录 第一章 DirectX基础(初级篇) 第一节  什么是DirectX 一.什么是DirectX ? 二.DirectX的组成部分 三.关于DirectDraw 四.为什么要使用DirectDraw? 五.DirectX5.0的新特性? 六.什么是部件对象模型(COM) 七.自我检测 第二节  如何安装和使用DirectX 一.编译库和运行库 二.安装 VC++ 5.0 三.安装 DirectX5.0 的 SDK 四.DirectX 5.0 的文件说明 五.卸载 DirectX 第三节 

深入GDI图像显示

摘  要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示.图像旋转显示.图像镜像显示进行了研究. 关键词:GDI图像显示,特殊GDI函数的应用,透明位图显示,图像几何变换显示 图像信息是人类认识世界的重要知识来源,人类获得的70%以上的信息来自于眼睛摄取的丰富和真切的图像.图像与计算机相结合带给人们近乎神奇的图像艺术.对于程序开发者来说,实现高速的绘图是设计漂亮友好的用户界面的基础和关键所在. 在Win32图像程序设计中,图像显示的方

GDI GDI+ 的区别

GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好.GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你还可能要知道设备,而GDI+是一个高层的API,你不必知道设备.例如你如果要设置某个控件的前景和背景色,只需设置BackColor和ForeColor属性. 编程模式的变化 “GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI