Win32 GDI基礎(筆記)
1、GDI名字的意義
GDI Graphic Device Interface,我說不清和GUI有什么區別。可能一種針對設備,一種針對用戶而言吧,反正以后都說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);
畫點
取點顏色
直線
MoveToEx(hdc, x, y, lpPrevPoint);
LineTo(hdc, x, y);
Polyline(hdc, lpPoint, cPointNum);
PolylineTo(hdc, lpPoint, cPointNum);
PolyPolyline(hdc, lppt, lpNum, cCount);
最后一參數為NULL表示不返回最后點
畫線
畫多線,不移動當前點
畫多線,移動當前點
畫多組多線
曲線
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);
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成