Irgendwie hängt hier was(Grafik)



Hallo NG,
ich habe ein UserControl, dass ich dreimal instanziere.
\\\
Public Class UC_XYZ
Public Enum DrawAxes
XY
ZY
XZ
End Enum

Public Event X_Changed(ByVal sender As Object, ByVal value As Single)
Public Event Y_Changed(ByVal sender As Object, ByVal value As Single)
Public Event Z_Changed(ByVal sender As Object, ByVal value As Single)

Private context As BufferedGraphicsContext
Private grafx As BufferedGraphics

Private myDrawAxis As DrawAxes = DrawAxes.XY
Public Property DrawAxis() As DrawAxes
Get
Return myDrawAxis
End Get
Set(ByVal value As DrawAxes)
myDrawAxis = value
End Set
End Property

Private myX As Single
Public Property X() As Single
Get
Return myX
End Get
Set(ByVal value As Single)
myX = value
DrawToBuffer()
End Set
End Property

Private myY As Single
Public Property Y() As Single
Get
Return myY
End Get
Set(ByVal value As Single)
myY = value
DrawToBuffer()
End Set
End Property

Private myZ As Single
Public Property Z() As Single
Get
Return myZ
End Get
Set(ByVal value As Single)
myZ = value
DrawToBuffer()
End Set
End Property

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
DrawToBuffer()
End Sub

Private Sub UC_XYZ_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
Me.SetStyle(ControlStyles.UserPaint, True)
Me.DoubleBuffered = False
context = BufferedGraphicsManager.Current
context.MaximumBuffer = New Size(Me.Width + 1, Me.Height + 1)
grafx = context.Allocate(Me.CreateGraphics(), New Rectangle(0, 0,
Me.Width, Me.Height))
End Sub

Private Sub FRM_XYZ_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Select Case myDrawAxis
Case DrawAxes.XY
If myX <> e.X Then
RaiseEvent X_Changed(Me, e.X)
myX = e.X
End If
If myY <> e.Y Then
RaiseEvent Y_Changed(Me, e.Y)
myY = e.Y
End If
Case DrawAxes.XZ
If myX <> e.X Then
RaiseEvent X_Changed(Me, e.X)
myX = e.X
End If
If myZ <> e.Y Then
RaiseEvent Z_Changed(Me, e.Y)
myZ = e.Y
End If
Case DrawAxes.ZY
If myZ <> e.X Then
RaiseEvent Z_Changed(Me, e.X)
myZ = e.X
End If
If myY <> e.Y Then
RaiseEvent Y_Changed(Me, e.Y)
myY = e.Y
End If
End Select
DrawToBuffer()
End Sub

Private Sub DrawToBuffer()
grafx.Graphics.Clear(Me.BackColor)
Select Case myDrawAxis
Case DrawAxes.XY
grafx.Graphics.DrawLine(Pens.Blue, myX, 0, myX,
Me.ClientSize.Height)
grafx.Graphics.DrawLine(Pens.Blue, 0, myY,
Me.ClientSize.Width, myY)
Case DrawAxes.XZ
grafx.Graphics.DrawLine(Pens.Blue, myX, 0, myX,
Me.ClientSize.Height)
grafx.Graphics.DrawLine(Pens.Blue, 0, myZ,
Me.ClientSize.Width, myZ)
Case DrawAxes.ZY
grafx.Graphics.DrawLine(Pens.Blue, myZ, 0, myZ,
Me.ClientSize.Height)
grafx.Graphics.DrawLine(Pens.Blue, 0, myY,
Me.ClientSize.Width, myY)
End Select
grafx.Render()
End Sub

