Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Controls zeichnen durch halbtransparentes Panel "durch" (je nach Double-Buffering-Einstellung)
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

Themenstarter:

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

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 436
Herkunft: Hamburg

beantworten | zitieren | melden

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

http://www.codeproject.com/KB/cpp/AlphaGradientPanel.aspx
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (20.04.2011 - 08:53:31):

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
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

Themenstarter:

DoubleBuffered, Halbtransparentes Panel auf einer Form

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
jreusch
myCSharp.de - Member

Avatar #avatar-3346.jpg


Dabei seit:
Beiträge: 303

beantworten | zitieren | melden

Ich weiß nicht inwieweit das noch mit dem DoubleBuffer-Mechanismus von Controls zusammenhängt, aber:
Zitat von markus111
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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

beantworten | zitieren | melden

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:
Attachments
private Nachricht | Beiträge des Benutzers
Wax
myCSharp.de - Member

Avatar #avatar-2276.jpg


Dabei seit:
Beiträge: 745
Herkunft: Dortmund

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
JunkyXL
myCSharp.de - Experte

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1732
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

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);
    }
}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JunkyXL am .
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Wax
myCSharp.de - Member

Avatar #avatar-2276.jpg


Dabei seit:
Beiträge: 745
Herkunft: Dortmund

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers