【20060307發表于blog.csdn.net,20090403重編輯】
1、GDI名字的意義
GDI Graphic Device Interface,我說不清和GUI有什么區別??赡芤环N針對設備,一種針對用戶而言吧,反正以后都說GDI,也就是Windows的圖形編程。
2、設備描述上下文HDC
Handle Device Context
這個是關鍵的關鍵,可以理解成畫圖的環境,何謂環境?畫板,紙,筆,尺寸,字體,顏色,區域等。反正包括你能想到的和未能想到的了。要畫出不同的圖形,很大程度上是對HDC的修改。
3、HDC的創建方式
WM_PAINT消息來的時候,用:
hdc = BeginPaint(hwnd, &ps);
//...
EndPaint(hwnd, &ps);
結束后ps區域自動變有效。還有:
hdc = GetDC(hwnd);
//...
ReleaseDC(hwnd, hdc);
這一對需要調用ValidateRect()函數來使得區域有效。
還有別的辦法,但不常用,這里略過。不過有一個還是值得一說,那就是取得Window HDC的辦法,用它可以在Windows非客戶區畫圖:
hdcWindow = GetWindowDC(hwnd);
//...
ReleaseDC(hwnd, hdcWindow);
4、獲取HDC信息
GetDeviceCaps()
其中比較重要的指標是:
HORZRES - horizontal resolution
VERTRES - vertical resolution
BITSPIXEL - 色深
5、保存HDC與還原HDC
SaveDC(hdc);
RestoreDC(hdc, -1);
6、畫圖畫圖!
//[偽碼]
// ----- 點 -----
//畫點
SetPixel(hdc, x, y, crColor);
//取點顏色
crColor = GetPixel(hdc, x, y);
// ----- 直線 -----
//最后一參數為NULL表示不返回最后點
MoveToEx(hdc, x, y, lpPrevPoint);
//畫線
LineTo(hdc, x, y);
//畫多線,不移動當前點
Polyline(hdc, lpPoint, cPointNum);
//畫多線,移動當前點
PolylineTo(hdc, lpPoint, cPointNum);
//畫多組多線
PolyPolyline(hdc, lppt, lpNum, cCount);
//----- 曲線 -----
//畫橢圓線
Arc();
//畫比澤爾曲線,不移動但前點
PolyBezier();
//畫比澤爾曲線,移動當前點
PolyBezierTo();
//----- 區域 -----
//畫矩形
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實線PS_DASH虛線PS_DOT點線PS_DASHDOT虛點線PS_DASHDOTDOT虛雙點線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嘛,相應地有Get了,這里略過。
9、疊加模式
SetROP2(hdc, iDrawMode);
iDrawMode = GetROP2(hdc);
10、畫刷HBRUSH(改變填充)
畫刷能指明區域填充模式。
方法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、區域HRGN(繪畫范圍)
HRGN hRgn = CreateRectRgn(x1, y1, x2, y2);
HRGN hRgn = CreateRectRgnIndirect(&rect);
HRGN hRgn = CreateEllipticRgn(x1, y1, x2, y2);
HRGN hRgn = CreateEllipticRgnIndirect(&rect);
區域合并
CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); //iCombine: RGN_AND, RGN_OR, RGN_XOR, RGN_DIFF, RGN_COPY
注意:hDestRgn, hSrcRgn1, hSrcRgn2都必須有效。
FillRgn(); //填充區域。
FrameRgn(); //給區域畫邊。
InvertRgn(); //反轉區域。
HRGN hRgnPrev = SelectObject(hdc, hRgn); //將區域放置入HDC。
使區域無效/有效:
InvalidateRgn(hRgn);
ValidateRgn(hRgn);