RE: تجميل شكل القوائم ؟ - الشاكي لله - 09-12-13
اعتقد ان السر هنا :-
إقتباس :..... Handles ToolStripMenuItem3.Paint, ToolStripMenuItem2.Paint, ToolStripMenuItem1.Paint
حسب ماقلت انك اضفت نوافذ منسدلة اخرى فلازم تضيف handle . اما بواسطة الطريقة الي فوق او بالكود التالي :-
إقتباس :AddHandler event, AddressOf eventhandler
عذرا اخي sooriaty03 ردك تزامن مع ردي
RE: تجميل شكل القوائم ؟ - sooriaty03 - 09-12-13
بل على العكس نورت أخي محمد
RE: تجميل شكل القوائم ؟ - kafi2030 - 10-12-13
الف شكر اخي
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)
''تعبئة الخلفية باللون المطلوب
e.Graphics.FillRectangle(New System.Drawing.SolidBrush(CurrentToolStripSeparator.BackColor), e.ClipRectangle)
ToolStripMenuItem4.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem4.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
ToolStripMenuItem1.BackColor = System.Drawing.ColorTranslator.FromHtml("#C0FFC0")
ToolStripMenuItem1.ForeColor = Color.Black
'تحديد أبعاد الفاصل
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
بصراحة لم افهم كيفية تطبيق طريقتك
ممكن ان تعدل على المثال التالي المرفق
حتى تتضح الصورة اكثر، ونتعلم اكثر
بارك الله فيك
RE: تجميل شكل القوائم ؟ - الشاكي لله - 10-12-13
الطريقة هذي يدوية
إقتباس :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) قم بهذا :
كود :
AddHandler ToolStripMenuItem3.Paint, AddressOf AllSeparators
هي مجرد معلومة . اعتقد مابتستفيد منها في حالتك لأنك بتضيف الToolStripMenuItem وقت التصميم وليس في run-time
RE: تجميل شكل القوائم ؟ - sooriaty03 - 10-12-13
السلام عليكم ورحمة الله وبركاته
أخي الكريم
ترتيب الكود عندك - وإن كان يعمل جيدا - ولكنه برمجيا خاطئ...
وذلك لأنك وضعت كود تغيير الألوان داخل حدث الرسم للأدوات، فكلما قمت بالضغط على القائمة سيقوم البرنامج بإطلاق حدث الرسم وبالتالي تغيير الألوان للأدوات مرة أخرى، والصحيح أنك تقوم بتغيير الألوان في حدث 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.
الآن جرب الكود الجديد وقم بتغيير الألوان في وضع التصميم وبعد ذلك قم بتنفيذ البرنامج، ستجد أن الألوان عادت كما كانت...
RE: تجميل شكل القوائم ؟ - kafi2030 - 11-12-13
الف الف شكر
اخي Sooriaty على نصحيتك الغالية
بارك الله فيك
تم تجريب كلا الطريقتين، وهما تعملان بكل نجاح
ولكن لفت نظري بالنسبة للطريقة الثانية / طريقة الاخ الشاكي لله، بان اللون الاخضر للمنسدلة، طغى على عنوان المنسدلة، مما يحدث تشويه بجمال ال Menu
فهل بالامكان تعديل الكود بحيث لا تتأثر رؤوس القوائم المنسدلة باللون الاخضر
تم ارفاق صورتين، واحدة للطريقة الاولى ( طريقة الاخ / Sooriaty) - صورة 99
والثانية للطريقة الثانية ( طريقة الاخ / الشاكي لله) - صورة 100
ارجو المقارنة بين الصورتين، وهل بالامكان تعديل الكود تبع طريقة الاخ الشاكي لله
RE: تجميل شكل القوائم ؟ - sooriaty03 - 11-12-13
السلام عليكم ورحمة الله وبركاته
تفضل أخي تم تعديل الكود
كود :
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
بالتوفيق
|