《Windows API每日一练》4.2 设备环境

在第三章我们已经使用设备环境句柄在窗口客户区绘图了。在图形输出设备(比如屏幕或者打印机)上绘制图形,必须首先获取设备环境,即DC的句柄。当 Windows把这个句柄交给你的程序,Windows同时也就给予你使用这个设备的权限。接着,在GDI函数中将这个句柄作为一个参数,告诉 Windows在哪个设备上进行绘图。

本节必须掌握的知识点:

        获取设备环境句柄

        获取设备环境信息

        第22练:获取设备环境信息

4.2.1 获取设备环境句柄

设备环境包含许多决定GDI函数如何工作的属性。这些属性使得GDI函数只需要提供少量的参数(如起始坐标),而不需要提供 Windows在设备上显示对象时需要的所有信息。例如,当你调用 TextOut函数时,仅需要在函数中指定设备环境句柄、起始坐标、文本以及文本的长度,不需要指定字体、文本的颜色、文本背景的颜色或者字符间距。所有这些属性都是设备环境的一部分。当你想改变这些属性时,可以调用函数来执行,之后调用的TextOut函数就会使用新的设备环境的属性。

WM_PAINT消息中获取

       在处理 WM_PAINT消息时使用 BeginPaint函数和 EndPaint函数:

hdc = BeginPaint (hwnd, &ps) ;

其他行程式

EndPaint (hwnd, &ps) ;

在其他消息中获取

hdc = GetDC (hwnd) ;

其他行程式

ReleaseDC (hwnd, hdc) ;

EndPaint函数组合与GetDC函数组合的主要差别是:

EndPaint函数获取无效区域的设备环境句柄。

GetDC函数返回的是整个窗口客户区的设备环境句柄。并且GetDC和 ReleaseDC函数并不使任何客户区的无效区域变为有效。

获取屏幕设备环境句柄

hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ;

其他行程式

DeleteDC (hdc) ;

例如,可以通过调用下面的函数获取当前整个屏幕的设备环境句柄:

hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;

此外,我们还将在第十三章使用CreateDC函数获取打印机设备环境句柄。

获取内存设备环境句柄

hdcMem = CreateCompatibleDC (hdc) ;

其他行程式

DeleteDC (hdcMem) ;

可以把一个位图选入内存设备环境,并且调用GDl函数绘制这个位图。我将在第十四章介绍这些技术。

获取整个窗口设备环境句柄

hdc = GetWindowDC (hwnd) ;

其他行程式

ReleaseDC (hwnd, hdc) ;

这里的设备环境除了包括客户区,还包含窗口标题栏、菜单、滚动条和客户区的外框。应用程序很少使用 GetWindowDC函数。如果你想尝试使用它,则还应当捕获WM_NCPAINT( nonclient paint,非客户区绘制)消息,Windows使用这个消息在窗口的非客户区绘图。

获取设备环境信息

CreateIC 函数为指定设备创建信息上下文。信息上下文提供了一种快速获取有关设备的信息的方法,而无需创建设备上下文 (DC) 。但是,GDI 绘图函数不能接受信息上下文的句柄。

HDC CreateIC(

  LPCTSTR lpszDriver,         // 驱动程序的名称或驱动程序文件名

  LPCTSTR lpszDevice,         // 设备的名称

  LPCTSTR lpszOutput,         // 输出端口的名称

  const DEVMODE *lpInitData   // 设备的初始化数据

);

获取图元文件设备环境句柄

hdcMeta = CreateMetaFile (pszFilename) ;

其他行程式

hmf = CloseMetaFile (hdcMeta) ;

在图元文件设备环境有效时,使用 hdcMeta所做的任何GDI调用都不会被直接显示出来,它们都会变成图元文件的一部分。当你调用 CloseMetaFile时,图元文件设备环境句柄变为无效,该函数返回一个图元文件句柄(hmf)。我将在第十七章讨论图元文件。

4.2.2 获取设备环境信息

设备环境通常指的是物理的显示设备,如视频显示器或者打印机。经常需要获取这些设备的某些信息,包括显示器的大小(以像素或者物理尺寸的方式)和它的色彩能力。这些信息可以通过调用 GetDeviceCaps(意思为获取设备的能力)函数来获取。

iValue = GetDeviceCaps (hdc, iIndex) ;

