|
| » myCSharp.de Diskussionsforum |
|
|
|
|
Autor
 |
|
commander_keen
myCSharp.de-Mitglied
Dabei seit: 15.11.2006
Beiträge: 16
Entwicklungsumgebung: Visual Studio 2005/2010 EE
|
|
Hallo,
ich habe eine Checkbox-Klasse erschaffen, die in Form eines Buttons daherkommt (flat) und ein Image zur Anzeige nutzt statt Häkchen. Dies ist jeweils eine runde LED (rot oder grün), die restliche Fläche der rechteckigen Grafik ist transparent.
Solange die Checkbox im Unchecked-Zustand ist, sieht alles gut aus, aber kurioserweise wird die Umgebung der grünen LED (Zustand: checked) weiß eingefärbt. (s.Bilder in folgenden Beiträgen)
Hat jemand eine Idee, warum dem so ist und wie man es beheben kann, sodass die Umgebung farblich gleich bleibt? (die weiße Fläche ist scheinbar größer als die Grafik, weiß muss also "von irgendwoher" kommen)
Ein fertiges Mini-Testprojekt (VS2010) inkl. Quelltext, Grafiken usw., wo nur die LEDcheckbox mittels Button getoggled wird, um den Effekt sichtbar zu machen, befindet sich im Anhang.
Die Klasse sieht folgendermaßen aus (sorgt nicht explizit für weiße Farbe):
C#-Code: |
public partial class LedCheckbox : System.Windows.Forms.CheckBox
{
public LedCheckbox() : base()
{
this.CheckedChanged += new System.EventHandler(this.LedCheckbox_CheckedChanged);
this.Image = this.Checked ? Properties.Resources.greenLEDt : Properties.Resources.redLEDt;
this.Appearance = System.Windows.Forms.Appearance.Button;
this.AutoSize = true;
this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.ForeColor = System.Drawing.Color.Transparent;
this.MinimumSize = new System.Drawing.Size(15, 15);
}
private void LedCheckbox_CheckedChanged(object sender, System.EventArgs e)
{
this.Image = this.Checked ? Properties.Resources.greenLEDt : Properties.Resources.redLEDt;
}
}
|
|
|
28.03.2012 00:52
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.495
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
Hallo commander_keen,
da wird wohl die eine Bitmap außenherum weiß und die anderen außenherum transparent sein. Wenn ich richtig liege, brauchst du keinen Debugger, sondern ein Bildbearbeitungsprogramm, um den Fehler zu finden und zu beheben.
herbivore
|
|
28.03.2012 02:15
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
commander_keen
myCSharp.de-Mitglied
Dabei seit: 15.11.2006
Beiträge: 16
Entwicklungsumgebung: Visual Studio 2005/2010 EE
Themenstarter
|
|
Hallo,
ich hatte die umgebenden Pixel bei beiden LED-Grafiken mittels IrfanView eigenhändig auf transparent gesetzt. (im Original sind es PNG, beide sind im Mini-Testprojekt des ersten Beitrages im Ordner Resources enthalten, falls sie jemand kontrollieren mag, ich wüsste nicht, was ich daran noch ändern könnte/müsste, wäre ggf. für Tipps dankbar)
Auch ist die weiße Fläche mit ca. 19x19 Pixeln größer als meine Grafik (15x15), daher nahm ich ein Problem im Programm an.
edit: Danke fürs Prüfen chilic.
Dann scheint die Wahrscheinlichkeit für eine programmbasierte Ursache wohl wieder zu steigen.
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von commander_keen am 28.03.2012 11:19.
|
|
28.03.2012 11:16
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rallepralle
myCSharp.de-Mitglied
Dabei seit: 08.08.2008
Beiträge: 140
Entwicklungsumgebung: VS 2010
|
|
Hallo,
jedesmal, wenn das Bild gewechselt wird, wird im Hintergrund ein weißes Bild im Hintergrund gezeigt unabhängig davon, ob es ein rotes oder grünes Bild angezeigt wird(keine Ahnung warum).
Durch das Hinzufügen eines Hintergrundbildes, das dieselbe Farbe hat, wie die Form, ist das Problem gelöst.
Ich muss aber zugeben, dass es keine schöne ist. :) Evtl. helfen dir die Infos trotzdem. Sh. Anhang
vg
R.
|
|
28.03.2012 12:54
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
commander_keen
myCSharp.de-Mitglied
Dabei seit: 15.11.2006
Beiträge: 16
Entwicklungsumgebung: Visual Studio 2005/2010 EE
Themenstarter
|
|
In der Tat ein schmutziger Trick. ;-)
Guter Hinweis, das brachte mich jetzt auf die Idee ein transparentes BackgroundImage einzusetzen, aber leider ist das weiß nicht das tatsächliche BackgroundImage selbst, sondern "dahinter", das ist natürlich besch...eiden, denn bei transparenten Background-Image kommt es daher trotzdem wieder durch.
Das Problem mit einem grauen Bild ist, dass es sich nicht anpasst. Bei mir weicht es nur leicht ab, aber sobald man Windows freien Lauf lässt und unter XP anstatt "Windows klassisch" bspw. die standardmäßige Luna-Oberfläche lädt, wird das Rechteck direkt wieder auffällig andersfarbig als der Rest des Forms, da Windows dann eher ins gelb geht. Leider ist das somit keine praktikable Lösung, schade.
|
|
28.03.2012 15:05
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rallepralle
myCSharp.de-Mitglied
Dabei seit: 08.08.2008
Beiträge: 140
Entwicklungsumgebung: VS 2010
|
|
Hallo,
dieses "weiße" ist die "Hintergrundfarbe" der Checkbox, und kann nich auf transparent eingestellt werden. Probiere mal die appearance nicht auf "Button", sondern "normal" zu stellen, und du wirst sehen, dass das Häkchen auf transparent, nicht aber die weiße Farbe drumherum transparent ist.
.... und ich glaub mit werken im Designer geht das auch nicht.... probiere mal das hier aus:
True Transparency support for the .NET CheckBox control
|
|
28.03.2012 15:54
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
commander_keen
myCSharp.de-Mitglied
Dabei seit: 15.11.2006
Beiträge: 16
Entwicklungsumgebung: Visual Studio 2005/2010 EE
Themenstarter
|
|
Oh, sehr informativer Artikel, den habe ich bei meiner verzweifeltelten Googlelei nicht entdeckt gehabt. Ich hatte im Netz nur mal den Hinweis gefunden, dass ControlStyles.SupportsTransparentBackColor nicht möglich wäre. Das muss sich dann wohl auf sowas wie FlatStyle.System bezogen haben.
Da kommt mir jetzt entgegen, dass ich einen der Styles verwende, für den das ohne riesigen Aufwand nachrüstbar ist, nämlich FlatStyle.Flat
Meine Klasse also entsprechend ergänzt um
C#-Code: |
public LedCheckbox() : base()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
[...]
}
|
und Transparenz lässt sich in Verbindung von transparenter "Farbe" mit transparenter CheckedBackColor unter FlatAppearance tatsächlich nutzen.
Besten Dank! :-)
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von commander_keen am 28.03.2012 16:21.
|
|
28.03.2012 16:18
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
rallepralle
myCSharp.de-Mitglied
Dabei seit: 08.08.2008
Beiträge: 140
Entwicklungsumgebung: VS 2010
|
|
Hallo,
kommt vlt. ein bisschen spät, aber wäre es in deinem Fall nicht besser statt einer checkBox ein normales Button zu machen und diesen deine Bilder nach jedem Drücken zu überweisen?
Ich hab das auch mal gemacht für einen Button, der zwei Zustände haben sollte. Bei jedem Zustand habe ich ihm ein transparentes Bild überwiesen. Hat wunderbar geklappt.
lg
R.
|
|
29.03.2012 10:00
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
commander_keen
myCSharp.de-Mitglied
Dabei seit: 15.11.2006
Beiträge: 16
Entwicklungsumgebung: Visual Studio 2005/2010 EE
Themenstarter
|
|
Das wäre u.U. tatsächlich einfacher gewesen, v.a. wenn ich vorher um den Umstand gewusst hätte, dass die Checkboxen so "herumzicken".
Ursprünglich sollten die Teile sowohl für Eingabe, als auch für bloße Anzeige (Änderung durch externe Daten) dienen. Eigentlich hatte ich auch beabsichtigt, auf den ThreeState zurückzugreifen, aber das hat sich aufgrund von externen Limitierungen vorerst erledigt.
Für den Fall, dass es doch noch dazu kommt, lasse ich es mal so, wäre auch unnötige Arbeit jetzt etwas fehlerfrei funktionierendes umzubauen. ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von commander_keen am 30.03.2012 16:30.
|
|
30.03.2012 16:30
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
|
|