Laden...

Paint Problem

Erstellt von bhelbig vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.390 Views
B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren
Paint Problem

Hi,

mit folgendem Code erreiche ich eine Transparenz in meinem Form:


        private void _frmProjectSelection_Paint(object sender, PaintEventArgs e)
        {
            Rectangle rect = this.RectangleToScreen(this.ClientRectangle);
            e.Graphics.CopyFromScreen(
              new Point(rect.Location.X + e.ClipRectangle.Location.X, rect.Location.Y + e.ClipRectangle.Location.Y),
              e.ClipRectangle.Location, this.ClientRectangle.Size);
        }

Das Problem ist, dass sobald ich das Form verschiebe die Transparenz verschwindet. Ich habe in dem Location changed und move Ereignis des Forms ein Invalidate() reingemacht. Wirklich gebracht hat es nix.
Selbst wenn ich das Form nicht verschiebe und ein anderes Fenster in den Hintergrund schiebe ändert sich nix. Ich mein der zweiter Punkt ist soweit ja klar
schließlich müsste ja meine Anwendung auf die Desktopänderung reagieren, aber der erste Punkt leuchtet mir nicht ein. Wenn ich die Form verschiebe dann zeichnet er doch neu und ruft somit den Paint Eventhandler auf. Also wird ja derselbe Code ausgeführt wie beim Start der Form und da funzt es ja.
Was noch dazu kommt ist folgendes. Ich habe auf dem Form ein Panel welches die Form füllt und dessen Background auf Transparent gestellt ist. Sobald aber ein Control dem Panel hinzugefügt wird erlischt die Transparenz.
Hier mal zwei Screenies:

Grüße

Ben

420 Beiträge seit 2007
vor 16 Jahren

Hallo bhelbig,

ich hatte mal das gleiche Problem, ich habe es mittels DIESEN Artikels gelöst.

Schau dir das mal an.

Gruß Dennis

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren

Hi dennisspohr,

danke für den Link. Das schaut sehr gut aus, aber damit bekomme ich die Transparenz ja nur ausserhalb hin. ich möchte ja aber, dass der Desktop durch meine Controls durchscheint.
Hast du das mit dem AlphaTransformer hinbekommen?

Grüße

Ben

420 Beiträge seit 2007
vor 16 Jahren

Hallo bhelbig,

ja das geht, du musst halt die Grafik dementsprechend mit Transparents erstellen. Somit habe ich bei meiner Anwendung zum Bsp. einen halbtransparenten Schatten erstellt. 😉

Gruß Dennis

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren

Naja, das habe ich ja. Der schwarze Schatten ist ein png mit Transparenz.
Dieses png mach ich als Hintergrund für den AlphaFormTransformer. Aber um die Controls zu platzieren muss ich ja den Maker noch setzen. Und wenn ich den auf die Form haue, dann ists vorbei mit der Transparenz.
Hast du vielleicht ein kleines BSP Projekt dass ich mir mal anschauen kann? Das BSP was beim CodeProjekt online ist hilft mir nicht viel, so wie dort habe ich es auch hinbekommen. Aber den durscheinenden Desktop inklusive Controls haut nicht hin bei mir.
Danke für deine Hilfe.

Grüße

Ben

420 Beiträge seit 2007
vor 16 Jahren

Hallo bhelbig,

stimmt, jetzt wo ich mich noch etwas mehr erinnere, hatte ich es schließlich mit DIESEM Artikel umgesetzt. Ein BSP kann ich dir leider nicht geben, weil das Programm für meine Firma war.

Ich hoffe ich konnte dir nun weiterhelfen.

Gruß Dennis

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren

Hi dennisspohr,

super. Du bist mein Held. Der Artikel ist genial. Genau das was ich gesucht habe.

Grüße

Ben

420 Beiträge seit 2007
vor 16 Jahren

Hallo bhelbig,

ich freue mich, dass ich dir weiterhelfen konnte 😉

Gruß Dennis

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren

Also hab jetzt mal alles getestet. Leider ist die Performance nicht wirklich gut.
Ich habe mein Problem mit CopyFromScreen auch rausgefunden warum es nicht klappt, dafür hat sich ein anderes aufgetan.
Wenn man CopyFromScreen ausführt und den Teil des Desktops haben möchte, der unter einem speziellen Form der eigenen Anwendung liegt, darf die Form natürlich zu dem Zeitpunkt wo man CopyFromScreen aufruft nicht sichtbar sein, bzw. muss vollständig transparent sein.
Ich löse dass jetzt mit folgendem Code, der erstmal zu Testzwecken in einem Timer steckt:


BackgroundImage = null;
            
rectFormScreen = RectangleToScreen(ClientRectangle);
imgDesk = new Bitmap(Width, Height);
gfxDesk = Graphics.FromImage(imgDesk);
gfxDesk.CopyFromScreen(rectFormScreen.X, rectFormScreen.Y, 0, 0, imgDesk.Size);

gfxDesk.DrawImage(Properties.Resources.RoundedFormWClose, 0, 0, Width, Height);
BackgroundImage = imgDesk;

Die BackgroundColor der Form:


        public _frmProjectSelection()
        {
            InitializeComponent();

            this.SetStyle(ControlStyles.DoubleBuffer |
                          ControlStyles.UserPaint |
                          ControlStyles.AllPaintingInWmPaint |
                          ControlStyles.SupportsTransparentBackColor |
                          ControlStyles.ResizeRedraw, true);

            BackColor = Color.Magenta;
            TransparencyKey = Color.Magenta;
        }

Das Prob ist, dass er beim ersten Tick des Timers zwar richtig zeichnet, aber beim zweiten Tick so scheint es mir zumindest das Backgroundimage nicht löscht, sondern schlicht darüber malt. Ich sehe aber nicht warum er dies tut.
Hier mal zwei Screenis.

[EDIT von herbivore]Bilder bitte als Dateianhang einfügen. Siehe [Hinweis] Wie poste ich richtig? Punkt 6.1[/EDIT]

Hoffe mir kann jemand auf die Sprünge helfen.

Grüße

Ben

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren

Sorry herbivore.

Bild 1:

B
bhelbig Themenstarter:in
135 Beiträge seit 2006
vor 16 Jahren