MFC中GDI之CPen(画笔)
CPen 画笔
由CGdiObject类派生,用于修饰线条的颜色、宽度和线型(实线、虚线、点划线等)。
CPen(int nPenStyle, int nWidth, COLORREF crColor) | 在构造函数中创建一个画笔 |
BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor) | 根据指定数值创建一个画笔 |
BOOL CreatePenIndirect(LPLOGPEN lpLogPen) | 根据LOGPEN结构体创建一个画笔 |
static CPen* FromHandle(HPEN hPen) | 将HPEN句柄转化为CPen对象 |
operator HPEN() const | 从CPen对象中获取HPEN句柄 |
int GetLogPen(LOGPEN* pLogPen) | 获取画笔的颜色、粗度等属性信息 |
/* Pen Styles */ #define PS_SOLID 0 /* 实线 */ #define PS_DASH 1 /* ------- */ #define PS_DOT 2 /* ....... */ #define PS_DASHDOT 3 /* _._._._ */ #define PS_DASHDOTDOT 4 /* _.._.._ */ #define PS_NULL 5 /* 无边框 */ /* Logical Pen */ typedef struct tagLOGPEN { UINT lopnStyle; POINT lopnWidth; COLORREF lopnColor; } LOGPEN, *PLOGPEN;
例子:
void CtestDialogDlg::OnPaint() { // CPaintDC 是标准客户区绘画。刷新不消失。CPaintDC中封装了BeginPaint(),EndPaint() // 而CClientDC 是临时客户区绘图,刷新会消失。封装了GetDC(),ReleaseDC() CPaintDC dc(this); // device context for painting //默认画笔是黑色实线,宽度为1 dc.MoveTo(20, 20); dc.LineTo(120, 20); //通过一个构造函数创建一个画笔 CPen p1(PS_SOLID, 5, RGB(255, 0, 0)); CPen* pOldPen = dc.SelectObject(&p1); dc.MoveTo(20, 30); dc.LineTo(120, 30); //通过CreatePen 创建一个画笔 CPen p2; p2.CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));//注意,虚线、点线等,只有在宽度为1时,才有效 dc.SelectObject(&p2); dc.MoveTo(20, 40); dc.LineTo(120, 40); //通过默认画笔画一个矩形 dc.SelectObject(pOldPen); dc.Rectangle(140, 20, 240, 100); dc.RoundRect(250, 20, 350, 100, 20, 20); //画一个虚线边框的矩形 dc.SelectObject(&p2); dc.Rectangle(20, 50, 110, 100); //画一个无边框的矩形 CPen p3(PS_NULL, 1, RGB(0, 0, 0)); dc.SelectObject(&p3); dc.Rectangle(20, 110, 120, 200); //等价的无边框的填充方法 dc.FillSolidRect(140, 110, 100, 90, RGB(255, 255, 255)); /* 调用FillSolidRect时,以前用SetBkColor设置的背景色,被设置为clr指定的颜色。 就是说你的背景色已经变成了FillSolidRect设置的颜色了。 也许正常是看不出来的。 但当以再用画笔画PS_DOT类的线时, 你会发现你虚线原来的空白地方变成了FillSolidRect设置的颜色了。 用FillSolidRect时一定要注意。 可以用CDC::FillRect() CBrush brush; brush.CreateSolidBrush(RGB(0,100,255)); dc.FillRect(&rect,&brush); */ dc.SelectObject(&p2);//选择虚线,FillSolidRect的颜色会是虚线的断的颜色 dc.FillSolidRect(20, 210, 100, 20, RGB(255, 0, 0)); dc.MoveTo(20, 240); dc.LineTo(120, 240); //选择回原来的画笔 dc.SelectObject(pOldPen); }
结果:
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。