您的位置:首页 > 其它

Win32 GDI基础(笔记)

2014-04-23 15:35 232 查看
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);
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: