定制点画笔
Custom stippled pen
我正在尝试在现有图像上绘制相当于屏幕色调效果的内容,但我想留出一个区域空白。想一想旧游戏中的聚光灯有时是如何处理的,其中大部分图像变暗,但其中一部分是 "normal" 颜色。
为此,我需要我的叠加层是透明的(因为原始图像必须显示出来)。我还使用 wxDC.DrawCircle(...)
(使用透明画笔)绘制它,因为它允许我不在圆形区域上绘制。
问题是,点画(屏幕色调效果)不是透明的,是实心的。我已经尝试了几乎所有我能想到的方法,但似乎没有任何效果。
我现在的代码大致是这样的:
const char* ScreenToneColor[] =
{
/* columns rows colors chars-per-pixel */
"3 3 2 1",
"X c Black",
"O c None",
/* pixels */
"OOO",
"OXO",
"OOO"
};
CustomPanel::CustomPanel(wxWindow* parent)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(151, 151))
{
SetBackgroundStyle(wxBG_STYLE_PAINT);
// MemberVariables
m_Stipple = wxBitmap(wxImage(ScreenToneColor));
m_ScreenTone = wxPen(*wxBLACK, 2 * VeryLargeRadius, wxPENSTYLE_STIPPLE);
m_ScreenTone.SetStipple(m_Stipple);
}
// Supplied with a wxAutoBufferedDC
void CustomPanel::Render(wxDC& dc)
{
dc.SetBrush(*wxGREEN_BRUSH);
dc.DrawRectangle(m_PanelRectange);
// "fade out" trimmed areas by drawing a ring.
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen(m_ScreenTone);
dc.DrawCircle(m_AnimatedCenter, VeryLargeRadius + m_VisibleRadius);
}
我试过提供面具,使用不同的点画面具(避免wxPENSTYLE_STIPPLE_MASK_OPAQUE
)等。
我在 Windows 10 上并针对 wxWidgets 3.1 进行编译,尽管该项目正在 built/run 其他操作系统上,并且可能是较低的库版本。
wxDC
不支持透明度,唯一的例外是使用 alpha 通道绘制位图。如果你想做任何涉及 alpha 的事情,你需要使用 wxGraphicsContext
和相关的 类。我不确定它的 GDI+ 或 Direct2D 实现目前是否能正确处理此问题,但在检查代码后,似乎至少前者应该如此。
我正在尝试在现有图像上绘制相当于屏幕色调效果的内容,但我想留出一个区域空白。想一想旧游戏中的聚光灯有时是如何处理的,其中大部分图像变暗,但其中一部分是 "normal" 颜色。
为此,我需要我的叠加层是透明的(因为原始图像必须显示出来)。我还使用 wxDC.DrawCircle(...)
(使用透明画笔)绘制它,因为它允许我不在圆形区域上绘制。
问题是,点画(屏幕色调效果)不是透明的,是实心的。我已经尝试了几乎所有我能想到的方法,但似乎没有任何效果。 我现在的代码大致是这样的:
const char* ScreenToneColor[] =
{
/* columns rows colors chars-per-pixel */
"3 3 2 1",
"X c Black",
"O c None",
/* pixels */
"OOO",
"OXO",
"OOO"
};
CustomPanel::CustomPanel(wxWindow* parent)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(151, 151))
{
SetBackgroundStyle(wxBG_STYLE_PAINT);
// MemberVariables
m_Stipple = wxBitmap(wxImage(ScreenToneColor));
m_ScreenTone = wxPen(*wxBLACK, 2 * VeryLargeRadius, wxPENSTYLE_STIPPLE);
m_ScreenTone.SetStipple(m_Stipple);
}
// Supplied with a wxAutoBufferedDC
void CustomPanel::Render(wxDC& dc)
{
dc.SetBrush(*wxGREEN_BRUSH);
dc.DrawRectangle(m_PanelRectange);
// "fade out" trimmed areas by drawing a ring.
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.SetPen(m_ScreenTone);
dc.DrawCircle(m_AnimatedCenter, VeryLargeRadius + m_VisibleRadius);
}
我试过提供面具,使用不同的点画面具(避免wxPENSTYLE_STIPPLE_MASK_OPAQUE
)等。
我在 Windows 10 上并针对 wxWidgets 3.1 进行编译,尽管该项目正在 built/run 其他操作系统上,并且可能是较低的库版本。
wxDC
不支持透明度,唯一的例外是使用 alpha 通道绘制位图。如果你想做任何涉及 alpha 的事情,你需要使用 wxGraphicsContext
和相关的 类。我不确定它的 GDI+ 或 Direct2D 实现目前是否能正确处理此问题,但在检查代码后,似乎至少前者应该如此。