Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

Windows编程学习笔记(三)

本章主要学习了最基本的windows GDI的使用,和很多GDI的基础必要的知识,更多高级的知识本章是没有讲述的,仅仅有绘直线.、曲线等内容,不过这些东西是高级GDI的基础。

 

第三章 图形基础(上)

/***************************************************************************/

图形设备接口(GDI,Graphics Device Interface)

图形的输出设备分为两大类:位映像设备和向量设备,大多数PC的输出设备是位映像设备,这意味着他们以图点构成的数组来表示图像,向量设备使用线来绘制图像,通常局限于绘图机。

GID函数的呼叫:

1.    取得和释放设备内容的函数 比如说BeginPaint EndPaint GetDC, ReleaseDC

2.    取得有关设备内容信息的函数 比如 GetTextMetrics来取得设备内容中目前所选字体的尺寸信息。

3.    绘图函数   比如TextOut   Polyline

4.    设定和取得设备内容参数的函数 比如SetTextColor

5.    使用GDI对象的函数 也就是说这个设备是用什么样的工具来工作,比如绘直线,就会使用的画笔对象,如何定义和创建画笔对象是很重要的。

GDI基本图形

1.    直线和曲线

2.    填入区域 使用当前的画刷对象进行填涂,画刷可以是位图对象。

3.    位图 是位的矩形数组。

4.    文字

/*******************************************************************、

关于色彩

一个RGB色彩可以这样表示:#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \

       

                   ((WORD)((BYTE)(g)) << 8)) | \

       

                   (((DWORD)(BYTE)(b)) << 16)))

保存设备内容

当我们的程序执行ReleaseDC,EndPaint时,对设备属性所做的改变都会被释放掉,那么如何保存我们的设备属性,而不是每次Paint都要重新设定呢?

1.    可在登陆窗口类别时,将CS_OWNDC旗标纳入窗口类别的一部分:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC ;

注意,CS_OWNDC只影响GetDC BeginPaint获得的设备内容,不影响其他函数GetWindowsDC获得的设备内容。

2.    某些情况下,我们可能改变了设备内容属性,让后在恢复,那么我们可以用idSaved = SaveDC(hdc)来保存设备属性,然后用RestoreDC(hdc,idSaved)来回复设备内容属性。

/*****************************************************************************/

画点和线

如果想对一个像素进行着色,可以用SetPixel(hdc,x,y,crColor); 而GetPixel(hdc,x,y)用于获得指定点处的像素的颜色。

画一条直线,需要用到两个函数:

MoveToEx(hdc,xBegin,yBegin,null);

LineTo(hdc,xEnd,yEnd);

记住:每次画完一条直线,起始点就会默认为上一条直线的终点,也就是(xEnd,yEnd),因此如果画连续的直线,就可以不用每次都调用MoveToEx了,相反,如果画几条不相连的直线,就需要一起调用。

如果需要把指定的几组点连接起来,有两种方法,那么就可以这样用:

1.    POINT apt[5] = {1,1,2,2,3,3,4,4,5,5};

Polyline(hdc,apt,sizeof(apt)/sizeof(apt[0]));

2.    MoveToEx(hdc,apt[0].x, apt[0].y, NULL);

PolylineTo(hdc,apt+1,sizeof(apt)/sizeof(apt[0])-1);

灵活运用这两个函数,就可以画出圆滑的曲线,比如说正选曲线。

/****************************************************************/

边界框函数

这类函数有Rectangle Ellipse RoundRect Chord Pie, 这些函数在画线的同时,还向这些边界框内填入当前的画刷。

Rectangle(hdc,xLeft,yTop,xRigth,yBottom);

Ellipse(hdc,xLeft,yTop,xRight,yBottom);

RoundRect(hdc,xLeft,yTop,xRight,yBotom,xCornerEllipse,yCornerEllipse);

     这个函数的后两个参数是决定矩形的角的圆滑度,很容易理解。

Arc(hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

Chord(hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

Pie(hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd);

/**********************************************************************/

Bezier曲线

这个曲线很著名,这学期学数值逼近的时候多次碰到他,或许是太偏向工科的缘故,一直没有好感,但是现在我发现我错了,条曲线在生活中的应用远远超过的我的想象,

使用PolyBezier(hdc,apt,iCount)来绘制Bezier曲线,最简单的情况是只有四个点,第一个与最后一个是控制点,中间两个是起始点和终止点,apt是POINT类型的数组,画完后效果截图如下:

posted on 2010-02-03 16:47  Lvpengms  阅读(399)  评论(0编辑  收藏  举报