Laden...

Transparenz und OnPaint Problem in Form

Erstellt von Simon Heinzmann vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.504 Views
Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren
Transparenz und OnPaint Problem in Form

Guten Morgen,

Folgendes Szenario siehe Anhang:

  • Form mit Sternen BackgroundImage
  • Panel in der Mitte das das Signal der Webcam ausgibt
  • Eine grosse PictureBox unten mit PNG Bild
  • Drei kleine PictureBoxen oben jeweils rechts und links neben dem Panel und genau darüber

Ziel:
Über das Panel soll ein Rahmen kommen

Variante Balken Unten:
Unten hab ich einfach eine Picturebox über das Panel gelegt, aber nach kurzer Recherche hab ich erfahren das es keine echte Transparenz gibt und deshalb der Background von der Form angezeigt wird und nicht das Panel

Variante mehrere Balken Oben:
Den Balken direkt auf das Panel zulegen bringt nichts weil das Panel von der Webcam immer übermalt wird. Deshalb hab ich in das OnPaintEvent der Form folgendes eingebaut:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
// using AxSHDocVw;

namespace InnovationsCockpitPrototyp
{
    public partial class FormDispalyFrontPassenger : Form
    {
       protected override void OnPaint(PaintEventArgs e)
        {
            Assembly myAssembly = Assembly.GetExecutingAssembly();
            Stream myStream = myAssembly.GetManifestResourceStream("InnovationsCockpitPrototyp.Resources.Passenger_mitte.png");
            Bitmap bmp = new Bitmap(myStream);
            Graphics g = e.Graphics;
            g.DrawImage(bmp, 380, 0);
            base.OnPaint(e);
        }
    }
}

Any Ideas???

Gruss
Simon

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

wie gesagt ist es blöd mit GDI+ und Transparenz zu arbeiten. Der einzigst mir bekannte funktionierende Weg wäre es den Inhalt des Panels zu bereichnen und entsprechend in schwächeren Farbtönen wieder zugeben um eine "vorgegaukelte" transparenz zu enthalten. Für wirkliche Transparenz kannst du z.b. WPF benutzen weil das auch auf DirectX zurückgreift.

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hi,

ich kann direkt auf der Form zeichnen (das Weisse Dreieck siehe Anhang) und die Transparente Picturebox darüber legen. Das funktioniert wunderbar. Meine Idee war das bei jeder Änderung des Panels (OnPaint Event) ich einfach das transparente Bild darüber male.....

Gruss
Simon

49.485 Beiträge seit 2005
vor 15 Jahren

HalloSimon Heinzmann

da "wer zuletzt malt, malt am besten" gilt, solltest du base.OnPaint(e); immer als erstes aufrufen. Ob das dein Problem löst, steht auf einem anderen Blatt.

herbivore

Simon Heinzmann Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hi,

@herbivore: bringt leider nichts
@all: Noch andere Ideen???

Gruss
Simon

R
119 Beiträge seit 2008
vor 15 Jahren

wie herbivore schon angedeutet hat "wer zuletzt malt..."

das problem ist, dass die Windows.Forms pe definition keine Transparenz beherschen. Diese Pseudotransparenz funktioniert nur mit elementen hörer ebene (parent) dort wird das gezeichnete bild zurechgeschnitten usw

Die Transparenz kann nur von einer höheren Hirarchieebene "durchgereicht" werden.
Elemente in der gleichen ebene (iin der gleichen Controls-collection zb) können sich nicht gegenseitig beeinflussen (transparenztechnisch...)

wenn du also diesen effekt willst musst du deine Elemente so ineinader verschachteln, dass das Element welches topmost ist, das unterste Child ist...

brauchst du 2 objekte die sich gegenseitig beeinflussen, muss du das zeichnen selber übernehmen. Also dir das image der objekte als Graphic holen und "zeichen" aber das geht performanter mit DirectX

K
593 Beiträge seit 2007
vor 15 Jahren

Wie ich schon gesagt habe um das wirklich tauglich zu lösen muss man DirectX OpenGl benutzen. Am einfachsten geht das ganze in .Net mit WPF ^^ Oder es gibt auch glaube ich OpenGL Controls die dort innerhalb OpenGL rendern damit würde es wohl auch gehen.