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) | 获取画笔的颜色、粗度等属性信息 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* 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); }
结果:
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义