wxGraphicsContext绘制不同颜色圆弧画笔失效,如何解决?
问题原因与解决方案
你遇到的问题核心在于:wxGraphicsPath仅存储几何路径信息,不关联任何画笔样式。画笔样式是由wxGraphicsContext的当前状态控制的,当你调用StrokePath()时,会用上下文当前设置的画笔来绘制整个路径的所有部分——你最后设置的蓝色4像素画笔会覆盖之前的红色设置,所以两段圆弧都用这个样式绘制。
解决方法:拆分路径,分别描边
把两段圆弧拆成独立的wxGraphicsPath,设置对应画笔后立即描边,这样每段圆弧都会使用各自的画笔样式:
// 绘制第一段8像素宽的红色圆弧 gc->SetPen(wxPen(*wxRED, 8)); wxGraphicsPath redArc = gc->CreatePath(); redArc.MoveToPoint(x, y); redArc.AddArc(x, y, radius, angle_rad_1a, angle_rad_1b, true); gc->StrokePath(redArc); // 绘制第二段4像素宽的蓝色圆弧 gc->SetPen(wxPen(*wxBLUE, 4)); wxGraphicsPath blueArc = gc->CreatePath(); blueArc.MoveToPoint(x, y); blueArc.AddArc(x, y, radius, angle_rad_2a, angle_rad_2b, true); gc->StrokePath(blueArc);
或者你也可以复用同一个路径对象,每次绘制后重置它:
gc->SetPen(wxPen(*wxRED, 8)); wxGraphicsPath path = gc->CreatePath(); path.MoveToPoint(x, y); path.AddArc(x, y, radius, angle_rad_1a, angle_rad_1b, true); gc->StrokePath(path); // 重置路径,绘制第二段圆弧 path = gc->CreatePath(); gc->SetPen(wxPen(*wxBLUE, 4)); path.MoveToPoint(x, y); path.AddArc(x, y, radius, angle_rad_2a, angle_rad_2b, true); gc->StrokePath(path);
关键知识点
wxGraphicsContext的绘图模型是状态机:你设置的画笔、画刷等样式会一直生效,直到你修改它们。而wxGraphicsPath只是几何形状的容器,本身不保存样式信息,所以同一路径的所有部分只能用同一种样式绘制。如果需要不同样式的图形,必须拆分为独立路径分别处理。
内容的提问来源于stack exchange,提问作者Martin_from_K
相关产品推荐
相关产品推荐

