1. 画刷简介:
1) Windows就是使用画刷来实现抖动色彩技术的(即显示比通常显示器可用颜色更多的色彩的技术),比如实心画刷就是通过建立抖动位图进行填充,因此其颜色并不一定是最接近的纯色,而是更为丰富的色彩;
2) 画刷其实是一个8×8像素的小位图,即用该位图反复在水平方向和垂直方向使用来填充某一区域;
3) 5种建立画刷的方式对应着三种画刷:
hBrush = CreateSolidBrush( crColor ); // 利用抖动位图建立实心画刷(不一定是最接近纯色)
// 阴影线样式画刷,crColor为阴影线颜色(非抖动技术,最接近纯色),fnStlye指定阴影线的风格
// 阴影线之间的空隙利用空隙背景填充来决定(即SetBk函数)
hBrush = CreateHatchBrush( fnStlye, crColor );
// 建立自定义的画刷(要使用位图技术以及资源编译器等),之后会讲
hBrush = CreatePatternBrush( hbmp );
hBrush = CreateDIBPatternBrushPt( lpPackedDIB, iUsage );
以上即三种类型的画刷,前两种是内部已经定义好的,第三种是自定义的,而最后一种建立画刷的方式包含以上所有函数的功能,即先建立逻辑画刷结构LOGBRUSH,再通过CreaeBrushIndirect来建立真正的画刷资源(出现在内存中),最后再使用SelecObject将画刷选入设备环境,首先看一下LOGBRUSH的定义:
typedef struct tagLOGBRUSH {
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH, *PLOGBRUSH;
其中第一个字段将决定后两个字段被如何解释:
和上述4个函数的参数一模一样!
4) 由于画刷也是GDI对象,因此建立的画刷同样需要删除(但是StockObject画刷不能Delete),用DeleteObject来删除;
5) 获取画刷信息通过GetObject( hBrush, sizeof( LOGBRUSH ), (LPVOID)&logbrush )函数调用即可;
2. 12个操作矩形的神器:
// 以下两个函数无需将画刷选入设备环境而可以直接指定画刷!
// 用hBrush填充一个矩形区域(无边框)
FillRect( hdc, &rect, hBrush );
// 用hBrush绘制矩形边框(不填充),用画刷而不用画笔的好处就是可以使用抖动色!
FrameRect( hdc, &rect, hBrush );
// 将矩形区域中所有像素点反转(二进制位01反转),即变成相反色(黑变白、白变黑、绿变洋红)
InvertRect( hdc, &rect );
// 设定rect结构的各个字段(可以当成C++的构造函数)
SetRect( &rect, xLeft, yTop, xRight, yBottom );
// 将矩形朝x方向或y方向移动
OffsetRect( &rect, x, y ); // x和y表示位移距离,负表示x左移y上移
// 增大或减小矩形尺寸
InflateRect( &rect, x, y ); // x和y表示x方向和y方向上的长度该变量,负表示减少
// 将RECT各字段设为0
SetRectEmpty( &rect );
// 复制矩形结构
CopyRect( &DestRect, &SrcRect );
// 矩形求交
IntersectRect( &DestRect, &SrcRect1, &SrcRect2 ); // 求交的结果必然为一矩形
// 矩形求并
UnionRect( &DestRect, &SrcRect1, &SrcRect2 ); // 结果是能包含两个Src的最小面积矩形
// 判空,即判断各字段是否为空
IsRectEmpty( &