Private Sub UC_XYZ_Resize(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Resize
If context IsNot Nothing Then
context.MaximumBuffer = New Size(Me.Width + 1, Me.Height + 1)
grafx = context.Allocate(Me.CreateGraphics(), New Rectangle(0,
0, Me.Width, Me.Height))
DrawToBuffer()
End If
End Sub
End Class
///

Das Formular sieht dann so aus:
\\\
Public Class FRM_Main

Private WithEvents UC_XY As New UC_XYZ
Private WithEvents UC_ZY As New UC_XYZ
Private WithEvents UC_XZ As New UC_XYZ

Private Sub FRM_Main_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Me.Controls.Add(UC_XY)
Me.Controls.Add(UC_ZY)
Me.Controls.Add(UC_XZ)
ArangeWindows()
End Sub

Private Sub ArangeWindows()
With UC_XY
.Location = New Point(0, 0)
.Width = Me.ClientSize.Width \ 2
.Height = (Me.ClientSize.Height) \ 2
.DrawAxis = UC_XYZ.DrawAxes.XY
End With
With UC_ZY
.Location = New Point(UC_XY.Width, 0)
.Width = Me.ClientSize.Width - UC_XY.Width
.Height = UC_XY.Height
.DrawAxis = UC_XYZ.DrawAxes.ZY
End With
With UC_XZ
.Location = New Point(0, UC_XY.Height)
.Width = UC_XY.Width
.Height = Me.ClientSize.Height - UC_XY.Height
.DrawAxis = UC_XYZ.DrawAxes.XZ
End With
End Sub

Private Sub UC_XY_X_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_XY.X_Changed
UC_XZ.X = value
End Sub

Private Sub UC_XY_Y_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_XY.Y_Changed
UC_ZY.Y = value
End Sub

Private Sub UC_XZ_X_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_XZ.X_Changed
UC_XY.X = value
End Sub

Private Sub UC_XZ_Z_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_XZ.Z_Changed
UC_ZY.Z = value
End Sub

Private Sub UC_ZY_Y_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_ZY.Y_Changed
UC_XY.Y = value
End Sub

Private Sub UC_ZY_Z_Changed(ByVal sender As Object, ByVal value As
Single) Handles UC_ZY.Z_Changed
UC_XZ.Z = value
End Sub

Private Sub FRM_Main_Resize(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Resize
ArangeWindows()
End Sub
End Class
///

Das Ganze funktioniert auch. Die Controls feuern die Events, wenn sich die
Maus über diesen bewegt und die die Controls werden auch neugezeichnet. Aber
das geschieht mit einer so schlechten Geschwindigkeit, das es fast keinen
Spaß mehr macht. Ich habe schon überprüft ob die Events "überflüssig"
gefeuert werden, dass ist aber nicht der Fall. Irgendwie muß es aber mit den
Events zusammenhängen, ich habe eine eine andere Anwendung(in der benutzte
ich allerdings keinen DoubleBuffer), die fast das Gleiche macht. In dieser
steuere ich das Ganze mittels des MouseMove-Event auf dem Hauptformular und
die Controls sind dort MDI-Childreen. Da funktioniert es ohne Probleme und
dort wird noch etwas mehr gezeichnet.

Vielleicht habe ich mir ja irgendwo einen "Bock" eingebaut, denn ich einfach
nicht sehe. Vielleicht könnte mal jemand einen Blick auf die ganze Sache
werfen(oder ggf. den Code mal ausprobieren, einfach kopieren)

Vielen Dank im Voraus.
--
Gruß Scotty


.



Relevant Pages

  • Re: BindingSource.EndEdit - Not updating underlying data source
    ... Const SaveButtonText As String = "Save Zone" ... Catch ex As Exception ... Private Sub frmZones_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing ...
    (microsoft.public.dotnet.framework.adonet)
  • Re: DataGridView--after sorting
    ... Dim pkValue As Object ... Private Sub DataGridView1_MouseClick(ByVal sender As Object, ...
    (microsoft.public.dotnet.framework.windowsforms)
  • Re: DataView.Sort Dilemma - A bit long
    ... I have a form with a number of TextBoxes bound to a DataSet and an find ... I have got around this problem by binding the Textboxes to a DataView then ... Private Sub btAdd_Click(ByVal sender As System.Object, ...
    (microsoft.public.dotnet.framework.adonet)
  • Re: remoting client form, reference to object
    ... remoting is configured before anything else happens. ... > Private Sub Button1_Click(ByVal sender As System.Object, ... > private void ButtonCall_Click ...
    (microsoft.public.dotnet.framework.remoting)
  • Re: Event ID 7518
    ... ich erhalte in der Ereignissanzeige immer folgenden Fehler Event ID ... To learn more about the options in the Sender ID ... Filtering dialog box, click the Help button in the Sender ID ... Die Regel ...
    (microsoft.public.de.exchange)