MFC——画笔和画刷
一、画笔
1、创建画笔对象
- MFC 中可以使用CPen创建画笔对象,其构造函数如下:
CPen( int nPenStyle, //指定画笔样式 int nWidth, //指定画笔的宽度 COLORREF crColor //指定画笔样式 ) CPen( int nPenStyle, //指定画笔样式 int nWidth, //指定画笔的宽度 const LOGBRUSH* pLogBrush, //指定 LOGBRUSH 结构 int nStyleCount = 0, //指定双字节单位的 lpStyle 数组长度 const DWORD* lpStyle = NULL //指向双字节值的指针 )
- 其中,nPenStyle 参数指定画笔样式,有效取值如下表:
值 意义 ps_SOLID 创建实线画笔 PS_DASH 创建虚线画笔,此值只有当画笔宽度等于或小于1时才有效 PS_DOT 创建点线画笔,此值只有当画笔宽度等于或小于1时才有效 PS_DASHDOT 创建虚点线画笔,此值只有当画笔宽度等于或小于1时才有效 PS_DASHDOTSOT 创建双点虚线画笔,此值只有当画笔宽度等于或小于1时才有效 PS_NULL 创建空白画笔 PS_INSIDERFRAME 创建封闭形状内线的画笔 PS_GEOMETRIC 创建几何画笔 PS_COSMETIC 创建装饰画笔 PS_ALTERNATE 创建设置每个像素的画笔,此类型只能应用于装饰画笔 PS_USERSTYLE 创建用户自定义的画笔 - 线点结束部分的有效取值如下表:
值 意义 PS_ENDCAP_ROUND 结束部分是圆形 PS_ENDCAP_SQUARE 结束部分是方形 PS_ENDCAP_FLA 结束部分是平滑 - 连接点的有效取值如下表:
值 意义 PS_JOIN_BEVEL 连接部分是斜角 PS_JOIN_MITER 连接部分在指定值内是连接,否则是斜角 PS_JOIN_ROUND 连接部分是圆形
2、画笔示例
- 示例代码如下:
void CGDISampleView::OnMenuitemPen() { // TODO: 在此添加命令处理程序代码 CDC *pDC = GetDC(); CPen newPen; if (newPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0))) { CPen* pOldPen = pDC->SelectObject(&newPen); RECT rect; GetClientRect(&rect); pDC->MoveTo(rect.left, rect.top); pDC->LineTo(rect.right, rect.top); pDC->LineTo(rect.left, rect.bottom); pDC->LineTo(rect.right, rect.bottom); pDC->LineTo(rect.left, rect.top); pDC->SelectObject(pOldPen); } else MessageBox(L"创建画笔失败"); }
- 效果如下:
二、画刷
1、创建画刷对象
- MFC 中使用 CBrush 来创建画刷对象,其构造函数如下:
CBrush(COlORREF crColor) //指定画刷的 RGB 前景颜色 CBrush(int nIndex, COLORREF crColor) //指定画刷填充的样式 CBrush(CBitmap* pBitmap) //指定画刷用于绘制的位图对象的指针
- nIndex 的有效取值如下表:
值 意义 HS_BDIAGONAL 以左下角到右上角 45° 的线填充画刷 HS_CROSS 以十字交叉线填充画刷 HS_DIAGCROSS 以互相交互 45° 线填充画刷 HS_FDIAGONAL 以左上角到右下角 45° 的线填充画刷 HS_HORIZONTAL 以水平线填充画刷 HS_VERTICAL 以垂直线填充画刷 - CBrush 除了上面三个有参构造函数,还有一个无参构造函数。灭有参数的构造函数不能进行初始化,在使用前必须使用创建函数对画刷进行初始化。CBrush 提供如下的 6 个创建函数:
- 1)CreateSolidBrush() 函数:用于创建实画刷,即以指定的纯色填充区域。
- 2)CreateHatchBrush() 函数:用于创建纹理画刷,可以创建指定颜色的纹理画刷。
- 3)CreateBrushIndirect() 函数:使用在 LOGBRUSH 结构中指定样式、颜色和模式初始化画刷。
- 4)CreatePatternBrush() 函数:创建带有位图的画刷。
- 5)CreateDIBPatternBrush() 函数:使用设备相关位图创建画刷。
- 6)CreateSysColorBrush() 函数:使用系统默认颜色的画刷。
2、画刷示例
- 示例代码如下:
void CGDISampleView::OnMenuitemBrush() { // TODO: 在此添加命令处理程序代码 CDC* pDC = GetDC(); CBrush newBrush; if (newBrush.CreateSolidBrush(RGB(100, 250, 255))) { RECT rect; GetClientRect(&rect); CRgn rgn; rgn.CreateEllipticRgn(rect.left + 10, rect.top, rect.right - 10, rect.bottom); pDC->FillRgn(&rgn, &newBrush); } else MessageBox(L"创建画刷失败!"); }
- 运行效果如下:
3、创建含有位图的画刷
- 示例代码如下:
void CGDISampleView::OnMenuitemBitmapbrush() { // TODO: 在此添加命令处理程序代码 CDC* pDC = GetDC(); CRect rect; GetClientRect(&rect); rect.top = rect.Height() / 4; rect.bottom = rect.top * 3; rect.left = rect.Width() / 4; rect.right = rect.left * 3; CBitmap bitmap; if (!bitmap.LoadBitmap(IDB_BITMAP2)) return; CBrush newBrush; if (newBrush.CreatePatternBrush(&bitmap)) pDC->FillRect(&rect, &newBrush); else MessageBox(L"创建位图画刷失败!"); }
- 运行效果如下: