Jiang's C++ Space

创作,也是一种学习的过程。

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

【20060307发表于blog.csdn.net,20090403重编辑】

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

// ----- 直线 -----
//最后一参数为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);
posted on 2009-04-03 19:02 Jiang Guogang 阅读(1559) 评论(0)  编辑 收藏 引用 所属分类: Windows Programming

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理