其中,参数 iIndex是定义在 WINGDL.H头文件中的29个标识符之一。例如,当 iIndex的值为 HORZRES时, GetDeviceCaps函数以像素为单位返回设备的宽度;使用ⅤERTRES参数值会以像素为单位返回设备的高度。如果hdc是一个屏幕设备环境的句柄,这里所获取的信息和从 GetSystemMetrics函数获取的信息是一样的。如果hdc是一个打印机设备环境,那么 GetDevice Caps将以像素为单位返回打印机显示区域的高度和宽度。

还可以使用 GetDeviceCaps函数来确定设备处理各种类型图形的能力。通常这对于视频显示器并不重要,但是对于打印机却非常重要。例如,大多数的绘图仪不能绘制位图图像,通过调用 GetDeviceCaps函数可以让你提前知道这一情况。我们将在接下来的实例中演示GetDeviceCaps函数的使用方法。

4.2.3 第22练:获取设备环境信息

/*------------------------------------------------------------------

022. 编程达人win32 API每日一练

     第22个例子DEVCAPS1.C:获取显示器设备环境信息

      GetDeviceCaps函数

(c) www.bcdaren.com, 2020

----------------------------------------------------------------*/

#include <windows.h>

#define NUMLINES ((int)(sizeof devcaps / sizeof devcaps[0])) //行数

struct 

{

     int iIndex;         //索引

     TCHAR *szLable;     //系统信息

     TCHAR *szDesc;      //描述

}

devcaps[]=     //结构数组

{

     HORZSIZE,      TEXT("HORZSIZE"),       TEXT("Width in millimeters:"),

     VERTSIZE,      TEXT("VERTSIZE"),       TEXT("Height in millimeters:"),

     HORZRES,       TEXT("HORZRES"),        TEXT("Width in pixels:"),

     VERTRES,       TEXT("VERTRES"),        TEXT("Height in raster lines:"),

     BITSPIXEL,     TEXT("BITSPIXEL"),      TEXT("Color bits per pixel:"),

     PLANES,        TEXT("PLANES"),         TEXT("Number of color planes:"),

     NUMBRUSHES,    TEXT("NUMBRUSHES"),     TEXT("Number of device brushes:"),

     NUMPENS,       TEXT("NUMPENS"),        TEXT("Number of device pens:"),

     NUMMARKERS,    TEXT("NUMMARKERS"),     TEXT("Number of device markers:"),

     NUMFONTS,      TEXT("NUMFONTS"),       TEXT("Number of device fonts:"),

     NUMCOLORS,     TEXT("NUMCOLORS"),      TEXT("Number of device colors:"),

     PDEVICESIZE,   TEXT("PDEVICESIZE"),    TEXT("Size of devicestructure:"),

     ASPECTX,       TEXT("ASPECTX"),        TEXT("Relative width of pixel:"),

     ASPECTY,       TEXT("ASPECTY"),        TEXT("Relative height of pixel:"),

     ASPECTXY,      TEXT("ASPECTXY"),      TEXT("Relative diagonal of pixel:"),

     LOGPIXELSX,    TEXT("LOGPIXELSX"),     TEXT("Horizontal dots per inch:"),

     LOGPIXELSY,    TEXT("LOGPIXELSY"),     TEXT("Vertical dots per inch:"),

     SIZEPALETTE,   TEXT("SIZEPALETTE"),    TEXT("Number of palette entries:"),

     NUMRESERVED,   TEXT("NUMRESERVED"),    TEXT("Reserved palette entries:"),

     COLORRES, TEXT("COLORRES"), TEXT("Actual color resolution:")

};

/*****************************************************************************/

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 PSTR szCmdLine, int iCmdShow)

