C# Transparency Key

Neue Frage »

Auf diesen Beitrag antworten »
InformaTiger C# Transparency Key

Hallo,
ich habe letztens eine Windows Form programmiert in der ich keinen Rahmen verwende und in der ich den Hintergrund mit der Transperency Key- Eigenschaft transparent mache. Egal was ich aber mache bleibt der Rand immer verpixelt (siehe Bild). Ich habe bereits nach bekannten Bugs dieser Funktion gesucht aber das hat mir nicht wirklich weitergeholfen. Und ansonsten habe ich keine Idee mehr nach was ich noch Suchen könnte.

Weiß jemand vielleicht womit das zusammenhängt?

smile

Mfg
InformaTiger
 
Auf diesen Beitrag antworten »
eulerscheZahl

Im angefügten Bild haben die grauen Pixel am Rand verschiedene Farbwerte. Kann es sein, dass du genau einen Farbwert transparent machen willst und die Ränder deiner Vorlage nicht "sauber" sind?

Falls es daran nicht liegt, brauchen wir schon etwas mehr (Orginalbild und etwas Quelltext)
Auf diesen Beitrag antworten »
InformaTiger

Ok, ums genauer zu machen:

die im Bild abgebildete Symbolleiste ergibt sich wie folgt:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
private void Main_Paint(object sender, PaintEventArgs e)
        {
            // es wird nur gezeichnet wenn sich das Programm an der obersten Position befindet
            if (this.AutoScrollPosition.Y == 0)
            {
                // Rendering Modus wird auf AntiAlias gesetzt
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

                // der Grafikpfad zum Zeichnen des Infobereichs wird erstellt
                GraphicsPath menueDrawer = new GraphicsPath();
                menueDrawer.StartFigure();
                menueDrawer.AddBezier(new Point(0, 0), new Point(20, 5), new Point(20, 60), new Point(45, 60));
                menueDrawer.AddLine(new Point(45, 60), new Point(220, 60));
                menueDrawer.AddBezier(new Point(220, 60), new Point(240, 55), new Point(240, 0), new Point(265, 0));
                menueDrawer.CloseFigure();

                // Zweifarbig? Ja/Nein
                if (bUseTwoColors)
                {
                    e.Graphics.FillPath(new LinearGradientBrush(new Rectangle(0, 0, 265, 60), Color.White, Color.Black, LinearGradientMode.ForwardDiagonal), menueDrawer);
                    e.Graphics.DrawPath(new Pen(new LinearGradientBrush(new Point(0, 0), new Point(265, 0), Color.White, Color.Black)), menueDrawer);
                }
                else
                {
                    e.Graphics.FillPath(new SolidBrush(Color.Gray), menueDrawer);
                    e.Graphics.DrawPath(new Pen(new SolidBrush(Color.DarkGray)), menueDrawer);
                }
                menueDrawer.Dispose();
            }
        }


Und der Transparency Key ist so definiert:

code:
1:
2:
// die Form wird transparent gemacht
this.TransparencyKey = Color.FromKnownColor(KnownColor.Control);

wobei eben die Hintergrundfarbe normal (also Control) belassen wird.

Was eventuell noch sein könnte:
ich zeichne hier ja auch einen Rand, mit der Farbe Dunkelgrau bzw. Schwarz/Weiß kann sein das sich das mit dem Transparency Key nicht verträgt?

Mfg
InformaTiger
Auf diesen Beitrag antworten »
eulerscheZahl

Ist bUseTwoColors true oder false?
TransparencyKey macht nur eine Farbe durchsichtig, LinearGradientBrush macht dir aber mehrere Farben an den Rand, das verträgt sich, denke ich, nicht.

Wenn du dein Projekt hochlädtst (oder die wesentlichen Teile, aber bitte soviel, dass ich es direkt ausführen kann), kann ich mal drübergucken. Ich kann dir aber nichts versprechen, habe selbst noch nicht mit so etwas gearbeitet.

PS: .NET 4.5 hat ja einiges an Funktionalität hinzugefügt geschockt
 
Auf diesen Beitrag antworten »
InformaTiger

Ob bUseTwoColors true oder false ist entscheidet der User indem er die Einstellungen ändert sprich zu beginn werden diese boolean-Werte aus der config.ini Datei gelesen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
            try
            {
                // Konfigurationsdaten werden aus der config-datei gelesen
                StreamReader sr = new StreamReader("config.ini");
                List<string> config = new List<string>();
                while (!sr.EndOfStream)
                {
                    config.Add(sr.ReadLine());
                }
                sr.Close();

                // es wird in die jeweilige Variable aufgeteilt
                for (int i = 0; i < config.Count; i++)
                {
                    string[] temp = config[i].Split('=');

                    switch (i)
                    {
                        case 0:
                            {
                                bHideTaskbar = Convert.ToBoolean(temp[1]);
                                break;
                            }
                        case 1:
                            {
                                bTopMost = Convert.ToBoolean(temp[1]);
                                break;
                            }
                        case 2:
                            {
                                bUseTwoColors = Convert.ToBoolean(temp[1]);
                                break;
                            }
                    }
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


für den Rest habe ich dir das gesamte Projekt in einer Email geschickt.

Vielen Dank inzwischen smile

Mfg
InformaTiger
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »