定制斑点笔

时间:2016-06-22 14:04:12

标签: wxwidgets

我试图在现有图像上绘制相当于屏幕色调效果的内容,但我想将某个区域留空。想想旧游戏中的聚光灯有时会如何完成,大部分图像都会变暗,但其中一部分是正常的"颜色。
要做到这一点,我需要我的叠加层是透明的(因为原始图像必须显示)。我也用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进行编译,尽管该项目正在其他操作系统上构建/运行,并且可能是较低的库版本。

1 个答案:

答案 0 :(得分:1)

wxDC并不支持透明度,只有使用alpha通道绘制位图的唯一例外。如果你想做任何涉及alpha的事情,你需要使用wxGraphicsContext和相关的类。我不确定它的GDI +或Direct2D实现当前是否正确处理了这个问题,但在检查代码之后,它似乎至少应该是前者。