Laden...

Controls zeichnen durch halbtransparentes Panel "durch" (je nach Double-Buffering-Einstellung)

Erstellt von markus111 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.053 Views
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 12 Jahren
Controls zeichnen durch halbtransparentes Panel "durch" (je nach Double-Buffering-Einstellung)

Hallo Community,

Was ich vor hab: ich will auf meine Windows-Forms Form ein halbtransparentes Panel legen, durch das man nicht "durchklicken" kann, und sich andere Controls nicht oben drauf malen können.
Wie das dann ungefähr aussehen soll hab ich mal schnell in Photoshop zusammengeklickt.

Mein Problem ist, dass sich andere Controls durch mein Panel "durchmalen", so dass z. B. Rahmen von TextBoxen nicht mehr unter dem Panel liegen.
Hat jemand eine Idee wie sowas zu machen ist? Oder gäbe es eine bessere/einfachere Möglichkeit, als ein Panel im Fill-Dockstyle?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
T
415 Beiträge seit 2007
vor 12 Jahren

Ein normales Panel hat ja keine Opacity Eigenschaft. Aber vielleicht hast du hiermit ja Erfolg.

http://www.codeproject.com/KB/cpp/AlphaGradientPanel.aspx

Hinweis von herbivore vor 12 Jahren

Threads zusammengefügt

Ich weiß, du hattest vorher darum gebeten, den alten Thread zu entfernen, aber da gab es ja schon eine Antwort.

Der neue Thread ist eine direkte Fortsetzung des Themas, deshalb auch das Zusammenfügen.

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 12 Jahren
DoubleBuffered, Halbtransparentes Panel auf einer Form

Hallo C#-Freunde,

ich habe bereits Stunden probiert und gegoogelt, aber nichts gefunden, wie ich ein doppelt gepuffertes (damit es nicht flackert) Panel im DockStyle.Fill auf eine Form lege, und trotzdem durchschimmern sehe, was darunter ist.

Ich habe schon probiert das Parent-Control selber zu zeichnen, allerdings passen dann die Positionen der Controls nicht mehr, und beispielsweise bei einem Button ist der Text nicht mehr wo er hingehört.

Ohne double-buffering funktioniert es (ohne das ParentControl selber zu zeichnen) halbwegs, allerdings zeichnen sich die darunter liegenden Controls gerne mal durch das Panel durch.

Hat jemand sowas schonmal gemacht und sogar hinbekommen?

Wer es sich nicht vorstellen kann: ich hab das einmal in Photoshop zusammengebastelt.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
296 Beiträge seit 2007
vor 12 Jahren

Ich weiß nicht inwieweit das noch mit dem DoubleBuffer-Mechanismus von Controls zusammenhängt, aber:

Ohne double-buffering funktioniert es (ohne das ParentControl selber zu zeichnen) halbwegs, allerdings zeichnen sich die darunter liegenden Controls gerne mal durch das Panel durch.

liegt denk ich am z-Index, also an der Reihenfolge wie du die Controls aufs Form legst.
Mit Panel.BringToFront() holst du das Control im z-Index nach vorne.

Grüße

_
48 Beiträge seit 2011
vor 12 Jahren

Also das Problem hab ich bisher immer über den ARGB-Wert gelöst, wenn du den A-Wert gering hälst (in dem Fall hier 64;255;0;0), erzeugst du eine gewisse Transparenz:

731 Beiträge seit 2006
vor 12 Jahren

Hi, also meine letzte Vorgehensweise war so, dass ich ein Screenshot der Clientarea geschossen hab und diesen innerhalb einer PictureBox (Dock.Fill) angezeigt hab. Dann habe ich im Paint-Eventhandler der PictureBox noch ein halbtransparentes Rechteck über die komplette PictureBox gezeichnet.

Geht bestimmt eleganter, doch es funktioniert hier in der Software und sieht gut aus. 😃

Mfg
wax

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 12 Jahren

Hallo,

@myUnderTakeR: Das mache ich schon, nur wenn man ein anderes Fenster anklickt und das wieder das mit der Transparenz zeichnen sie sich durch.

@Bugrick: Die Controls sollen aber unter den Panel sein. Das mit dem ARGB Wert mach ich natürlich auch, aber sobald ich DoubleBuffering aktiviere funktioniert die Transparenz nicht mehr.

@Wax: wär eine (unschöne) Möglichkeit wenn nichts anderes funktioniert (man könnt den Screenshot auch mit Graphics.DrawImage malen, machts vielleicht etwas schöner. Könnt ich ja vorrübergehend probieren.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
1.665 Beiträge seit 2006
vor 12 Jahren

Was heißt genau "sobald du DoubleBuffering verwendest"?

Edit: Hab das mal versucht, nachzustellen. Scheint so nix zu helfen. Da Transparenz, vor allem in GDI/+ sehr langsam ist, ist wohl WPF die bessere Wahl, wenn du damit rumspielen willst.

public class MagicPanel : Control
{
    public MagicPanel()
    {
        this.SetStyle(
            ControlStyles.SupportsTransparentBackColor | /* wichtig */
            ControlStyles.UserPaint | /* benötigt */
            ControlStyles.AllPaintingInWmPaint | /* benötigt */

            ControlStyles.OptimizedDoubleBuffer | /* Mit oder ohne, gleiches Verhalten */
                
            ControlStyles.ContainerControl | /* optional */
            ControlStyles.ResizeRedraw, /* optional */
            true);
    }
}
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 12 Jahren

Naja, es funktioniert ohne aktiviertes DoubleBuffering, wenn ich es (über die Property) aktiviere funktioniert die Transparenz nicht mehr.

Ich würde ja gerne WPF nehmen, da die Anwendung aber eigentlich für .NET 2.0 geplant war, wird das nicht funktionieren (wobei ich auch gerne Sachen wie LINQ hätte, aber das funktioniert alles unter Win2k nicht mehr).

@Wax: wie genau hast du das mit dem Screenshot gemacht, Parent.DrawToBitmap() zeichnet 1. leider den Fensterrahmen mit und 2. sehen die Controls etwas "langweilig" aus?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
731 Beiträge seit 2006
vor 12 Jahren

Hi,

den Code hab ich damals irgendwo im Netz gefunden...


public static Bitmap CaptureWindow(ref Form inForm)
{
	Image result = null;

	try {
		Graphics g1 = inForm.CreateGraphics();
		result = new Bitmap(inForm.ClientRectangle.Width, inForm.ClientRectangle.Height, g1);
		Graphics g2 = Graphics.FromImage(result);
		dynamic dc1 = g1.GetHdc();
		dynamic dc2 = g2.GetHdc();
		BitBlt(dc2, 0, 0, inForm.ClientRectangle.Width, inForm.ClientRectangle.Height, dc1, 0, 0, 13369376);
		// SCRCOPY = 0x00CC0020
		g1.ReleaseHdc(dc1);
		g2.ReleaseHdc(dc2);
	} catch (Exception ex) {
		result = null;
	}

	return result;
}

MfG
wax