文章目录
- GDI对象
- 画笔类CPen
- 画刷类CBrush
GDI对象
在MFC中,CGdiObject
类是GDI对象的基类,CGdiObject
类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmap
、CBrush
、CFont
、CPalette
、CPen
和CRgn
。
在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类。
画笔类CPen
CPen画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。
三种构造函数:
(1)无参构造函数,构造一个未初始化的CPen对象。
CPen();
(2)构造函数带有3个参数,分别对画笔的线形,线宽和颜色进行了初始化。
CPen(int nPenStyle, int nWidth, COLORREF crColor);
- 参数nPenStyle指定画笔的风格(样式),也就是画笔的线形
- PS_SOLID 创建一个实线画笔
- PS_DASH 创建一个虚线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效
- PS_DOT 同上
- PS_DASHDOT 同上
- PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效
- PS_NULL 创建一个空线画笔
- PS_INSIDEFRAME 创建一个内框线画笔,该画笔可以在Windows GDI输出函数定义的矩形边界所生成的封闭状的边框内绘制直线
- 参数crColor:包含了一个画笔所具有的RGB颜色
(3)构造函数带有5个参数,分别对画笔的线形,线宽和颜色进行了初始化。
CPen(int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount=0,
const DWORD* lpStyle=NULL
);
-
参数nPenStyle:功能同上,除了具有上一个构造函数中介绍的参数值外,还增加了如下的参数值。新增的nPenStyle参数值:
- PS_GEOMETRIC 创建一个几何画笔
- PS_COSMETIC 创建一个装饰画笔
- PS_ALTERNATE 创建一个设置其他像素的画笔。(该风格只对装饰画笔可用)
- PS_USERSTYLE 创建一个使用由用户提供的风格矩阵的画笔
- PS_ENDCAP_ROUND 端点为圆形的
- PS_ENDCAP_SQUARE 端点为方形的
- PS_ENDCAP_FLAT 端点为平坦的
- PS_JOIN_BEVEL 成尖角连接
- PS_JOIN_MITER 通过SetMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接。
- PS_JOIN_ROUND 成圆角连接
-
参数nWidth:含义基本与上一构造函数的同一参数含义相同,区别在于如果参数nPenStyle的值为PS_GEOMETRIC,那么该参数值是针对逻辑单位而言的,并且该参数值恒为1
-
参数pLogBrush:指向一个LOGBRUSH结构。该结构原型声明如下:
//该结构体定义了一个画刷的风格,颜色和限影线种类 typedef struct tagLOGBURSH { UINT lbStyle; COLORREF lbColor; LONG lbHatch; }LOGBRUSH;
- 成员lbStyle:画刷的风格值
- BS_DIBPATTERN 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的句柄
- BS_DIBPATTERNPT 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的指针
- BS_HATCHED 阴影线画刷
- BS_HOLLOW 中空画刷
- BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
- BS_PATTERN 由内存位图定义的图形画刷
- BS_SOLID 实画刷
- 成员lbColor指定了所指定画刷的颜色。
- 成员lbHatch指定了阴影线画刷的阴影线的样式。
如果参数nPenStyle的值为PS_COSMETIC,那么LOGBRUSH结构的成员变量lbColor指定画笔的颜色,成员变量lbStyle必须被为BS_SOLID.如果参数nPenStyle的值为PS_GEOMETRIC,那么所有的成员变量必须被有来指定画笔的刷子属性。
- 成员lbStyle:画刷的风格值
-
参数nStyleCount:以双字为一个单元指定lpStyle矩阵的长度。如果参数nPenStyle的值不是PS_USRSTYLE,则该参数值必为0
-
参数lpStyle:指向一个双字为单元的矩阵。第一个值以用户定义的风格指定了第一个直线段的长度。第二个值指定了第一个空隙的长度等。如果参数nPenStyle的值不是PS_USERSTYLE,那么这个指针必为空
使用示例:
画刷类CBrush
画刷其实是一个像素大小为8*8的位图,用多个相同的位图对封闭图形的内部进行填充。
CBrush类封装了画刷对象,创建画刷时,首先定义一个画刷对象,然后调用CreateSolidBrush
、CreateHatchBrush
或CreatePatternBrush
函数。可以采用下面三种方式创建画刷。
(1)创建单色画刷
BOOL CreateSolidBrush(
COLORREF crColor //画刷颜色
);
- 参数crColor:指定用于阴影的刷子的前景色
(2)创建阴影画刷
BOOL CreateHatchBrush(
int nIndex, //阴影画刷类型
COLORREF crColor //画刷颜色
);
- 参数nIndex指定画刷的样式。可以设置的样式如下所示:
- HS_BDIAGONAL 表示45度向上,从左至右的阴影(/)
- HS_CROSS 水平和垂直交叉阴影(+++++)
- HS_DIAGCROSS 45度交叉阴影(XXXXX)
- HS_FDIAGONAL 45度向下,自左至右阴影(\)
- HS_HORIZONTAL 水平阴影(-----)
- HS_VERTICAL 垂直阴影(
- 参数crColor 指定用于阴影的刷子的前景色
(3)创建位图画刷
BOOL CreatePatternBrush(
CBitmap* pBitmap //画刷位图,只使用左上角的8*8大小
);
使用示例:
void CExampleDlg::OnBnClickedColorSelButton()
{
COLORREF color = RGB(255, 0, 0); // 颜色对话框的初始颜色
CColorDialog colorDlg(color); // 构造颜色对话框,初始颜色为红色
CRect rectPicture; // 图片控件的矩形区域坐标
CBrush newBrush; // 创建的新画刷
CBrush *pOldBrush; // 旧画刷的指针
CClientDC clientDC(this); // 构造客户区的设备上下文对象
if (IDOK == colorDlg.DoModal()) // 显示颜色对话框
{
// 获取颜色对话框中选择的颜色
color = colorDlg.GetColor();
// 用选择的颜色创建新画刷
newBrush.CreateSolidBrush(color);
// 获取图片控件矩形区域的屏幕坐标
m_picColor.GetWindowRect(&rectPicture);
// 将图片控件矩形区域的屏幕坐标转换为其父窗口即对话框的客户区坐标
ScreenToClient(&rectPicture);
// 选择新画刷,并保存旧画刷的指针到pOldBrush
pOldBrush = clientDC.SelectObject(&newBrush);
// 以新画刷为图片控件填充颜色
clientDC.Rectangle(rectPicture);
// 恢复旧画刷
clientDC.SelectObject(pOldBrush);
// 删除新画刷
newBrush.DeleteObject();
}
}