2009-06-14 13 views
1

Ich frage mich, wie man ein Fenster transparent macht, nicht ausgeschnittene Löcher oder die gleiche Transparenz insgesamt.Plattformübergreifende transparente Fenster in C++?

Nun, sag einfach, ich möchte ein PNG-Bild einer Rose oder etwas knallen und es schön mit dem Zeug dahinter mischen lassen und Sachen hinterher ziehen lassen und ihre Veränderungen durch die transparenten Teile des Bildes/Fensters scheinen lassen.

Ich könnte (oder möchte) etwas wie wxWidgets oder OpenGL verwenden. Aber eher nicht Qt oder GTK.

Antwort

1

Ich fand heraus, dass es eigentlich ziemlich einfach ist, ein transparentes Bild auf dem Bildschirm mit wXw zu werfen:

wxScreenDC dc; 

wxBitmap bmp(wxT("test.png"), wxBITMAP_TYPE_PNG); 
dc.DrawBitmap(bmp, 250, 100, true); 

Jetzt habe ich, um herauszufinden, wie Updates zu handhaben und so hat es (vielleicht sein teilweise neu gezeichnet) wenn etwas unter Updates.

Wie es gerade jetzt ist, zeichnet es sich nur von sich selbst neu, so dass es in einer Weile vollständig opak wird.

Es gab eine andere Version von wxScreenDC :: DrawBitmap, die ein Fenster als Argument verwendet hat, vielleicht ist es, dass man das löst?

0

Siehe wxTopLevelWindow::SetTransparent.

Wenn die Plattform unterstützt wird, wird das Fenster als durchscheinend festgelegt.

Also ich denke, wxWidgets können es tun.

+0

Ich wusste über diese Funktion, es setzt das gesamte Fenster auf die gleiche Transparenz. Nicht wirklich, was ich meinte. Ich möchte einige Pixel vollständig transparent, einige andere völlig opak und viele andere irgendwo dazwischen haben. Wie dieses zufällige Bild aus dem Internet (Suche nach "redrose.png" bei google): http://www.uniqueboutiquedallas.com/images/redrose.png es ist Kanten ist transparent und macht es in was auch immer ist hinter. Schauen Sie sich http://www.rainlendar.net/cms/components/com_rny_gallery/simpleviewer/images/Skins-Win.png an und Sie sehen, wie die Fenster in einigen Bereichen transparent sind. – Frank

0

Wenn Sie etwas anderes als C++ tun möchten, gibt es möglicherweise andere plattformübergreifende Optionen wie JavaFx und Adobe AIR.

+2

Ich persönlich (wirklich sehr) mag sie beide nicht. Also nein, ist die einfache Antwort. – Frank

+0

Adobe Air ist heute noch weniger plattformübergreifend, da sie Support für mehrere Plattformen, einschließlich meiner Hauptplattformen (Linux & Android), eingestellt haben. – Frank

1

Wie wäre es mit geformten Rahmen?

wxBitmap m_bmp = wxBitmap(_T("redroseonwhite.png"), wxBITMAP_TYPE_PNG); 
SetSize(wxSize(m_bmp.GetWidth(), m_bmp.GetHeight())); 
wxRegion region(m_bmp, *wxWHITE); 
bool m_hasShape = SetShape(region); 

Schauen Sie * wxWidgets-2.9.0 \ samples \ shaped * für das vollständige Beispiel.

+0

Ich bin nur neugierig, werden die Kanten nicht gezackt? (Alias-Problem) Im Moment fühle ich mich wie ich es komplett selbst machen muss, indem ich probiere, wie es auf jeder Plattform funktioniert, die ich unterstützen möchte (X-server Composite-Erweiterung auf X, was auch immer auf Windows usw.) – Frank

Verwandte Themen