Laden...

Überlappende Controls & Transparenz

Erstellt von jürgenB vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.852 Views
j
jürgenB Themenstarter:in
6 Beiträge seit 2005
vor 17 Jahren
Überlappende Controls & Transparenz

Hallo Forum,

ich möchte auf einem Basispanel (soz. Zeichenfläche) zur laufzeit mehrere transparente ChildPanels mit BackgroundImage (*.png mit transparenz) einfügen. Diese Childpanels sollen mit der Maus verschiebbar sein:

   class Ball : Panel
    {
        public Ball(Image BallImage)
        {
            int ballSize = 40;
            Image img = BallImage.GetThumbnailImage(ballSize, ballSize, null, IntPtr.Zero);
            this.BackColor = Color.Transparent;
            this.BackgroundImage = img;
            this.BackgroundImageLayout = ImageLayout.None;
            this.Size = new Size(ballSize, ballSize);
            this.Visible = true;

            this.MouseDown += new MouseEventHandler(Ball_MouseDown);
            this.MouseMove += new MouseEventHandler(Ball_MouseMove);
            this.MouseUp += new MouseEventHandler(Ball_MouseUp);
        }
     }

Wenn sich die Panels aber überlappen dann siehts aus wie im Dateianhang.
Ich habs auch schon mit PictureBoxen statt Panels versucht, bringt aber den selben Effekt.

Dank und Grüsse von
jürgenB

EDIT(Talla): Bitte Code Tags verwenden

830 Beiträge seit 2005
vor 17 Jahren

Hallo jürgenB,

echte Transparenz ist nicht so ohne weiteres möglich. Du musst dir ein eigenes Control schreiben, bzw. bestimmte Methoden eines Controls überschreiben. Wie das geht siehst du hier.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

j
jürgenB Themenstarter:in
6 Beiträge seit 2005
vor 17 Jahren

Mahlzeit Friedel,

danke für die schnelle Antwort!

Ich hab mir gestern schon Deinen Forumsbeitrag angeschaut und bin nicht so richtig schlau daraus geworden. Im Prinzip ist das doch das selbe wie mein Code. Wenn ich noch die Overrides CreateParams und OnPaint hinzufüge gibt es keinen unterschied. OnPaintBackground blockiert mir mein BackgroundImage.

Mache ich aus meiner

Class Ball : Panel

eine

public abstract Class Ball : Panel

und aus dem

public Ball(Image BallImage)

ein

protected Ball(Image BallImage)

gibt es ein Problem mit der aufrufenden Funktion:

    void Playground_DragDrop(object sender, DragEventArgs e)  
    {  
        Image BallImage = (Bitmap)e.Data.GetData(DataFormats.Bitmap);  
        Ball ball = new Ball(BallImage);  
        this.Controls.Add(ball);  
    }  

Ich kann dann keine Instanz von dieser Klasse ableiten:

Cannot create an instance of the abstract class or interface 'PoolTable.Ball'

Sorry for the bad news!

830 Beiträge seit 2005
vor 17 Jahren

Hallo jürgeB,

die Fehlermeldung versteht sich, denke ich, von alleine. Eine abstrakte Klasse kann nicht initialisiert werden, das ist ja der Sinn der Sache 🙂.
Dass das Panel dir das BackgroundImage blockiert, ist klar.
Normalerweise würde die Methode das Image, aber eben auch den Hintergrund des Controls (Panel) zeichen. Das willst du aber nicht, da sonst nicht mehr durchsichtig. Du musst dein Bild in der Methode OnPaintBackground selber zeichnen. Dazu gibt es Methoden in der Graphics-Klasse (pevent).

Falls das nicht funzt, könnest du es so probieren:
Du lässt TransPanel (s.h. meinen verlinkten Beitrag) nicht von Panel erben, sondern von PictureBox. Dann erstellst du eine Instanz von tPanel (solltest vernünftige Namen verwenden, nicht wie ich 🙂) und setzt die geerbte Eigenschaft Image auf dein Bild.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

j
jürgenB Themenstarter:in
6 Beiträge seit 2005
vor 17 Jahren
Ich habs !!!

Hallo Friedel, hallo Forum (FREU!!!)

ich habs!
Danke Friedel für Deinen Codeschnipsel in TransPanel - hat mich auf den richtigen Weg gebracht. Ich hab mir ein neues Control von UserControl abgeleitet.

Hier der Code für alle die ein ähnliches Problem haben oder eine Anregung brauchen:

Schnipp-->


    class Ball : UserControl
    {
        private Image image;

        public Ball(Image BallImage)
        {
            image = BallImage;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics graphics = this.CreateGraphics();
            
            this.Size = new Size(40, 40);
            graphics.DrawImage(this.image, 0, 0);

            SetStyle(ControlStyles.Opaque, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.FromArgb(0, 0, 0, 0);

            graphics.Dispose();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020;
                return cp;
            }
        } 
    }

<--Schnipp

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo jürgenB,

noch ein Hinweis: nimm statt this.CreateGraphics() besser e.Graphics.

herbivore