{

     static TCHAR szAppName[] = TEXT ("DEVCAPS1.C") ;

     (略)

     return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static int cxChar, cxCaps, cyChar;

     HDC hdc ;

     int i;

     PAINTSTRUCT ps ;

     TCHAR szBuffer[10] ;

     TEXTMETRIC tm

     switch (message)

     {

     case WM_CREATE:

          hdc = GetDC (hwnd) ;

          GetTextMetrics (hdc, &tm) ;

          cxChar = tm.tmAveCharWidth ; //字符平均宽度

          //平均字符宽度cxCaps设为cxChar的1.5倍。1表示变宽字体

          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;

          cyChar = tm.tmHeight + tm.tmExternalLeading ; //字符行距

          ReleaseDC (hwnd, hdc) ;

          return 0 ;

     case WM_PAINT :

           hdc = BeginPaint (hwnd, &ps) ; 

          for (i = 0 ; i < NUMLINES ; i++)

          {

               TextOut(hdc, 0, cyChar * i,devcaps[i].szLable,

                    lstrlen(devcaps[i].szLable));

               TextOut(hdc, 14 * cxCaps, cyChar*i,devcaps[i].szDesc,

                    lstrlen(devcaps[i].szDesc));

               SetTextAlign(hdc, TA_RIGHT | TA_TOP);

               TextOut(hdc, 14 * cxCaps + 35 * cxChar, cyChar * i, szBuffer,

                    wsprintf(szBuffer, TEXT("%5d"),

                         GetDeviceCaps(hdc,devcaps[i].iIndex)));

               SetTextAlign(hdc, TA_LEFT | TA_TOP);

          }

          EndPaint(hwnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return DefWindowProc(hwnd, message, wParam, lParam);

}

/*****************************************************************

GetDeviceCaps功能检索指定设备的设备特定的信息

int GetDeviceCaps(

  HDC hdc,     //设备环境句柄

  int index    //设备环境信息索引

);

返回值指定所需项目的值。

******************************************************************

类似的API:

GetSystemMetrics函数:检索指定的系统指标或系统配置设置。

int GetSystemMetrics(int nIndex   //要检索的系统指标或配置设置);

*/

       运行结果:

图4-1 获取显示设备信息

 

总结

       DEVCAPS1.C的代码实现非常简单,定义了一个显示设备信息的结构数组,然后在WM_PAINT消息中循环输出GetDeviceCaps(hdc,devcaps[i].iIndex)));获取的显示设备信息。

       GetDeviceCaps 函数用于检索指定设备上下文的设备能力信息。它可以查询设备的各种能力,如分辨率、颜色深度、支持的功能等。

int GetDeviceCaps(

  HDC hdc,      // 设备上下文句柄

  int nIndex    // 设备能力的索引

);

返回值:

如果函数成功,返回设备能力的值,具体取决于 nIndex 参数。

如果函数失败,返回值为 0。

iIndex

iValue(返回值)

备注

HORZRES

以像素为单位的设备宽度

1、当hdc为整个屏幕DC时,与GetSystemMetrics获得的信息一致。

2、当hdc为打印机时,获得的是打机印显示区域的宽度和高度。

VERTRES

以像素为单位的设备高度

HORZSIZE

以毫米为单位的屏幕宽度

1、Windows98下:

HORZSIZE = 25.4×HORZRES/LOGPIXELSX.

VERTSIZE = 25.4×VERTRES/LOGPIXELSY

2、Windows NT下:为"标准显示器”的大小,即320×240,但可通过上述公式算出这两个真实的值出来。

3、对于打印机是物理尺寸,对于显示器是逻辑尺寸。

VERTSIZE

以毫米为单位的屏幕高度

LOGPIXELSX

每英寸的水平像素数

1、对于打印机:可以用上述公式运算出来。

2、对于显示器:与Windows设置的字体有关:正常字体96dpi,大字体为120dpi

LOGPIXELSX

每英寸的垂直像素数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712282.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节智能体平台:扣子原理和实践案例

完整内容&#xff1a; 字节智能体平台&#xff1a;扣子原理和实践案例

Day52 代码随想录打卡|二叉树篇---二叉搜索树中的众数

题目&#xff08;leecode T501&#xff09;&#xff1a; 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c…

什么是GPT-4

什么是GPT-4 ChatGPT 可以说&#xff0c;ChatGPT的发展&#xff0c;主要的分水岭在GPT-4&#xff0c;GPT-4主要是文本对话&#xff0c;且训练度也不够完善。GPT-4之后不但训练度得到了巨大提升&#xff0c;模型支持的参数量更是预计有1万亿参数&#xff0c;在这之后出现的GPT-4…

正运动邀您共聚2024深圳激光展,助力激光加工与智能制造!

■展会名称 2024深圳激光展 ■展会日期 2024年6月19日 - 21日 ■展馆地点 深圳国际会展中心&#xff08;新馆&#xff09; ■展位号 9H - D101 6月19至21日&#xff0c;深圳激光展将在中国深圳国际会展中心(新馆)举办。 激光加工在消费电子、光伏锂电新能源、半导体等行…

themleaf 页面弹层取值

