10-12-13, 12:46 AM (آخر تعديل لهذه المشاركة : 10-12-13, 12:52 AM {2} بواسطة kafi2030.)
الف شكر اخي
Sooriaty على اجابتك
بارك الله فيك
[/align]
تم تعديل الكود على النحو المذكور اعلاه
[align=left]
كود :
Private Sub AllSeparators(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles ToolStripMenuItem3.Paint, ToolStripMenuItem1.Paint, ToolStripMenuItem4.Paint, ToolStripMenuItem2.Paint
''معرفة الفاصل الذي يتم رسمه حاليا
Dim CurrentToolStripSeparator As ToolStripSeparator = DirectCast(sender, ToolStripSeparator)
'تحديد أبعاد الفاصل
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[/align]
والحمد لله نجح الامر
الف شكر
شكرا اخي
الشاكي لله على اجابتك
إقتباس :حسب ماقلت انك اضفت نوافذ منسدلة اخرى فلازم تضيف handle . اما بواسطة الطريقة الي فوق او بالكود التالي :-
إقتباس :AddHandler event, AddressOf eventhandler
بصراحة لم افهم كيفية تطبيق طريقتك
ممكن ان تعدل على المثال التالي المرفق
حتى تتضح الصورة اكثر، ونتعلم اكثر
إقتباس :Private Sub AllSeparators(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles ToolStripMenuItem3.Paint, ToolStripMenuItem2.Paint, ToolStripMenuItem1.Paint
لو انك حبيت تضيف Handle معاهم بالكود (اي وقت الrun time) قم بهذا :
أخي الكريم ترتيب الكود عندك - وإن كان يعمل جيدا - ولكنه برمجيا خاطئ... وذلك لأنك وضعت كود تغيير الألوان داخل حدث الرسم للأدوات، فكلما قمت بالضغط على القائمة سيقوم البرنامج بإطلاق حدث الرسم وبالتالي تغيير الألوان للأدوات مرة أخرى، والصحيح أنك تقوم بتغيير الألوان في حدث 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
وبالنسبة لطريقة الأخ الشاكي لله فهي طريقة جميلة أيضا وتوفر لك الكثير من الجهد فما عليك في هذه الحالة إلا إدراج الأدوات في وضع التصميم وبعد ذلك يقوم الكود بالتنسيق لجميع عناصر القائمة وليس فقط الفواصل، وإليك الكود المطلوب:
كود :
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.
الآن جرب الكود الجديد وقم بتغيير الألوان في وضع التصميم وبعد ذلك قم بتنفيذ البرنامج، ستجد أن الألوان عادت كما كانت...
ولكن لفت نظري بالنسبة للطريقة الثانية / طريقة الاخ الشاكي لله، بان اللون الاخضر للمنسدلة، طغى على عنوان المنسدلة، مما يحدث تشويه بجمال ال Menu
فهل بالامكان تعديل الكود بحيث لا تتأثر رؤوس القوائم المنسدلة باللون الاخضر
تم ارفاق صورتين، واحدة للطريقة الاولى ( طريقة الاخ / Sooriaty) - صورة 99
والثانية للطريقة الثانية ( طريقة الاخ / الشاكي لله) - صورة 100
ارجو المقارنة بين الصورتين، وهل بالامكان تعديل الكود تبع طريقة الاخ الشاكي لله
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
For Each Item As ToolStripMenuItem In MenuStrip1.Items
If Item.HasDropDownItems Then
SetColors(Item.DropDownItems)
End If
Next
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