第五章 图形基础part2

来源:互联网 发布:中国塞尔维亚关系知乎 编辑:程序博客网 时间:2024/05/22 14:24

5.3画点和线

设定图素:

SetPixel(hdc, x, y, crColor) ;//在指定的x和y坐标以特定的颜色设定图素.最后一个参数是COLORREF型态指定了颜色。
crColor = GetPixel(hdc, x, y) ;//传回指定坐标处的图素颜色

直线:

Windows可以画直线、椭圆线(椭圆圆周上的曲线)和贝塞尔曲线。

MoveToEx(hdc, xBeg, yBeg, NULL) ;//实际上不会画线,它只是设定了设备内容的「目前位置」属性
LineTo(hdc, xEnd, yEnd) ;//从目前的位置到它所指定的点画一条直线

如果在呼叫LineTo之前没有设定目前位置,那么它将从显示区域的左上角开始画线。如果您需要目前位置,就可以通过以下呼叫获得:GetCurrentPositionEx (hdc, &pt) ; pt是POINT结构的。

将数组中的点连接成线时使用Polyline (hdc, apt, 5) ;最后一个参数是点的数目。PolylineTo有些不同,这个函数使用目前位置作为开始点。

SINEWAVE

 

边界框函数:

画一个矩形Rectangle(hdc, xLeft, yTop, xRight, yBottom);点(xLeft,  yTop)是矩形的左上角,(xRight,  yBottom)是矩形的右下角。
画椭圆 Ellipse(hdc, xLeft, yTop, xRight, yBottom);
画圆角矩形的函数RoundRect(hdc, xLeft, yTop, xRight, yBottom, 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);

LINEDEMO

贝塞尔曲线:

贝塞尔曲线的参数方程,起点是(x0,y0),终点是(x3,y3),两个控制点是(x1,y1)和(x2,y2),随着t的值从0到1的变化,
x(t) = (1 - t)3 x0 + 3t (1 - t)2 x1 + 3t2 (1 - t) x2 + t3 x3  
y(t) = (1 - t)3 y0 + 3t (1 - t)2 y1 + 3t2 (1 - t) y2 + t3 y3

PolyBezier(hdc, apt, iCount);
PolyBezierTo(hdc, apt, iCount);apt都是POINT结构的数组。对PolyBezier,前四个点(按照顺序)给出贝塞尔曲线的起点、第一个控制点、第二个控制点和终点。

使用现有画笔(Stock Pens):
Windows表头文件WINDEF.H中包含一个叫做HPEN的型态定义,即画笔的句柄。HPEN hPen;呼叫GetStockObject,可以获得现有画笔的句柄。
画笔的建立、选择和删除:使用函数CreatePen或CreatePenIndirect建立一个「逻辑画笔」。

GDI对象有画笔、画刷、位图、区域、字体和调色盘。除了调色盘之外,这些对象都是通过SelectObject选进设备内容的。

在使用画笔等GDI对象时应该注意:
1.最后要删除自己建立的所有GDI对象。
2.当GDI对象正在一个有效的设备内容中使用时,不要删除它。
3.不要删除现有对象。

LOGPEN(「逻辑画笔」)的结构,并呼叫CreatePenIndirect来建立画笔。hPen = CreatePenlndirect(&logpen);
typedef struct tagLOGPEN { kk1}
POINT lopnWidth;
COLORREF lopnColor;
}LOGPEN;
CreatePen和CreatePenIndirect函数不需要设备内容句柄作为参数。这些函数建立与设备内容没有联系的逻辑画笔。 直到呼叫SelectObject之后,画笔才与设备内容发生联系。

填入空隙:
空隙的着色取决于设备内容的两个属性-背景模式和背景颜色。可以通过如下呼叫来改变Windows用来填入空隙的背景色:SetBkColor (hdc, crColor);通过将背景模式转换为TRANSPARENT,可以阻止Windows填入空隙:SetBkMode (hdc, TRANSPARENT);GetBkMode来取得目前背景模式。

BEZIER