吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 847|回复: 8
收起左侧

[经验求助] MFC如何构造宽度大于1的画笔

[复制链接]
sam喵喵 发表于 2024-4-11 09:47
40吾爱币
网上没找到,MSDN也没有找到,微软官网也没找到
有大佬做过没

最佳答案

查看完整内容

如果你要画出的线宽度大于1,并且你要使线条显示为虚线的话,你不能使用PS_DASH,PS_DOT或者PS_DASHDOT等预定义的样式了。我们需要自定义一个LOGBRUSH对象,然后使用CreatePen()来实现。 [mw_shl_code=cpp,true]LOGBRUSH lb; lb.lbStyle = BS_SOLID; //按实体样式填充 lb.lbColor = RGB(0, 0, 0); //颜色设为黑色 lb.lbHatch = 0; DWORD penStyle[2]; penStyle[0] = 1; //实体线部分的长度 penStyle[1] = 2; //空白部分 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sunnychen 发表于 2024-4-11 09:47
如果你要画出的线宽度大于1,并且你要使线条显示为虚线的话,你不能使用PS_DASH,PS_DOT或者PS_DASHDOT等预定义的样式了。我们需要自定义一个LOGBRUSH对象,然后使用CreatePen()来实现。
[C++] 纯文本查看 复制代码
LOGBRUSH lb;
lb.lbStyle = BS_SOLID; //按实体样式填充
lb.lbColor = RGB(0, 0, 0); //颜色设为黑色
lb.lbHatch = 0; 

DWORD penStyle[2];
penStyle[0] = 1; //实体线部分的长度
penStyle[1] = 2; //空白部分的长度

CPen newpen;
newpen.CreatePen(PS_GEOMETRIC | PS_USERSTYLE, //几何线条样式和用户指定样式
    3, //宽度为3
    &lb, //逻辑刷子
    2, //指定数组长度
    penStyle); //画笔样式数组

CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&newpen);

//你的绘制代码
//例如:dc.MoveTo(10, 10); dc.LineTo(200, 200);

dc.SelectObject(pOldPen);
 楼主| sam喵喵 发表于 2024-4-11 09:48
 楼主| sam喵喵 发表于 2024-4-11 11:05
sunnychen 发表于 2024-4-11 10:05
如果你要画出的线宽度大于1,并且你要使线条显示为虚线的话,你不能使用PS_DASH,PS_DOT或者PS_DASHDOT等预 ...

感谢回复,确实绘画出了宽虚线。
还有个问题想请教,为什么把构造画笔的语句放进if..else,画笔构建会失效啊
sunnychen 发表于 2024-4-11 11:17
sam喵喵 发表于 2024-4-11 11:05
感谢回复,确实绘画出了宽虚线。
还有个问题想请教,为什么把构造画笔的语句放进if..else,画笔构建会失 ...

可能是程序逻辑导致没有构造newpen
或者newpen变成局部变量了,使用的时候已经自动销毁了。
 楼主| sam喵喵 发表于 2024-4-11 11:28
sunnychen 发表于 2024-4-11 11:17
可能是程序逻辑导致没有构造newpen
或者newpen变成局部变量了,使用的时候已经自动销毁了。

应该是的,即使加个大括号也会失效
 楼主| sam喵喵 发表于 2024-4-11 11:29
sunnychen 发表于 2024-4-11 09:47
如果你要画出的线宽度大于1,并且你要使线条显示为虚线的话,你不能使用PS_DASH,PS_DOT或者PS_DASHDOT等预 ...

数组空白间距长度和线宽的设置是不是有什么关系,线宽超过一定值以后,虚线还是会变实线
sunnychen 发表于 2024-4-11 11:41
由于GDI的限制,线宽大于1px时,某些画笔样式例如 PS_DASH 就会变成实线样式,这是Windows的底层绘图API的限制。
最简单的办法是宽虚线由你手工画,即:画一小段实线,然后移动画笔留出一段空白,然后继续画一小段实线,如此循环。
 楼主| sam喵喵 发表于 2024-4-11 11:56
sunnychen 发表于 2024-4-11 11:41
由于GDI的限制,线宽大于1px时,某些画笔样式例如 PS_DASH 就会变成实线样式,这是Windows的底层绘图API的 ...

嗯,可以把这操作封装起来也做一个接口
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 23:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表