SetGraphicsMode

SetGraphicsMode是計算機函式。

函式功能

SetGraphicsMode SetGraphicsMode

該函式為指定的設備環境設定圖形模式。 函式原型: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)

{

HDC hDC = GetDC(hwnd);

TCHAR* szStr = _T("GDI測試");

RECT rect;

LOGFONT logFont;

SetGraphicsMode(hDC,GM_ADVANCED); //(3)

SetMapMode(hDC, MM_ISOTROPIC);

SetWindowExtEx(hDC,5000, ±5000,NULL); //(4)

GetClientRect(hwnd,▭);

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;

lstrcpy(logFont.lfFaceName,_T("宋體"));

HFONT hFont = CreateFontIndirect(&logFont);

SelectObject(hDC,hFont);

TextOut(hDC,0,0,szStr,lstrlen(szStr));

DeleteObject(SelectObject(hDC,GetStockObject(SYSTEM_FONT)));

ReleaseDC(hwnd,hDC);

}

(4)中的±對輸出是有影響的,見下圖。亦即:當邏輯坐標系y軸與設備坐標系y軸方向相反時,會導致字型輸出的上下顛倒。

將(3)改為SetGraphicsMode(hDC,GM_COMPATIBLE);則±對輸出毫無影響。這些說明:

1、對於SetGraphicsMode(hDC,GM_COMPATIBLE)而言,Windows 僅將文字高度和文字參考點(reference point——輸出文字時的基準點)轉換到設備坐標系,然後在設備坐標系下進行文本輸出;

2、對於SetGraphicsMode(hDC,GM_ADVANCED)而言,對文本的處理就比較麻煩了:我猜測是將所有文本的輪廓點從世界坐標系轉換至設備坐標系,然後再內部填充處理。這樣的轉換更加徹底、完美!

相關詞條

相關搜尋

熱門詞條

聯絡我們