السلام عليكــم ورحمـة الله وبركاتــه ،،
هذا مثال عملى يوضح كيفية عرض الألوان داخل الكومبوبوكس
قم بإنشاء مشروع جديد وضع على الفورم أداة كومبو وسمها ComboBox1 (الاسم الافتراضى)
الخاصية التى تهمنا هى DrawMode وهى المسئولة عن رسم العناصر داخل الكومبو ولها 3 قيم
1- Normal وهى القيمة الافتراضية وتجعل الكومبو يقوم برسم العناصر دون أى تدخل من المبرمج
2- OwnerDrawFixed تجعل المبرمج هو المسئول الأول والأخير عن رسم العناصر داخل الكومبو
3- OwnerDrawVariable مثل سابقتها والفرق يكمن فى أن الأولى ترسم كل العناصر بنفس الحجم أما هذه فتجعل المبرمج قادر على رسم كل عنصر بحجم مختلف عن طريق الحدث MeasureItem
المهم
نغير قيمة هذه الخاصية إلى OwnerDrawFixed
Me.ComboBox1.DrawMode = DrawMode.OwnerDrawFixed
الآن نقوم بإضافة الألوان داخل الكومبو
For Each colorName As String In [Enum].GetNames(GetType(System.Drawing.KnownColor)) Me.ComboBox1.Items.Add(colorName) Next
فى كل مرة يتم إضافة عنصر سيتم إطلاق الحدث DrawItem وهو المحور الأساسى الذى سيتم العمل عليه
Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem End Sub
أول كود يجب كتابته فى هذا الحدث هو
e.DrawBackground()
وهذا الكود يقوم بمسح الرسم القديم الذى قمنا به كما يقوم برسم مستطيل التحديد FocusRectangle
(إن لم تكن واضحة لك يمكن حذفها عند تطبيق المثال لترى تأثيرها :blink: )
بعد ذلك نتأكد من رقم العنصر الذى يتم رسمه الآن عن طريق الكود
If e.Index > -1 Then 'هنا سيتم العمل End If
نقوم بتعريف بعض المتغيرات التى سنستخدمها
'لتخزين العنصر الذى يتم رسمه Dim colorName As String = Me.ComboBox1.Items(e.Index) 'لتحديد الأبعاد التى سنظهر اللون فيها Dim colorRect As New Rectangle(e.Bounds.X, e.Bounds.Y, 15, 15) 'فرشاة سنستخدمها فى رسم العنصر المحدد Dim colorBrush As New SolidBrush(Color.FromName(colorName)) 'الخط الذى سنرسم به العنصر المحدد Dim selectionFont As New Font(Me.ComboBox1.Font, FontStyle.Bold)
تبدأ الآن عملية الرسم
أول شئ سنقوم برسمه هو مربع له خلفية باللون المكتوب بجانبه مثلا Red ومربع أحمر , Blue ومربع أزرق وهكذا
e.Graphics.DrawRectangle(Pens.Black, colorRect) e.Graphics.FillRectangle(colorBrush, colorRect)
بعد ذلك يتم رسم نص العنصر وهو فى حالتنا هذه اسم اللون
نحن نريد أن يكون العنصر المحدد مختلف عن بقية العناصر
فى هذه الحالة يجب علينا التحقق من حالة العنصر عن طريق الكود
If e.State And DrawItemState.Selected Then End If
نتأكد إذا كان العنصر محدد أم لا (فقط لإضافة بعض التأثيرات مثل لون الخلفية وتغيير نوع الخط وغير ذلك)
نقوم الآن برسم النص
هذا الكود لرسم العنصر المحدد
e.Graphics.FillRectangle(colorBrush, e.Bounds) e.Graphics.DrawString(colorName, selectionFont, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
وهذا لرسم العنصر الغير محدد
e.Graphics.DrawString(colorName, Me.ComboBox1.Font, Brushes.Black, e.Bounds.X + 20, e.Bounds.Y)
فى نهاية الكود نقوم بتحرير الذاكرة من المتغيرات التى قمنا بتعريفها
colorBrush.Dispose() selectionFont.Dispose()
الكود بالكامل
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.ComboBox1.DrawMode = DrawMode.OwnerDrawFixed For Each colorName As String In [Enum].GetNames(GetType(System.Drawing.KnownColor)) Me.ComboBox1.Items.Add(colorName) Next End Sub Private Sub ComboBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem e.DrawBackground() If e.Index > -1 Then 'لتخزين العنصر الذى يتم رسمه Dim colorName As String = Me.ComboBox1.Items(e.Index) 'لتحديد الأبعاد التى سنظهر اللون فيها Dim colorRect As New Rectangle(e.Bounds.X, e.Bounds.Y, 15, 15) 'فرشاة سنستخدمها فى رسم العنصر المحدد Dim colorBrush As New SolidBrush(Color.FromName(colorName)) 'الخط الذى سنرسم به العنصر المحدد Dim selectionFont As New Font(Me.ComboBox1.Font, FontStyle.Bold) e.Graphics.DrawRectangle(Pens.Black, colorRect) e.Graphics.FillRectangle(colorBrush, colorRect) If e.State And DrawItemState.Selected Then e.Graphics.FillRectangle(colorBrush, e.Bounds) e.Graphics.DrawString(colorName, selectionFont, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y) Else e.Graphics.DrawString(colorName, Me.ComboBox1.Font, Brushes.Black, e.Bounds.X + 20, e.Bounds.Y) End If colorBrush.Dispose() selectionFont.Dispose() End If End Sub End Class


