Irgendwie hängt hier was(Grafik)
- From: "Karsten Sosna" <k.sosna-NO-SPAM-@xxxxxxxxxxx>
- Date: Sat, 29 Jul 2006 06:17:46 +0200
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
.
- Follow-Ups:
- Re: Irgendwie hängt hier was(Grafik)
- From: Harald M. Genauck
- Re: Irgendwie hängt hier was(Grafik)
- From: Elmar Boye
- Re: Irgendwie hängt hier was(Grafik)
- Prev by Date: Re: Aktion verzögern ...
- Next by Date: Re: Aktion verzögern ...
- Previous by thread: " und ' vom Stringende wegnehmen
- Next by thread: Re: Irgendwie hängt hier was(Grafik)
- Index(es):
Relevant Pages
|
|