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
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!
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.
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
Hallo jürgenB,
noch ein Hinweis: nimm statt this.CreateGraphics() besser e.Graphics.
herbivore