10-12-13, 09:48 AM
السلام عليكم ورحمة الله وبركاته
أخي الكريم
ترتيب الكود عندك - وإن كان يعمل جيدا - ولكنه برمجيا خاطئ...
وذلك لأنك وضعت كود تغيير الألوان داخل حدث الرسم للأدوات، فكلما قمت بالضغط على القائمة سيقوم البرنامج بإطلاق حدث الرسم وبالتالي تغيير الألوان للأدوات مرة أخرى، والصحيح أنك تقوم بتغيير الألوان في حدث Form1_Load كما يلي:
وبالنسبة لطريقة الأخ الشاكي لله فهي طريقة جميلة أيضا وتوفر لك الكثير من الجهد فما عليك في هذه الحالة إلا إدراج الأدوات في وضع التصميم وبعد ذلك يقوم الكود بالتنسيق لجميع عناصر القائمة وليس فقط الفواصل، وإليك الكود المطلوب:
وكما تلاحظ فإن أول خطوة قمنا بها أننا أزلنا الكلمة Handles وما بعدها، بعد ذلك قمنا بعمل وظيفة تقوم بالمرور على جميع عناصر القائمة وتغير ألوانهم وبعد ذلك يفحص نوع العنصر فإذا كان Separator فإنه سيعرف حدث الرسم الخاص به باستخدام الكلمة AddHandler.
الآن جرب الكود الجديد وقم بتغيير الألوان في وضع التصميم وبعد ذلك قم بتنفيذ البرنامج، ستجد أن الألوان عادت كما كانت...
أخي الكريم
ترتيب الكود عندك - وإن كان يعمل جيدا - ولكنه برمجيا خاطئ...
وذلك لأنك وضعت كود تغيير الألوان داخل حدث الرسم للأدوات، فكلما قمت بالضغط على القائمة سيقوم البرنامج بإطلاق حدث الرسم وبالتالي تغيير الألوان للأدوات مرة أخرى، والصحيح أنك تقوم بتغيير الألوان في حدث Form1_Load كما يلي:
كود :
Private Sub AllSeparators(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles ToolStripMenuItem1.Paint, ToolStripMenuItem2.Paint, ToolStripMenuItem3.Paint, ToolStripMenuItem4.Paint
'معرفة الفاصل الذي يتم رسمه حاليا
Dim CurrentToolStripSeparator As ToolStripSeparator = DirectCast(sender, ToolStripSeparator)
'تعبئة الخلفية باللون المطلوب
e.Graphics.FillRectangle(New System.Drawing.SolidBrush(CurrentToolStripSeparator.BackColor), e.ClipRectangle)
'تحديد أبعاد الفاصل
Dim Y As Integer = CInt(e.ClipRectangle.Height / 2)
Dim X1 As Integer = IIf(CurrentToolStripSeparator.RightToLeft = Windows.Forms.RightToLeft.Yes, 0, 30)
Dim X2 As Integer = IIf(CurrentToolStripSeparator.RightToLeft = Windows.Forms.RightToLeft.Yes, e.ClipRectangle.Width - 30, e.ClipRectangle.Width)
'رسم الفاصل
e.Graphics.DrawLine(New Pen(CurrentToolStripSeparator.ForeColor), X1, Y, X2, Y)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ToolStripMenuItem1.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem1.ForeColor = Color.Black
ToolStripMenuItem2.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem2.ForeColor = Color.Black
ToolStripMenuItem3.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem3.ForeColor = Color.Black
ToolStripMenuItem4.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem4.ForeColor = Color.Black
End Subوبالنسبة لطريقة الأخ الشاكي لله فهي طريقة جميلة أيضا وتوفر لك الكثير من الجهد فما عليك في هذه الحالة إلا إدراج الأدوات في وضع التصميم وبعد ذلك يقوم الكود بالتنسيق لجميع عناصر القائمة وليس فقط الفواصل، وإليك الكود المطلوب:
كود :
Private Sub AllSeparators(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs)
'معرفة الفاصل الذي يتم رسمه حاليا
Dim CurrentToolStripSeparator As ToolStripSeparator = DirectCast(sender, ToolStripSeparator)
'تعبئة الخلفية باللون المطلوب
e.Graphics.FillRectangle(New System.Drawing.SolidBrush(CurrentToolStripSeparator.BackColor), e.ClipRectangle)
'تحديد أبعاد الفاصل
Dim Y As Integer = CInt(e.ClipRectangle.Height / 2)
Dim X1 As Integer = IIf(CurrentToolStripSeparator.RightToLeft = Windows.Forms.RightToLeft.Yes, 0, 30)
Dim X2 As Integer = IIf(CurrentToolStripSeparator.RightToLeft = Windows.Forms.RightToLeft.Yes, e.ClipRectangle.Width - 30, e.ClipRectangle.Width)
'رسم الفاصل
e.Graphics.DrawLine(New Pen(CurrentToolStripSeparator.ForeColor), X1, Y, X2, Y)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
SetColors(MenuStrip1.Items)
End Sub
Private Sub SetColors(ByVal Items As ToolStripItemCollection)
Try
For Each Item In Items
Item.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
Item.ForeColor = Color.Black
If TypeOf Item Is ToolStripSeparator Then
AddHandler DirectCast(Item, ToolStripSeparator).Paint, AddressOf AllSeparators
Else
If Item.HasDropDownItems Then
SetColors(Item.DropDownItems)
End If
End If
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Subوكما تلاحظ فإن أول خطوة قمنا بها أننا أزلنا الكلمة Handles وما بعدها، بعد ذلك قمنا بعمل وظيفة تقوم بالمرور على جميع عناصر القائمة وتغير ألوانهم وبعد ذلك يفحص نوع العنصر فإذا كان Separator فإنه سيعرف حدث الرسم الخاص به باستخدام الكلمة AddHandler.
الآن جرب الكود الجديد وقم بتغيير الألوان في وضع التصميم وبعد ذلك قم بتنفيذ البرنامج، ستجد أن الألوان عادت كما كانت...

