Re: Control.Region setzen
- From: Peter Götz <gssg_nospam@xxxxxxxxxxx>
- Date: Fri, 3 Mar 2006 17:00:34 +0100
Hallo Karsten,
ich habe mal den Code Deines UserControls etwas verändert (s. '
#################), was dann schon zeigt, wo die Zeit beim Laden der Form
mit vielen UCs bleibt.
' \\\ Code UserControl
' ########################
Private mLoading As Boolean = True
' ########################
Private _Angle As Single = 130
Private _Controlsize As New Size(120, 28)
Private _TranslateTransform As PointF
Private Sub UserControl1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Console.WriteLine("Call SetRegion")
Call SetRegion()
' ##############
' ##############
mLoading = False
' ##############
' ##############
End Sub
Private Sub UserControl1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
e.Graphics.TranslateTransform(_TranslateTransform.X,
_TranslateTransform.Y)
e.Graphics.RotateTransform(_Angle)
Dim BM As New Bitmap(_Controlsize.Width + 4, _Controlsize.Height +
4)
Call DrawControl(BM)
e.Graphics.DrawImage(BM, 0, 0)
BM.Dispose()
End Sub
Private Sub DrawControl(ByRef BM As Bitmap)
Dim G_BM As Graphics = Graphics.FromImage(BM)
G_BM.FillRectangle(Brushes.Black, 2, 2, _Controlsize.Width,
_Controlsize.Height)
G_BM.Dispose()
End Sub
Private Sub SetRegion()
Dim BM As New Bitmap(_Controlsize.Width + 4, _Controlsize.Height +
4)
Dim G_BM As Graphics = Graphics.FromImage(BM)
G_BM.FillRectangle(Brushes.Black, 2, 2, _Controlsize.Width,
_Controlsize.Height)
Dim GP As New Drawing2D.GraphicsPath
GP.AddRectangle(New Rectangle(0, 0, _Controlsize.Width + 4,
ControlSize.Height + 4))
Dim M As New Drawing2D.Matrix
M.Rotate(_Angle)
GP.Transform(M)
Dim BM_Dest As New Bitmap(CInt(Math.Ceiling(GP.GetBounds.Width)),
CInt(Math.Ceiling(GP.GetBounds.Height)))
Dim G_BM_Dest As Graphics = Graphics.FromImage(BM_Dest)
G_BM_Dest.TranslateTransform(-CSng(Math.Ceiling(GP.GetBounds.X)), -CSng(Math
..Ceiling(GP.GetBounds.Y)))
G_BM_Dest.RotateTransform(_Angle)
G_BM_Dest.DrawImage(BM, 0, 0)
Dim GP_REG As New Drawing2D.GraphicsPath
GetRegionPath(GP_REG, BM_Dest)
_TranslateTransform.X = -CSng(Math.Ceiling(GP.GetBounds.X)) -
GP_REG.GetBounds.X()
_TranslateTransform.Y = -CSng(Math.Ceiling(GP.GetBounds.Y)) -
GP_REG.GetBounds.Y()
M = New Drawing2D.Matrix
M.Translate(-GP_REG.GetBounds.X, -GP_REG.GetBounds.Y)
GP_REG.Transform(M)
Me.Region = New Drawing.Region(GP_REG)
BM.Dispose()
G_BM.Dispose()
BM_Dest.Dispose()
G_BM_Dest.Dispose()
GP.Dispose()
GP_REG.Dispose()
M.Dispose()
End Sub
Private Sub GetRegionPath(ByRef GP As Drawing2D.GraphicsPath, ByVal BM
As Bitmap)
Dim BMD As New Drawing.Imaging.BitmapData
BMD = BM.LockBits(New Rectangle(0, 0, BM.Width, BM.Height),
Imaging.ImageLockMode.ReadOnly, BM.PixelFormat)
Dim ptr As IntPtr = BMD.Scan0
Dim rgbValues(BM.Width * BM.Height * 4 - 1) As Byte
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0,
BM.Width * BM.Height * 4)
BM.UnlockBits(BMD)
For Y As Integer = 0 To BM.Height - 1
For X As Integer = 3 To BM.Width * 4 Step 4
If rgbValues(Y * BM.Width * 4 + X) <> 0 Then
GP.AddRectangle(New Rectangle(X \ 4, Y, 1, 1))
End If
Next
Next
End Sub
Public Property Angle() As Single
Get
Console.WriteLine(Me.Name & ": Get Angle")
Return _Angle
End Get
Set(ByVal value As Single)
_Angle = value
' ##################
' ##################
If Not mLoading Then
Console.WriteLine(Me.Name & ": Set Angle")
SetRegion()
Me.Invalidate()
End If
' ##################
' ##################
End Set
End Property
Public Property ControlSize() As Size
Get
Console.WriteLine(Me.Name & ": Get ControlSize")
Return _Controlsize
End Get
Set(ByVal value As Size)
_Controlsize = value
' ##################
' ##################
If Not mLoading Then
Console.WriteLine(Me.Name & ": Set ControlSize")
SetRegion()
Me.Invalidate()
End If
' ##################
' ##################
End Set
End Property
' \\\ E N T E
Wenn Du mal die beiden
If Not mLoading then
End If
in den Property-Prozeduren ControlSize und Angle auskommentierst, sodass
SetRegion()
Me.Invalidate()
ungebremst immer ausgeführt werden, dann wird schon sehr deutlich, wo die
Zeit beim Laden bleibt.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)
.
- Follow-Ups:
- Re: Control.Region setzen
- From: Karsten Sosna
- Re: Control.Region setzen
- References:
- Control.Region setzen
- From: Karsten Sosna
- Re: Control.Region setzen
- From: Peter Götz
- Re: Control.Region setzen
- From: Karsten Sosna
- Control.Region setzen
- Prev by Date: DataGridview CellStyle wieder auf Default setzen [VB2005]
- Next by Date: Re: Tooltip Frage
- Previous by thread: Re: Control.Region setzen
- Next by thread: Re: Control.Region setzen
- Index(es):
Relevant Pages
|