函数功能
该函数为指定的设备环境设置图形模式。
函数原型:int SetGraphicsMode(HDC hdc, int iMode);
参数:
hdc:指向设备环境的句柄。
iMode:指定图形模式,该参数可为下列值之一:
GM_COMPATIBLE:设置与16位Windows相兼容的图形模式,这是缺省的模式。如果指定此值,应用程序只能通过调用设置窗口视窗范围和原点的函数来改变全局到设备的转换,但不是通过利用
SetWorldTransform或
ModifyWorldTransform,调用这些函数将失败,设置窗口和视窗范围和原点的函数的例子为
SetViewportExtEx和
SetwindowExtEx函数。
GM_ADVANCED:Windows NT和Windows 98:设置高级图形模式,允许全局转换。如果应用程序设置或改变指定设备环境的全局转换,必须规定该值在这种模式中,所有的图形,包括
文本输出,全部转换为设备环境规定的全局到设备的转换。
Windows 95:不支持GM_ADVANCED,当操作增强的元文件时,Windows 95试图使Windows95中的增强的元文件看起来与在Windows NT上操作一样。为完成此功能,Windows 95当操作指定的增强元文件记录时,可以模仿GM_ADVANCED模式。
返回值:如果调用成功,返回值为老图形模式,调用失败,返回值为零。若想获得更多
错误信息,请调用
GetLastError函数。
备注:根据图形模式,有3种不同的表格输出:
TextOutput:在GM_COMPATIBLE模式中,
TrueType(或
矢量字体)
文本输出时的操作方式就该DC中全局到设备转换而言很象
光栅字体文本输出。TrueType文本总是按从左到右和从上到下的顺序写,即使图形的剩余部分在X或Y轴被翻动,只有TrueType(或矢量字体)文本的高被定为合适的高度,在GM_COMPATIBLE模式中写非水平文本的唯一办法,是为该设备环境中选举的字体指定非零表格的大小和方向。
在GM_ADVANCED模式中
TrueType(或矢量字体)文本输出完全转换为设备环境中域到设备的转换,光栅字体只有很受局限的转换能力(通过某些整型系数来伸展)。图形设备界面(GDI)试图创造出最好的输出。
Rectangle Exclusion:如果设置缺省的GM_COMPATIBLE图形模式,当画长方形时,系统不包括底部和最右的边。GM_ADVANCED图形模式应用于画底边和右边包括在内的长方形。
Arc Drawing:如果设置缺省的GM_COMPATIBLE图形为模式,GDI用设备空间中当前弧的方向来画弧,根据此协议,弧不管页面到设备的转换,此转换要求沿着X或Y轴的翻动。如果设置了GM_ADVANCED图形模式,GDI总是在逻辑空间逆时针方向画弧。这就是说在GM_COMPATIBLE图形模式中,弧控制点和弧本身,都全遵从设备环境的全局到设备的转换。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。
文字显示
请看下面的代码
void GDITest(HWND hwnd)
{
RECT rect;
LOGFONT logFont;
SetGraphicsMode(hDC,GM_ADVANCED); //(3)
SetMapMode(hDC, MM_ISOTROPIC);
SetWindowExtEx(hDC,5000, ±5000,NULL); //(4)
SetViewportExtEx(hDC,rect.right,rect.bottom,NULL);
SetViewportOrgEx(hDC,rect.right >> 1,rect.bottom >> 1,NULL);
ZeroMemory(&
logFont,sizeof(logFont));
logFont.lfCharSet = GB2312_CHARSET;
logFont.lfHeight = -1000;
HFONT hFont = CreateFontIndirect(&logFont);
TextOut(hDC,0,0,szStr,
lstrlen(szStr));
DeleteObject(SelectObject(hDC,
GetStockObject(SYSTEM_FONT)));
}
(4)中的±对输出是有影响的,见图1。亦即:当逻辑坐标系y轴与设备坐标系y轴方向相反时,会导致字体输出的上下颠倒。
将(3)改为SetGraphicsMode(hDC,GM_COMPATIBLE);则±对输出毫无影响。这些说明:
1、对于SetGraphicsMode(hDC,GM_COMPATIBLE)而言,Windows 仅将文字高度和文字参考点(reference point——输出文字时的基准点)转换到设备坐标系,然后在设备坐标系下进行
文本输出;
2、对于SetGraphicsMode(hDC,GM_ADVANCED)而言,对
文本的处理就比较麻烦了:我猜测是将所有文本的轮廓点从
世界坐标系转换至设备坐标系,然后再内部填充处理。这样的转换更加彻底、完美!