Frage

Zunächst geht es nicht darum, den PictureBox -Steuerelement transparent zu machen. Es geht um Bitmap -Transparenz auf der vollständigen "Leinwand".

Die PictureBox hat immer die Größe von 300*300 mit weißem Hintergrund. Für die Kontrolle ist keine Transparenz erforderlich.

Was ich brauche, ist der Weg, um das transparente Rechteck (oder was auch immer) auf die Bildkiste zu zeichnen.

Sagen Sie, ich habe einen folgenden Code

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

Dadurch zeichnet ein rotes Rechteck in der Mitte der weißen Leinwand. Jetzt brauche ich eine andere (transparente) "Ebene" auf dem Bild, das ein anderes Rechteck enthält, aber eines, das transparent ist.

ich kann es versuchen

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

Da ich eine Farbe verwende, indem ich sein Alpha = 128 angehe, sollte das resultierende Rechteck transparent sein, sodass das erste rote Rechteck durch dieses andere grüne gesehen werden sollte.

Dies geschieht jedoch nicht richtig. Ich kann das rote Rechteck hinter dem neuen grünen sehen, aber der Teil des grünen Rechtecks, der den roten nicht überlappt, bleibt vollständig undurchsichtig. Wenn ich jedoch den Alpha-Wert der Farbe auf einen extrem geringen Wert (z. B. 1-5) festlegt, sieht das gesamte Rechteck transparent aus. Dies ist meiner Meinung nach nicht normal - dass 5/255 nur halb transparent ist und dass 128/255 überhaupt nicht transparent ist ... und wenn zuvor eine Zeichenfolge mit g.drawstring () gezeichnet wurde, wird die Zeichenfolge entweder dahinter angezeigt Das grüne Rechteck oder nicht, abhängig von der Transparenz. Wenn beispielsweise das Alpha größer als oder gleich (um) 40 ist, ist die Saite überhaupt nicht sichtbar, und wenn sie weniger als 40 ist, zeigt sie sich an, dass für kleinere Alpha -Werte bis zu alpha = 0 sichtbarer ist.

Wie wird dieser Pinsel (wenn aus Argb -Farbe erstellt) angewendet? Vermisse ich etwas? Für mich scheint es, dass das Einstellen eines transparenten Pinsels den Hintergrund "sichtbarer" macht, anstatt das Objekt "weniger sichtbar" festzulegen.

Vielen Dank für alle Antworten mit Vorschlägen.

BEARBEITEN Es scheint, dass ich einen bösen Fehler in der Anwendungslogik hatte, so dass die Zeichnungsroutine in einer Schleife stattgefunden hat. Als ich eine bestimmte Anzahl transparenter Rechtecke sammelte, wurden sie immer dicker.

Der Code, wenn er aus der Schleife herausgenommen wird, funktioniert korrekt.

Mein Fehler.

War es hilfreich?

Lösung

ALT Text http://lh4.ggpht.com/_1tpop7dzy1e/s02ivaoggti/aaaaaaaaac6s/zqvzq5gdwsu/s800/capture4.png

erfolgt durch diesen Code:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

Der grüne Teil ist nicht undurchsichtig, wie Sie sehen können ... die Schnur ist perfekt sichtbar.

Für mich scheint es, dass das Einstellen eines transparenten Pinsels den Hintergrund "sichtbarer" macht, anstatt das Objekt "weniger sichtbar" festzulegen.

Hintergrund "sichtbarer" und Objekt "weniger sichtbar" sind dasselbe ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top