5、绘图基础( 二 )


5、绘图模式
对像素颜色执行一个按位布尔运算称为“光栅操作”(ROP),如果只涉及两种像素颜色则称为“二元光栅操作”(ROP2) 。
使用画笔进行绘制时,像素最终颜色是原颜色和画笔颜色进行一个光栅操作的结果 。定义了16中ROP2运算,被称为绘图模式 。
填充区域 1、边框绘制
下列函数先用画笔绘制边框线,再用画刷填充区域 。
BOOL WINAPI Rectangle(HDC hdc, int left, int top, int right, int bottom);
根据左上角和右下角坐标绘制矩形,实际绘制时不包含右下角像素,而是往上、左缩了一个像素 。(hdc, 1, 1, 5, 4)绘制结果:
BOOL WINAPI Ellipse(HDC hdc, int left, int top, int right, int bottom);
根据左上角和右下角确定一个虚拟的矩形边框,然后在矩形边框内绘制矩形 。
BOOLWINAPI RoundRect(HDC hdc, int left, int top, int right, int bottom, int width, int height);
相比多了width和参数 。圆角矩形的圆角是按照椭圆绘制的,每个圆角对应椭圆的一个象限 。width和定义了椭圆对应虚拟矩形边框的宽和长,加上左上角和右下角左边可以确定4个椭圆 。
BOOLWINAPI Chord(HDC hdc,int x1, int y1, int x2, int y2, int x3,int y3, int x4, int y4);BOOL WINAPI Pie(HDC hdc, int left, int top, int right, int bottom, int xr1, int yr1, int xr2, int yr2);
Chord和Pie绘制的图形都是椭圆的一部分,所以前面参数和相同,先确定一个椭圆 。后面4个参数在椭圆弧线上确定了起点、终点两个点 。
BOOLWINAPI Arc(HDC hdc, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
Arc绘制的并不是一个有填充区域的封闭图形,而是椭圆上的一条弧线 。
BOOLWINAPI Polygon(HDC hdc, CONST POINT *apt, int cpt);
根据提供的坐标点绘制多边形,如果最后一个点和第一个点不同,则连接两点 。
BOOL WINAPI PolyPolygon(HDC hdc, CONST POINT *apt, CONST INT *asz, int csz);
根据提供的坐标点绘制多个多边形 。
和绘制的多边形可能构成多个封闭区域,如何对这些区域进行填充取决于多边形的填充模,调用可以设置设备环境的多边形填充模式:
上图是模式的一个例子,以下面POINT数组为传参:
POINT apt[5] = {0, 20, 60, 20, 10, 60, 30, 0, 50, 60};
边框线的方向依赖于POINT数组提供的坐标顺序,比如第一个点是(0,20),第二个点是(60,20),所以边框线AB的方向是从A到B 。
从中间的五边形区域向左画一条射线,经过了边框线EA和CD 。关键是相对于射线的方向怎么理解?我认为是垂直于射线的方向,比如图中的射线是水平的,则相对于射线的方向应该取垂直方向 。那么,EA边框线在垂直方向是向上,CD边框线在垂直方向也是向上 。即向下的边框线数目是0,向上的边框线数目是2,故需要填充 。
2、画刷
提供了6种预定义画刷:
当然也可以创建自定义画刷 。提供了5个函数来创建画刷:
HBRUSHWINAPI CreateSolidBrush(COLORREF color);

5、绘图基础

文章插图
HBRUSHWINAPI CreateHatchBrush(int iHatch, COLORREF color);// 6种阴影线样式#define HS_HORIZONTAL0/* ----- */#define HS_VERTICAL1/* ||||| */#define HS_FDIAGONAL2/* \\\\\ */#define HS_BDIAGONAL3/* / */#define HS_CROSS4/* +++++ */#define HS_DIAGCROSS5/* xxxxx */