transparent picturebox
-
hi
ich habe ein problem unszwar das picturebox1 ein bild hat und ich will das picturebox2 transparent über picturebox1 liegt.der hintergrund in meinem fenster ist schwarz wenn ich jetzt picturebox2 über picturebox1 lege und picturebox2 auf transparent einstelle wird es schwarz.
hoffe einer hat eine lösung für dieses kniffilge problem
-
Mal versucht das**
Opaque
**Flag via**SetStyle
**zu setzen?Opaque
If true, the control is drawn opaque and the background is not painted.
-
wie soll ich das einsetzen?
-
Na, wenn die "picturebox2" über der "picturebox1" liegt, muss für "picturebox2" wohl das Opaque Flag gesetzt sein, damit die "picturebox1" hindurch scheinen kann.
Ansonsten wird in den transparenten Bereichen von "picturebox2" einfach ganz normal der Hintergrund gezeichnet, so wie Du es beschrieben hast. Deswegen vermute ich, dass das Flag bei Dir eben nicht gesetzt ist.
Ich kenne Deinen Code ja nicht, aber so oder so ähnlich müsste es dann aussehen:
picturebox2.SetStyle(ControlStyles.Opaque, true)
-
sieht cli eher nicht so aus: ?
picturebox2->SetStyle(ControlStyles::Opaque = true)
-
niv schrieb:
sieht cli eher nicht so aus: ?
picturebox2->SetStyle(ControlStyles::Opaque = true)
Wenn "picturebox2" ein Zeiger ist (wie gesagt, ich kenne Deinen Code ja nicht), dann solltest Du natürlich den**
->
Operator anstatt des.
**Operators verwendenAber "ControlStyles::Opaque = true", also eine Zuweisung an eine Konstante, dürfte wohl keine gültige C++ Syntax sein (auch nicht in C++/CLI). Außerdem erwartet**
SetStyle()
**zwei Parameter...
-
wenn ich das richtig verstanden hab, muss der code so aussehen: !?
this->pictureBox1->SetStyle(ControlStyles::Opaque, true);
1 fehler kommt: error C3767: "System::Windows::Forms::Control::SetStyle": Auf mögliche Funktion(en) kann nicht zugegriffen werden.
muss ich da ggf. noch eine zusätzliche (using) namespace schreiben?
-
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle(v=vs.110).aspx
SetStyle(..) ist protected, d.h. nicht von aussen aufrufbar - nur von abgeleiteten Klassen (oder natürlich der Klasse selbst).
-
Schau mal hier:
http://support.microsoft.com/kb/943454Transparent controls in WinForms are transparent relative to their parent, not to other controls. Transparency in WinForms is more akin to camouflage than true transparency. A transparent control doesn’t actually let you see the control behind it through the form. It asks its parent to draw its own background on the "transparent" control. This is why a transparent control shows the form behind it, but covers up any other controls.
Demnach solltest Du also dafür sorgen, dass das Eltern-Control von "picturebox2" gleich "picturebox1" ist.
-
sry konnte gestern nicht antworten
in dem link steht drin, unten bei properties, das es nur diese NET-Versionen unterstützt(oder irre ich mich da!?) :
Microsoft .NET Framework 1.0
Microsoft .NET Framework 1.1
Microsoft .NET Framework 2.0
Microsoft .NET Framework 3.0jedoch habe ich net 4.0 .trotzdem habe ich mir die seite durchgelesen, aber sie hat mir nicht weitergeholfen
wenn ich noch folgen kann dann benutzen sind wir immer noch bei der " picturebox2->SetStyle(ControlStyles::Opaque = true) " sache oder bei etwas ganz neuem?
-
niv schrieb:
wenn ich noch folgen kann dann benutzen sind wir immer noch bei der " picturebox2->SetStyle(ControlStyles::Opaque = true) " sache oder bei etwas ganz neuem?
Wie theta schon angemerkt hat, kannst Du die Funktion**
SetStyle()
leider nicht "von außen" aufrufen, da sieprotected
**ist.Die einzige Möglichkeit, um**
SetStyle()
**an einem PictureBox-Objekt aufzurufen wäre, eine eigene Klasse von der PictureBox-Klasse abzuleiten. Aber das ist vllt gar nicht sinnvoll/erforderlich.Lies doch mal das Zitat aus MSDN, das ich weiter oben schon gepostet habe, der erste Satz sagt schon alles:
Transparent controls in WinForms are transparent relative to their parent, not to other controls. Transparency in WinForms is more akin to camouflage than true transparency. A transparent control doesn’t actually let you see the control behind it through the form. It asks its parent to draw its own background on the "transparent" control. This is why a transparent control shows the form behind it, but covers up any other controls.
Transparente Elemente sind bei WinForms also nur in dem Sinne "transparent", dass sie ihren Hintergrund von ihrem jeweiligen Eltern-Element zeichnen lassen.
Solange das Eltern-Element von "pitcurebox2" das Hauptformular und nicht die "picturebox1" ist (was ich vermute, aber nur Du kannst es nachprüfen!), wird es demnach nicht so funktionieren, wie Du es haben willst...
-
wie würde das als code aussehen
denn ich habe grad keine ahnung wie ich das in einen code "umwandeln" könnte.
-
niv schrieb:
wie würde das als code aussehen
denn ich habe grad keine ahnung wie ich das in einen code "umwandeln" könnte.Falls Du Deine GUI in einem graphischen Editor entwirfst, sollte es bereits dort eine Möglichkeit geben, das Eltern-Control für jedes einzelne Control festzulegen. Bin jetzt kein Winforms-Experte, aber normalerweise sollte es doch irgendwo im Editor eine Baum-Ansicht geben, wo man sehen kann, wie die Controls zueinander in Beziehung stehen - ähnlich dem Objekt Inspektor im Qt Designer. Ansonsten musst Du es halt zur Laufzeit (sprich: im Code) über das**
Parent
**Property setzen...
-
vielleicht habe ich mich nicht richtig ausgedrückt oder du hast es falsch verstanden ^^.
das 7_10.png sieht garnicht nach dem editor den ich habe. ich benutze visual c++ 2010 express
bei mir sieht das ganze so aus:
http://fs1.directupload.net/images/141121/temp/3epjlj6x.png
das rote soll da sein wo es blaugrün ist und transparent sein.das blaue(rechts) ist unwichtig.und unten rechts bei eigenschaften gibt es nichts mit eltern-control, oder irre ich mich da
-
niv schrieb:
vielleicht habe ich mich nicht richtig ausgedrückt oder du hast es falsch verstanden ^^.
das 7_10.png sieht garnicht nach dem editor den ich habe. ich benutze visual c++ 2010 express
bei mir sieht das ganze so aus:
Ich habe auch gar nicht behauptet, dass Dein Editor genau so aussieht
Ich habe bloß gesagt, dass, sofern Du Deine GUI mit einem graphischen Editor entwirfst, es irgendwo eine Baum-Ansicht geben sollte, wo man die Eltern-Kind-Beziehung zwischen den einzelnen Controls sehen/editieren kann - also so ähnlich wie der "Objekt Inspektor" im Qt Designer. Wie das Äquivalent zum "Objekt Inspektor" in Visual Studio respektive Winforms heißt, weiß ich nicht. Wie schon gesagt, ich bin kein ausgewiesener Winforms Experte...
niv schrieb:
und unten rechts bei eigenschaften gibt es nichts mit eltern-control, oder irre ich mich da
Bei allen GUI Editoren, die ich bisher verwendet habe, sei es nun der Qt Designer oder Borland Delphi, gibt es für diesen Zweck eine separate Baum-Ansicht.
Bei Delphi sieht das ganze zum Beispiel so aus:
http://i.imgur.com/1Gm7wJg.png
-
so meine frage ist immer noch ungeklärt ^^
wie würde das als code aussehen?
-
niv schrieb:
so meine frage ist immer noch ungeklärt ^^
wie würde das als code aussehen?In etwa so?
Control1.Parent = Control2;
Aber nochmal: Wenn Du die Eltern-Kind-Zuordnung direkt im GUI-Designer so festlegst, wie Du sie haben möchtest, sollte dieser Schritt unnötig sein.
-
wenn ich jetzt pictureBox1->Parent = pictureBox2 eingebe, oder umgekehrt,passiert nichts.es kommt auch kein fehler
-
Hat ihm keiner mehr geantwortet? Ich hab das selbe Problem gehabt. Bei mir hat es wie folgt funktioniert; "niv" hat lediglich nicht die C++ üblichen exakten Objekt-Bezüge beachtet:
this->pictureBox2->Parent = this->pictureBox1;Ab VC Express 2008 funzt das. Manipulation von "Opaque" in Art von
this->SetStyle( ControlStyles::Opaque, true );
ist bei mir unnögig gewesen irgendwie. ^^Nur ist nun zu beachten daß die Koordinaten nicht mehr stimmen, da das Parent ja nicht mehr die Form ist, sondern die pictureBox1. Sind also relative Offsets im Forms Designer. Ich weiss ja nicht was er machen möchte, aber für Games wäre pictureBox1 ja wohl eh das gesamte Window.
PS: ihr mixt hier wild C# und C++ (Control1.Parent VS Control1->Parent)