themleaf 页面弹层取值 创作背景themleaf页面事件onbluronclick 页面参数提交 创作背景 个人在日常开发中&#xff0c;遇到了一个需求页面&#xff0c;页面交互较多&#xff0c;用到的事件也很丰富&#xff0c;特此记录&#xff0c;方便后续查找也方便有需要的开发者采用&…

shell文本三剑客 awk 和 grep

awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep&#xff0c;sed&#xff0c;awk。行内将之称为文本三剑客&#xff0c;就功能量和效率来看&#xff0c;awk是当之无愧的文本三…

代码随想录算法训练营day22|701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点、 235. 二叉搜索树的最近公共祖先

701.二叉搜索树中的插入操作 这道题较为简单&#xff0c;只需要通过递归找到符合要求的叶子节点&#xff0c;并将节点插入即可。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(…

软件体系结构笔记(自用)

来自《软件体系结构原理、方法与实践&#xff08;第三版&#xff09;》清华大学出版社 张友生编著 1-8章12章 复习笔记 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01;

【每日刷题】Day65

【每日刷题】Day65 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 175. 计算二叉树的深度 - 力扣&#xff08;LeetCode&#xff09; 2. 序列找数_牛客题霸_牛客网…

(新)Spring Security如何实现登录认证(实战篇)

一、回顾认证流程详解 概念速查: Authentication接口: 它的实现类&#xff0c;表示当前访问系统的用户&#xff0c;封装了用户相关信息。 AuthenticationManager接口&#xff1a;定义了认证Authentication的方法 UserDetailsService接口&#xff1a;加载用户特定数据的核心接…

内网安全【2】-域防火墙

1.判断什么时候用代理 2.判断什么时候用隧道 3.判断出网和不出网协议 4.如何使用代理建立节点并连接 5.如何使用隧道技术封装协议上线 6.判断哪些代理或隧道情况选择放弃 代理技术&#xff1a;解决网络通讯不通的问题(利用跳板机建立节点后续操作)&#xff08;网络设置导…

【C++】STL中stack、queue、deque的使用

前言&#xff1a;在前面我们学习了List的模拟实现与使用&#xff0c;今天我们进一步的来学习stack、queue、deque的使用方法&#xff0c;然后为后面的模拟实现做一下铺垫。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff…

S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)

V90PN总线伺服驱动和S7-1200PLC通信需要安装GSD文件,PLC通过各种标准报文实现V90的位置和速度控制。 1、V90伺服驱动器控制(PN版本) V90伺服驱动器控制(PN版本)_v90 pn 最简接线-CSDN博客文章浏览阅读303次。V90伺服驱动器脉冲控制常用参数和接线,请查看下面文章链接:SMAR…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具&#xff0c;该工具使用LibAFL构建&#xff0c;可以利用VirtIO向目标设备的内核子系统提供输入测试用例&#xff0c;广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust&#xff1b; 2、修补的Q…

学习cel-go了解一下通用表达语言评估是什么

文章目录 1. 前言2. cel-go2.1 cel-go关键概念Applications(应用)Compilation(编译)Expressions(表达式)Environment环境解析表达式的三个阶段 3. cel-go的使用4. cel-go使用5. 说明6. 小结7. 参考 1. 前言 最近因为在项目里面实现的一个使用和||来组合获取字段值的功能有点儿…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代&#xff0c;创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画&#xff0c;却又苦于找不到合适的画师或高昂的费用而望而却步&#xff1f;现在&#xff0c;这一切都将成为现实&#xff01; 进入首助编辑高手的AI魔法智绘图板块…

Java—装饰器模式

介绍 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将行为添加到现有的对象中&#xff0c;而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component&#xff1a;定义一个对…

【编程技巧】降低程序复杂度:控制逻辑与业务逻辑分离

为什么要降低代码复杂度 好的项目都是迭代出来的&#xff0c;所以代码肯定是会被人维护的 降低代码复杂度就是为了降低下一个维护人的维护成本&#xff0c;更简单地理解跟修改代码 代码组成 代码逻辑 控制逻辑 业务逻辑 控制逻辑 控制业务逻辑的代码 例如&#xff1a;加缓存…

Redis-sentinel(哨兵模式)的搭建步骤及相关知识

1、什么是redis-sentinel&#xff0c;和redis主从复制相比&#xff0c;它具有什么优势 1.1、redis主从复制 Redis主从复制是一种用于数据冗余和可伸缩性的机制&#xff0c;它将一台Redis服务器的数据复制到其他Redis服务器。在这种模式下&#xff0c;数据会实时地从一个主节点…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…