1、边界框函数
Rectangle、Ellipse、RoundRect、Chord、Pie函数
这些函数依据矩形边框来绘图
Rectangle(hdc, xLeft, yTop, xRight, yBottom);点(xLeft, yTop)是矩形左上角,点(xRight,yBottom)是右下角。
Ellipse(hdc, xLeft,yTo, xRight, yBottom);
RoundRect(hdc, xLeft, yTop, xRight, yBottom,xCornerEllipse,yCornerEllipse);这里圆角矩形的圆角是由四个相同的小椭圆确定,它们分别与矩形四个角相切,xCornerEllipse指定小椭圆的宽度,yCornerEllipse指定小椭圆的高度。
xCornerEllipse = (xRight-xLeft)/4; yCornerEllipse = (yBottom-yTop)/4;
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);画扇形
注:这三个函数的理解,通过xLeft,yTop,xRight,yBottom指定一个椭圆,点(xStart,yStart)到椭圆中心的连线,和点(xEnd,yEnd)到椭圆中心的连线,这两条线与椭圆相交于两点,Arc函数画出所截椭圆的那一部分弧线,Chord函数在这段弧线基础上,连接两个端点,构成一个封闭区域;而Pie函数则分别从弧线的两个端点出发到椭圆中心连两条直线段,使其构成封闭区域。
2、使用现有画笔(Stock Pens)
获得现有画笔:GetStockObject函数;
hPen = GetStockObject(WHITE_PEN);
将画笔选进设备描述表:
SelectObject(hdc, hPen);
3、画笔的建立、选择和删除
使用CreatePen或CreatePendirect建立一个“逻辑画笔”;
然后使用SelectObject将画笔选进设备描述表中;然后就可以使用画笔画线;
在释放设备描述表(或选择另一种画笔之后),就可以使用DeleteObject来删除所建立的逻辑画笔。
注意:逻辑画笔是一种“GDI物件”,它是程序员可以建立的六种GDI物件之一,其他五种是画刷、点阵图、区域、字体、调色板。除了调色板之外,这些物件都是通过SelectObject选进设备描述表的。
在使用画笔等GDI物件时,应该注意:最后要删除自己建立的所有GDI物件,当GDI物件正在一个有效的设备描述表中使用时,不要删除它;不要删除现有物件。
注意:SelectObject在选择新物件到设备描述表中时,会通过返回值将上一次选择的物件句柄返回,因此下面的语句是正确的:
SelectObject(hdc, CreatePen(PS_DASH, 0, RGB(255, 0, 0)));//创建新画笔,并将其选进设备描述表
//使用画笔;
DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));//删除先前的创建的画笔,并选择系统画笔到设备描述表
另一种方法:
hPen = SelectObject(hdc, CreatePen(PS_DASH, 0, RGB(255, 0, 0)));
//使用画笔
DeleteObject(SelectObject(hdc, hPen));
*如果有画笔句柄,可以通过GetObject取得LOGPEN结构的各个成员:
GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);
*获得目前选进设备描述表的画笔句柄,可以调用GetCurrentObject:
hPen = GetCurrentObject(hdc, OBJ_PEN);
4、填入空隙
关于点式画笔、虚线画笔所画线中的空隙颜色:
空隙的颜色取决于设备描述表的两个属性:背景模式和背景颜色。
内定的背景模式是OPAQUE,在这种模式下,windows使用背景色来填入空隙,内定的背景色为白色。
可以通过SetBkColor函数来改变windows填入空隙的背景色:
SetBkColor(hdc, crColor);
可以通过GetBkColor来获得设备描述表中定义的目前背景色。
若背景模式为:TRANSPARENT,在这种模式下,可以阻止windows填入空隙:
通过SetBkMode来改变背景模式:
SetBkMode(hdc, TRANSPARENT);
通过GetBkMode函数来取得当前的背景模式:
5、绘图方式
<1>、设备描述表中定义的绘图方式,影响显示器上所画线的外观。
<2>、当Windows使用画笔来画线时,它实际上执行画笔图素与目标位置处原来图素之间的某种位元映射运算。图素间的这种运算称为“位元映射运算”,简称“ROP”,由于画线只涉及两种图素(画笔和目标),因此这种运算也称为“二元位元映射运算”,简称“ROP2”。
<3>、Windows定义了16种ROP2代码,标识windows组合画笔图素和目标图素的方式。在内定设备描述表中,绘图方式定义为R2_COPYPEN,(即将画笔图素复制到目标图素)。Windows执行目标图素与画笔图素的位元“或”运算,然后翻转所得色彩。
<4>、通过调用SetROP2函数在设备描述表中设定新的绘图方式:
SetROP2(hdc, iDrawMode);//SetROP2返回先前的绘图模式。
通过调用GetROP2函数得到设备描述表中当前的绘图模式:
iDrawMode = GetROP2(hdc);
6、绘制填入区域
<1>、Windows中七个用来画带边缘的填入图形的函数:
Rectangle, Ellipse,RoundRect、Chord、Pie、Polygon(多边形)、PolyPolygon(多个多边形)
<2>、*Windows用设备描述表中的当前画笔画图形的边界框,边界框还使用当前的背景模式、背景色彩和绘图模式,(和Windows画线时一样)。
*图形用设备描述表中当前的画刷来填入,内定情况下,图形将填入白色。
注:Windows定义的6种现有画刷:
WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH和NULL_BRUSH。
<3>、选择指定的画刷到设备描述表中的方法:
HBRUSH hBrush;
hBrush = GetStockObject(GRAY_BRUSH);
SelectObject(hdc, hBrush);
******画没有边界框的图形:需要选择“NULL_PEN”:
SelectObject(hdc, GetStockObject(NULL_PEN));
******画只有边界框而不填入内部的图形,需要选择NULL_BRUSH:
SelectObject(hdc, GetStockObject(NULL_BRUSH));
<4>、Polygon函数与多边形填入方式:
*Polygon函数与Polyline函数的区别:
尽管它们的调用方式类似:Polygon(hdc, apt, iCount);//apt:有POINT组成的数组,iCount:点的数目
如果apt数组中的第一个点与最后一个点不重合,调用Polygon时,则画图时第一个点与最后一个点是会连起来,构成封闭区域的,而调用Polyline不会这样做(它的操作更像画折线)。
PolyPolygon函数:
PolyPolygon(hdc, apt, aiCounts, iPolyCount );
该函数绘制多个多边形。最后一个参数指定所画多边形的个数,对于每个多边形,aiCounts数组给出多边形的端点数。apt数组包含全部多边形的所有点。
注:除了返回值不同,PolyPolygon在功能上与下面的代码相同:
for(i = 0, iAccum = 0; i<iPolyCount; i++)
{
Polygon(hdc, apt+iAccum, aiCount[i]);
iAccum += aiCount[i];
}
****Windows用当前设备描述表中画刷填入这个带边界的区域,至于填入内部的方式,则取决于多边形填入方式:可以使用SetPolyFillMode函数来设定:
SetPolyFillMode(hdc, iMode);
内定情况下,多边形的填入方式是ALTERNATE,也可以指定为:WINDING
这两种填入方式的区别:
对于ALTERNATE方式,可以假设从一个无穷大的封闭区域内部的点画线,只要假想的线穿过奇数条边界线时,才填入封闭区域。
对于WINDING方式下,大多数情况下会填入所有封闭区域,但是也有例外,如果假定线穿过奇数条边界线,就填入封闭区域(这时和ALTERNATE下一样),如果假定线穿过偶数条边界线,这时分两种情况,如果一个方向(相对于假想线)的边界线数与另一方向的边界线数不相等,就填入封闭区域;如果相等,不填入。
<5>、用画刷填入内部
*画刷也称“图样”,是一个8*8的点阵图,它通过水平和垂直地重复使用来填入内部区域。
*“混色”也是点阵图。
*windows使用混色的方法可以显示多于可从显示器上得到的色彩。在单色系统中,Windows能够使用黑色和白色图素的混色建立64种不同的灰色,更精确地说,Windows能够建立64种不同的单色画刷,对于纯黑色,8*8点阵图中的所有位元均为0,第一种灰色有一个位元是1,第二种灰色有两个位元位1,等等,第64种灰色64个位元全为1,即为白色。
*逻辑画刷与逻辑画笔一样,都是GDI物件,Windows有五个函数来建立逻辑画刷,当用户建立的逻辑画刷不在当前设备描述表中,而且不再需要时,必须删除。
(1)、建立逻辑画刷的第一个函数:CreateSolidBrush函数
hBrush = CreateSolidBrush(crColor);
Solid有固体之意,这里并不是指画刷必须是纯色,而是指在将画刷装进设备描述表中时,Windows建立一个“混色”色的点阵图,并为画刷使用该点阵图。
(2)、建立逻辑画刷的第二个函数:CreateHatchBrush函数 //建立影线(阴影区)画刷
hBrush = CreateHatchBrush(iHatchBrush, crColor);
iHatch指定影线标记的外观,可以是以下6种值之一:HS_HORIZONTAL、HS_BDIAGONAL、HS_VERTICAL、HS_CROSS、HS_FDIAGONAL、HS_DIAGCROSS;
crColor指定影线的颜色,在将画刷选进设备描述表时,windows将这种色彩转换为与之最相近的纯色。
注意:影线之间的填充区域的颜色是由背景模式和背景颜色共同决定的(和第4条虚线间隙的填入方式类似);
(3)、CreatePatternBrush
HBRUSH CreatePatternBrush(HBITMAP hbmp);
该函数创建指定位图的逻辑画刷,该位图不能是DIB类型的位图,
(4)、CreateDIBPatternBrushPt
HBRUSH CreateDIBPAtternBrushPt(CONST VOID* lpPackedDIB, UINT iUsage);
该函数创建设备无关位图(DIB:device-independent bitmap)的逻辑画刷。
(5)、CreateBrushIndirect
这个函数包含了以上四个函数的功能:
hBrush = CreateBrushIndirect(&logBrush);
变量logBrush是一个LOGBRUSH结构
注:得到画刷信息,可以调用GetObject:
GetObject(hBrush, sizeof(LOGBRUSH), (LPVOID)&logBrush);