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类型的数组,画完后效果截图如下: