Hallo zusammen,
ich komme bei einer Sache nicht weiter. Ich habe folgenden Fall.
Ich habe ein Hintergrundbild. Über dieses Hintergrundbild will ich beliebig viele transparente Bilder, die unterschiedlich sind, zur Laufzeit hinzufügen können. Die transparenten Bilder sollen sich mit der Maus vergrößern und bewegen lassen. Das Ganze auch so, dass es nicht flackert beim Bewegen.
Ich habe das Ganze soweit auch schon umgesetzt, nur habe ich das Problem, wenn ich ein transparentes Bild anklicke, dass sich alle anderen transparenten Bilder dem angeklickten Bild anpassen. Das ist natürlich nicht gewollt.
Das ist mein bisheriger Code:
Bei Klick auf einen Button füge ich ein neues Bild ein
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
nPanel = New NonFlickerPanel
Dim fstream As FileStream
xPan += 1
nPanel.Parent = PictureBox
nPanel.Name = "pan_" & xPan
nPanel.BackgroundImageLayout = ImageLayout.Zoom
SelectedControl = nPanel
MyControls.Add(nPanel)
fstream = New FileStream("Pfad zu meinem Bild", IO.FileMode.Open, _
IO.FileAccess.Read)
nPanel.BackgroundImage = Image.FromStream(fstream)
Application.DoEvents()
fstream.Close()
fstream.Dispose()
nPanel.Width = nPanel.BackgroundImage.Width * _scale
nPanel.Height = nPanel.BackgroundImage.Height * _scale
nPanel.BringToFront()
AddHandler nPanel.MouseDown, AddressOf control_MouseDown
AddHandler nPanel.MouseEnter, AddressOf control_MouseEnter
AddHandler nPanel.MouseLeave, AddressOf control_MouseLeave
AddHandler nPanel.MouseMove, AddressOf control_MouseMove
AddHandler nPanel.MouseUp, AddressOf control_MouseUp
AddHandler nPanel.Click, AddressOf control_Click
AddHandler nPanel.Paint, AddressOf control_Paint
pubControl = nPanel
End Sub Ich habe eine extra Klasse, um ein transparentes Panel zu erzeugen:
Partial Public Class NonFlickerPanel
Inherits Panel
Public Sub New()
DoubleBuffered = True
Me.SetStyle(ControlStyles.Opaque, True)
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, True)
MyBase.BackColor = System.Drawing.Color.Transparent
End Sub
Protected Overrides ReadOnly Property CreateParams() As _
System.Windows.Forms.CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H20 ' Turn on WS_EX_TRANSPARENT
Return cp
End Get
End Property
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
Dim ctrl As Control = Form1.SelectedControl
MyBase.OnPaint(e)
If MyBase.BackgroundImage IsNot Nothing Then
e.Graphics.DrawImage(ctrl.BackgroundImage, 0, 0, ctrl.Width, _
ctrl.Height)
End If
End Sub
End Class Beim MouseMove Event aktualisiere ich die Bilder
Private Sub control_MouseMove(ByVal sender As Object, ByVal e As _
MouseEventArgs)
If e.Button = MouseButtons.Left Then
Dim control As Control = CType(sender, Control)
Dim nextPosition As System.Drawing.Point = New System.Drawing.Point( _
)
nextPosition = control.Parent.PointToClient(MousePosition)
nextPosition.Offset(mouseX, mouseY)
Dim test As String = control.Name
control.Location = nextPosition
control.Invalidate()
control.Cursor = Cursors.Default
PictureBox.Invalidate()
End If
End Sub Und hier das Paint Event um die Bilder zu zeichnen.
Private Sub control_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs)
Dim ctrl As Control = SelectedControl
Dim bmp As Bitmap = New Bitmap(ctrl.BackgroundImage)
e.Graphics.DrawImage(bmp, 0, 0, ctrl.Width, ctrl.Height)
End Sub Beim Paint Event scheint es immer alle Panel zu aktualisieren. Wie kann ich das verhindern???
Gruß
Dominik |