【20060307發(fā)表于blog.csdn.net,20090403重編輯】
1、GDI名字的意義
GDI Graphic Device Interface,我說不清和GUI有什么區(qū)別。可能一種針對設(shè)備,一種針對用戶而言吧,反正以后都說GDI,也就是Windows的圖形編程。
2、設(shè)備描述上下文HDC
Handle Device Context
這個是關(guān)鍵的關(guān)鍵,可以理解成畫圖的環(huán)境,何謂環(huán)境?畫板,紙,筆,尺寸,字體,顏色,區(qū)域等。反正包括你能想到的和未能想到的了。要畫出不同的圖形,很大程度上是對HDC的修改。
3、HDC的創(chuàng)建方式
WM_PAINT消息來的時候,用:
hdc = BeginPaint(hwnd, &ps);
//...
EndPaint(hwnd, &ps);
結(jié)束后ps區(qū)域自動變有效。還有:
hdc = GetDC(hwnd);
//...
ReleaseDC(hwnd, hdc);
這一對需要調(diào)用ValidateRect()函數(shù)來使得區(qū)域有效。
還有別的辦法,但不常用,這里略過。不過有一個還是值得一說,那就是取得Window HDC的辦法,用它可以在Windows非客戶區(qū)畫圖:
hdcWindow = GetWindowDC(hwnd);
//...
ReleaseDC(hwnd, hdcWindow);
4、獲取HDC信息
GetDeviceCaps()
其中比較重要的指標(biāo)是:
HORZRES - horizontal resolution
VERTRES - vertical resolution
BITSPIXEL - 色深
5、保存HDC與還原HDC
SaveDC(hdc);
RestoreDC(hdc, -1);
6、畫圖畫圖!
//[偽碼]
// ----- 點(diǎn) -----
//畫點(diǎn)
SetPixel(hdc, x, y, crColor);
//取點(diǎn)顏色
crColor = GetPixel(hdc, x, y);
// ----- 直線 -----
//最后一參數(shù)為NULL表示不返回最后點(diǎn)
MoveToEx(hdc, x, y, lpPrevPoint);
//畫線
LineTo(hdc, x, y);
//畫多線,不移動當(dāng)前點(diǎn)
Polyline(hdc, lpPoint, cPointNum);
//畫多線,移動當(dāng)前點(diǎn)
PolylineTo(hdc, lpPoint, cPointNum);
//畫多組多線
PolyPolyline(hdc, lppt, lpNum, cCount);
//----- 曲線 -----
//畫橢圓線
Arc();
//畫比澤爾曲線,不移動但前點(diǎn)
PolyBezier();
//畫比澤爾曲線,移動當(dāng)前點(diǎn)
PolyBezierTo();
//----- 區(qū)域 -----
//畫矩形
Rectangle();
//畫橢圓
Ellipse();
//畫帶圓角的矩形
RoundRect();
//畫扇
Pie();
//畫弓
Chord();
7、畫筆HPEN(改變線條)
方法1:
HPEN hPen = GetStockObject(ARGUMENTS);
ARGUMENTS為:BLACK_PEN 黑筆WHITE_PEN 白筆
HPEN hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
DelectObject(hPen);
方法2:
HPEN hPen = CreatePen(iPenStyle, iWidth, crColor);
iPenStyle為:PS_SOLID實(shí)線PS_DASH虛線PS_DOT點(diǎn)線PS_DASHDOT虛點(diǎn)線PS_DASHDOTDOT虛雙點(diǎn)線PS_NULL空線PS_INSIDEFRAME??
DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));
獲取畫筆信息:
GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);
選出HDC中的畫筆:
hPen = GetCurrentObject(hdc, OBJ_PEN);
8、背景模式
改變背景模式,也就是制定虛線間間隙的填充問題了:
SetBkColor(hdc, crColor);
SetBkMode(hdc, TRANSPARENT);
SetBkMode(hdc, OPAQUE);
有Set嘛,相應(yīng)地有Get了,這里略過。
9、疊加模式
SetROP2(hdc, iDrawMode);
iDrawMode = GetROP2(hdc);
10、畫刷HBRUSH(改變填充)
畫刷能指明區(qū)域填充模式。
方法1:
HBRUSH hBrush = GetStockObject(GRAY_BRUSH);
SelectObject(hdc, hBrush);
方法2:
HBRUSH hBrush = CreateSolidBrush(crColor);
HBRUSH hBrush = CreateHatchBrush(iHatchStyle, crColor);
11、多邊形填充模式及畫多邊形
SetPolyFillMode(hdc, iMode); //iMode:ALTERNAME WINDING
Polygon();
12、區(qū)域HRGN(繪畫范圍)
HRGN hRgn = CreateRectRgn(x1, y1, x2, y2);
HRGN hRgn = CreateRectRgnIndirect(&rect);
HRGN hRgn = CreateEllipticRgn(x1, y1, x2, y2);
HRGN hRgn = CreateEllipticRgnIndirect(&rect);
區(qū)域合并
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); //iCombine: RGN_AND, RGN_OR, RGN_XOR, RGN_DIFF, RGN_COPY
注意:hDestRgn, hSrcRgn1, hSrcRgn2都必須有效。
FillRgn(); //填充區(qū)域。
FrameRgn(); //給區(qū)域畫邊。
InvertRgn(); //反轉(zhuǎn)區(qū)域。
HRGN hRgnPrev = SelectObject(hdc, hRgn); //將區(qū)域放置入HDC。
使區(qū)域無效/有效:
InvalidateRgn(hRgn);
ValidateRgn(hRgn);