البرتامج ضخم و و محتاج مراجعة كاملة للكود
عموما ...... في الفورم Main حاول تغير الاسم الي MainForm
وفي نفس الفورم
عليك مثلا أن لا تقوم بتحمبل الصور من الريسورس في الخدث load
لكن الأفضل أن يكون لديك شئ مثل هذا الكود
PHP كود :
Private ReadOnly Property Images As IEnumerable(Of Bitmap)
Get
Dim result As IEnumerable(Of Bitmap) = Nothing
If result Is Nothing Then
Dim images As List(Of Bitmap) = New List(Of Bitmap)()
images.Add(My.Resources.minimize_white_32) '0
images.Add(My.Resources.server_connection_blue_64) ' 1
result = images.ToList
End If
Return result
End Get
End Property
ايضا عليك تغيير الروتين SetPicture ليكون كالتالي
PHP كود :
Private Sub SetPicture(ByVal imgSrc As Bitmap, ByRef target As PictureBox)
Using imgDest As Bitmap = New Bitmap(target.ClientSize.Width, target.ClientSize.Height)
Dim source_aspect, dest_aspect, k_aspect, K As Double
source_aspect = imgSrc.Width / imgSrc.Height
dest_aspect = imgDest.Width / imgSrc.Height
k_aspect = dest_aspect / source_aspect
If (k_aspect > 1) Then
K = imgSrc.Height / imgDest.Height
Else
K = imgSrc.Width / imgDest.Width
End If
Dim x_new, y_new, w_new, h_new As Integer
w_new = CInt(imgSrc.Width / K)
h_new = CInt(imgSrc.Height / K)
x_new = CInt(imgDest.Width / 2 - w_new / 2)
y_new = CInt(imgDest.Height / 2 - h_new / 2)
Using g As Graphics = Graphics.FromImage(imgDest)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(imgSrc, New Rectangle(x_new, y_new, w_new, h_new))
End Using
target.Image = imgDest
End Using
End Sub
يوجد Flicker أو اهنزاز
يحدث عند تحريك الفورم ونفس الشئ يحدث عند تحريك أي فورم أخر
اضبط الخاصية BackgroundBuffer لكل فورم و اجعلها True
بشكل عام انت تستخدم صور كثيرة كخلفية و يمكنك أن توفر وقتا ضخما و تقلل من الكود الخاص بكل Panel بحيث انه يتم تصميمها لوحدها باستخدام الوراثة
اخر شئ انا شغلت الفروم فترة 10 دقايق و لم يحدث شئ
لكنك لا تضمن ما يمكن أن حدث معك أثناء التشغيل عند العميل
خاصة انك تستخدم مكتبات مختلفة مثل مترو و خلافه
وأنا لا أضمن لك كفاءة هذه المكتبات تماما
حاول تقلل من حجم الفونت و تقلل من تحميل اشياء كثيرة عند بداية التشغيل
دي ملاحظاتي
لكن المشروع محتاج إعادة نظر خصوصا قيما يخص الجرافكس
الكلاس التالي هدية لك و يمكنك ان تستخدمه مع الريسورس بدون أن يحدث مشاكل في عملية Dispose
PHP كود :
Imports System.Runtime.InteropServices
Public Class ImageBuffer
Implements IDisposable
Private _handle As IntPtr
Private _source As Bitmap
Private _valid As Integer
Public Sub New(source As Bitmap)
Me._source = source
Me._valid = If(Not source Is Nothing, 1, 0)
Me.Assign()
End Sub
Public ReadOnly Property Valid() As Boolean
Get
Return (Me._handle <> IntPtr.Zero) AndAlso (Not _valid)
End Get
End Property
Public ReadOnly Property Handle As IntPtr
Get
Return Me._handle
End Get
End Property
Public Sub Dispose()
Me.Release()
If Me._source IsNot Nothing Then
Me._source.Dispose()
Me._source = Nothing
End If
End Sub
Private Sub Assign()
If Me._valid Then
Me.Assign(Me._source)
End If
End Sub
Private Sub Assign(source As Bitmap)
If source IsNot Nothing Then
Me.Release()
Me._handle = source.GetHbitmap
End If
End Sub
Private Sub IDisposable_Dispose() Implements IDisposable.Dispose
Me.Dispose()
End Sub
Private Sub Release()
If Not _handle.Equals(IntPtr.Zero) Then
Me._handle = New IntPtr(0)
Marshal.FreeHGlobal(Me._handle)
End If
End Sub
End Class
الكود التالي يوضح كيفية استخدام الكلاس مع ملف صور موجود في الريسورس
أو مع صورة من ملف
PHP كود :
Using buffer As ImageBuffer = New ImageBuffer(CType(My.Resources.dest, Bitmap))
If buffer.Valid Then
PictureBox1.Image = Image.FromHbitmap(buffer.Handle)
End If
End Using
PHP كود :
Using buffer As ImageBuffer = New ImageBuffer(New Bitmap(".\dest.jpg"))
If buffer.Valid Then
PictureBox1.Image = Image.FromHbitmap(buffer.Handle)
End If
End Using