您的位置:首页 > 编程语言

GDI编程 之三、使用DC进行绘图的基本过程

2014-08-14 21:57 826 查看
l 获取或者创建设备描述表.DC;

l 必要的话,改变设备描述表的属性(见第四节:GDI对象的介绍);

l 使用设备描述表完成绘制操作;

l 释放或删除设备描述表DC。

第一种绘图方式是对WM_PAINT消息的处理

void CAaView::OnPaint()

{

CPaintDC dc(this); // 得到绘图DC

dc.TextOut(100,100,"Hello World");

}

或者

void CAaView::OnDraw(CDC *pDC)

{

pDC->TextOut(100,100,"Hello World");

}

上面的程序可以在窗口的100,100位置处,打印Hello World字符串。

那么什么时候会产生WM_PAINT消息呢?由于Windows是一个多任务环境,某个应用程序的窗口上面可能被对话框或窗口覆盖,当撤消这些对话框或窗口时,这个应用程序窗口中就有一个"空洞",这个"空洞"就是一块无效的用户区域。为重新显示无效用户区域,Windows发送WM_PAINT消息实现。要求Windows发送WM_PAINT的情况有:改变窗口大小,覆盖用户区的菜单或对话框关闭,使用UpdateWindow和ScrollWindow函数等。

Windows发送WM_PAINT消息时,把它放到应用程序队列的最后,使得其它的输入能够先于WM_PAINT消息被处理。GetMessage函数也得到队列中WM_PAINT消息之后的其它消息,即只有有没有其它消息的情况下,才从队列中取出WM_PAINT消息进行处理。这样做是为了让应用程序首先完成影响窗口显示结果的其它操作,不致因为频繁地执行输出操作而引起显示器的闪烁。Windows把WM_PAINT消息放在队列最后就是这个原因。

Windows并非WM_PAINT消息的唯一来源,使用InvalidateRect或InvalidateRgn函数也可以产生绘图窗口的WM_PAINT消息。这两个函数把用户区全部或部分标记成无效用户区而要求重新显示。下面的函数调用是把整个用户区标记成无效:

InvalidateRect(hWnd, NULL, TRUE);

上面代码把hWnd句柄参数指定的窗口用户区标记成无效。作为矩形结构的NULL参数指定整个用户区,TRUE参数表示擦除背景。

第二种绘图的方式是在非OnDraw / OnPaint中绘图

void CAaView::OnLButtonDown(UINT nFlags, CPoint point)

{

CClientDC dc(this);

dc.Ellipse(point.x-50, point.y-50, point.x+50, point.y+50);

}

这段程序实现了:以鼠标的当前位置为圆心,画一个半径为50的圆。

基本的画线函数有以下几种

CDC::MoveTo( int x, int y ); 改变当前点的位置

CDC::LineTo( int x, int y ); 画一条由当前点到参数指定点的线

CDC::BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线

CDC::BOOL Polyline( LPPOINT lpPoints, int nCount ); 将多条线依次序连接

基本的作图函数有以下几种:

CDC::BOOL Rectangle( LPCRECT lpRect ); 矩形

CDC::RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形

CDC::Draw3dRect( int x, int y, int cx, int cy,

COLORREF clrTopLeft, COLORREF clrBottomRight ); 3D边框

CDC::Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形

CDC::Ellipse( LPCRECT lpRect ); 椭圆形

CDC::Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );

CDC::Polygon( LPPOINT lpPoints, int nCount ); 多边形

对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空(NULL_PEN)笔或空(NULL_BRUSH)刷子。

多边形和剪贴区域

dc.CreateRectRgn 由矩形创建一个多边形

dc.CreateEllipticRgn 由椭圆创建一个多边形

dc.CreatePolygonRgn 创建一个有多个点围成的多边形

dc.PtInRegion 某点是否在内部

dc.CombineRgn 两个多边形相并

dc.EqualRgn 两个多边形是否相等

基本的绘图函数

CDC类中提供各种各样的输出操作,从画线到写字应有尽有。为了画线、矩形、圆、扇形和写字,可相应地调用一些函数。这些函数使用已选择的画笔和画刷,来画出边框,并填写图形内部区域,以及使用已选择的字体写字。

l 画点函数SetPixel

COLORREF CDC::SetPixel(int x,int y,COLORREF cclrref);

该函数把x和y指定的点置为clrref指定的颜色。

l 画线函数LineTo与移动函数MoveTo

LineTo函数用来画线,并且通常与MoveTo函数配合使用,如画一条从点(10,70)到点(250,100)的线:

dc.MoveTo(10,70);

dc.LineTo(250,100);

l 画矩形函数Rectangle

Rectangle函数用来画矩形。它使用已选择的画笔画出边框,使用已选择的刷子填满矩形内部。下面的例子画一个左上角位于点(10,20),右下角位于点(40,100)的矩形:

dc.Rectangle(10,20,40,100);

l 画圆或椭圆函数Ellipse

Ellipse函数用来画圆或椭圆。它使用已选择的笔画框,使用已选择的刷填满圆或椭圆的内部。下面的例子画一个用点(10,20)和点(40,100)构成矩形框中的椭圆:

dc.Ellipse(10,20,40,100);

l 画圆弧函数Arc

Arc函数用来画一段弧,这段弧由包围它的矩形和弧的开始点和结束点共同定义。下面的例子在点(10,90)和点(360,120)所指定的矩形中画一段弧,它的起点和终点分别是点(15,90)和点(360,90):

dc.Arc(10,90,360,120,15,90,360,110);

弧的起点坐标和终点坐标精确地位于弧上。

l 画扇形函数Pie

Pie函数用来画扇形。扇形由一段弧和两条从弧焦点到弧端点的半径组成。Pie函数使用已选择的笔画框,使已选择的刷填满扇形内部。下面的例子画一个用点(310,30)和点(360,80)构成的矩形围成的扇形。其起点和终点分别为点(360,30)和点(360,80):

dc.Pie(310,30,360,80,310,30,360,80);

弧的起点和终点不必精确地位于弧线上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: