我在修改dst rectangle 的大小时,需要用到当前display device的 width 和Height,即分辨率。如果直接从driver里获取就会涉及到很多函数和变量,比较麻烦。
最后使用EnumDisplaySettings()解决了问题。
现将此函数的用法和例子整理出来:
函数原型:
BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode);
参数:
lpszDeviceName:指向一个以null的结尾的字符串,该字符串指定了显示设备。此函数将获得该显示设备的图形模式信息。该参数可以为NULL。NULL值表明调用线程正运行在计算机的当前显示设备上。如果lpszDeviceName为NULL,该字符串的形式为\\.\displayx,其中x的值可以为1、2或3。对于Windows 95和Windows 98,lpszDeviceName必须为NULL。
iModeNum:表明要检索的信息类型,该值可以是一个图形模式索引,也可以是下列一值: ENUM_CURRENT_SETTINGS:检索显示设备的当前设置。 ENUM_REGISTRY_SETTINGS:检索当前存储在注册表中的显示设备的设置。 图形模式索引值从零开始,要得到一个显示设备的所有图形模式信息,可以一系列地调用EnumDisplaySettings函数,并且iModeNum显为一个非零值时,则函数返回的信息是最近一次使用iModeNum置为零调用该函数时存储的信息。 lpDevMode:DEVMODE结构的指针,该结构存储指定图形模式的信息,在调用EnumDisplaySettings之前,设置dmSize为sizeof(DEVMODE),并且以字节为单位,设置dmDriveExtra元素为接收专用驱动数据可用的附加空间。 EnumDisplaySettings函数设置如下五个DEVMODE元素的值: dmBitsPerpel、dmPelsWidth、dmPelsHeight、dmDisplayFlags 、 dmDisplayFrequency 。 返回值:如果成功,返回非零值;如果失败,返回零。
The DEVMODE data structure contains information about the initialization and environment of a printer or a display device.
typedef struct _devicemode { TCHAR dmDeviceName[CCHDEVICENAME]; WORD dmSpecVersion; WORD dmDriverVersion; WORD dmSize; WORD dmDriverExtra; DWORD dmFields; union { struct { short dmOrientation; short dmPaperSize; short dmPaperLength; short dmPaperWidth; short dmScale; short dmCopies; short dmDefaultSource; short dmPrintQuality; }; struct { POINTL dmPosition; DWORD dmDisplayOrientation; DWORD dmDisplayFixedOutput; }; }; short dmColor; short dmDuplex; short dmYResolution; short dmTTOption; short dmCollate; TCHAR dmFormName[CCHFORMNAME]; WORD dmLogPixels; DWORD dmBitsPerPel;//颜色分辨率,in bits per pixel, of the display device (for example: 4 bits for 16 colors, 8 bits for 256 colors, or 16 bits for 65,536 colors). Display drivers use this member, for example, in the ChangeDisplaySettingsfunction. Printer drivers do not use this member. DWORD dmPelsWidth;.//显示设备surface的宽度,单位pixel DWORD dmPelsHeight;////显示设备surface的高度,单位pixel
union { DWORD dmDisplayFlags; DWORD dmNup; }; DWORD dmDisplayFrequency;#if (WINVER >= 0x0400) DWORD dmICMMethod; DWORD dmICMIntent; DWORD dmMediaType; DWORD dmDitherType; DWORD dmReserved1; DWORD dmReserved2;#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400) DWORD dmPanningWidth; DWORD dmPanningHeight;#endif #endif } DEVMODE, *PDEVMODE, *LPDEVMODE;
使用举例:
DEVMODE devmode;
BOOL Isgetdisplay=0;
memset(&devmode,0,sizeof (devmode));
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDriverExtra = 0;
Isgetdisplay=EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
if(!Isgetdisplay)
{
assert(0);
}
maxWidth=devmode.dmPelsWidth;
maxHeight=devmode.dmPelsHeight;