首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制点笔

定制点笔
EN

Stack Overflow用户
提问于 2016-06-22 14:04:12
回答 1查看 84关注 0票数 0

我试图画一个相当于屏幕色调效果的现有图像,但我想保留一个区域空白。想想看,在老游戏中,聚光灯有时是如何完成的,在那里,大部分的图像都变暗了,但其中一部分是“正常”的颜色。

要做到这一点,我需要我的覆盖是透明的(因为原始图像必须显示通过)。我也用wxDC.DrawCircle(...) (用透明的画笔)画这个,因为它允许我不能画一个圆形的区域。

问题是,点点(屏幕色调效果)是不透明的,它是坚实的。我已经试过了所有我能想到的东西,但似乎都没有用。我目前的代码大致如下:

代码语言:javascript
复制
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,尽管该项目正在其他操作系统上构建/运行,并且可能是一个较低的库版本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 17:13:44

wxDC不支持透明性,唯一的例外是使用alpha通道绘制位图。如果您想要执行任何涉及alpha的操作,则需要使用wxGraphicsContext和相关类。我不确定它的GDI+或Direct2D实现目前是否正确地处理了这个问题,但是在检查了代码之后,看起来至少前一个应该正确。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37970427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档