《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;      //描述

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值