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);