2016-06-22 3 views
0

Ich versuche zu zeichnen, was zu einem Bildschirm-Ton-Effekt über ein vorhandenes Bild hinausgeht, aber ich möchte eine Fläche leer lassen. Denken Sie daran, wie Scheinwerfer in alten Spielen manchmal gemacht werden, wo der größte Teil des Bildes abgedunkelt ist, und aber ein Teil davon ist die "normale" Farbe.
Dafür brauche ich mein Overlay transparent (da das Originalbild durchscheinen muss). Ich zeichne das auch mit wxDC.DrawCircle(...) (mit einem transparenten Pinsel), da ich nicht über eine Kreisfläche zeichnen kann.Benutzerdefinierte punktierte Stift

Problem ist, der Stipple (Bildschirm-Ton-Effekt) ist nicht transparent, es ist solide. Ich habe fast alles ausprobiert, was mir einfällt, aber nichts scheint zu funktionieren. Meine aktuellen Code ist in etwa wie folgt aus:

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); 
} 

Ich habe versucht, die Maske liefern, die verschiedenen stipple Masken (wxPENSTYLE_STIPPLE_MASK_OPAQUE vermeiden) usw. Ich bin auf 10 Fenster und Kompilieren gegen wxWidgets 3.1, obwohl Das Projekt wird auf anderen Betriebssystemen und möglicherweise einer niedrigeren Bibliotheksversion erstellt/ausgeführt.

+0

können Sie den Git HEAD versuchen? Und überprüfen, wie sich die anderen Plattformen verhalten? – Igor

+0

Ich kann versuchen, Git HEAD morgen oder so etwas, aber ich habe keine Möglichkeit, auf den anderen Plattformen selbst zu testen. –

+0

ok, bitte überprüfe den HEAD und frage jemanden nach der anderen Plattform. – Igor

Antwort

1

wxDC unterstützt keine Transparenz mit nur der einzigen Ausnahme beim Zeichnen von Bitmaps mit Alphakanal. Wenn Sie etwas mit Alpha machen wollen, müssen Sie wxGraphicsContext und verwandte Klassen verwenden. Ich bin mir nicht sicher, ob GDI + oder Direct2D-Implementierungen es derzeit korrekt behandeln, aber nach dem Überprüfen des Codes scheint es, als ob zumindest der vorherige es tun sollte.

+0

Richtig du bist (jetzt, wo ich weiß, was ich suchen soll ...)! Denkst du, du könntest die relevante Dokumentation für zukünftige interessierte Leser verlinken? –

+0

Meinst du etwas [wie das] (http://docs.wxwidgets.org/trunk/classwx_d_c.html#dc_alpha_support)? –

+0

Ja. Obwohl ich es bisher noch nicht geschafft habe, mit 'wxGCDC' zu arbeiten, muss ich vielleicht einen anderen ausprobieren. Sieht ansonsten aber schöner aus. –