السلام عليكــم ورحمـة الله وبركاتــه ،،
في هذا الموضوع سأتشارك معكم هذا الكنترول الذي طورته لتمكين المستخدم من سهولة اختيار رسم للكتابة. هذا الكنترول طورته لاستخدامه في مشروع أنا على وشك اتمامه و رغبة مني في المشاركة في المساهمة في تنشيط هذا المنتدى قمت بترجمة كود الكنترول إلى لغة VB.NET لأن المشروع الذي أعمل عليه بطور بلغة C#.
الكنترول الذي أسميته FontCollectionComboBox بسيط للغاية و لم يحتج إلا إلى ثلاث دوال للتشغيل الأولي.
Public Sub New()
و هي دالة الباني الإفتراضي حيث سيتم تحديد الخصائص للإشتغال المثالي للكنتريل إضافة إلى إنشاء كائن للكلاس InstalledFonctCollection و الذي سيحتوي على مجموعة معلومات الرسوم المتبثة على النظام والتي من خلالها يتم ملء اللائحة التي ستظهر للمستخدم وتمكنه من اختيار نوع الرسم.
Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
هذه الدالة تتم المناداة عليها كلما وجب رسم عنصر من اللائحة. وداخل هذه الدالة يتم رسم العنصر بنوع الرسم الذي يظهر اسمه للمستخدم كما هو الحال في برنامج الورد مثلا.
Protected Overrides Sub OnMeasureItem(ByVal e As System.Windows.Forms.MeasureItemEventArgs)
لأن حجم كل رسم يختلف عن الآخر و بالتالي تختلف أحجام كل عنصر من عناصر اللائحة لتحتوي اسم الرسم كما يجب. هذه الدالة تتم المناداة عليها قبيل المناداة على الدالة OnDrawItem كي نخبر مسير الواجهة بحجم العنصر لتتم عملية رسمه في أحسن الظروف.
في ما يلي كود الكلاس FontCollectionComboBox و في نهاية الموضوع ستجدون مشروع ملحق به الكلاس و برنامج صغير لإضهار امكانيات الكنترول.
Imports System.Drawing.Text Imports System.ComponentModel Public Class FormCollectionComboBox 'لوراثة كل الخصائص Inherits ComboBox ' الكائن الذي يحتوي على لائحة باسم كل أنواع الرسم المتبثة على النظام Dim fontCollection As InstalledFontCollection ' الباني الإفتراضي Public Sub New() ' إنشاء الكائن الذي سيحتوي على معلومات تخص كل أنواع الرسم المتبثة على النظام fontCollection = New InstalledFontCollection() ' لتسهيل إيجاد اسم رسم عن طريق المساعدة عند الكتابة AutoCompleteMode = Windows.Forms.AutoCompleteMode.Append AutoCompleteSource = Windows.Forms.AutoCompleteSource.ListItems ' لتنبيه مسير الواجهة أن عناصر الائحة ليست لها نفس الإرتفاع DrawMode = Windows.Forms.DrawMode.OwnerDrawVariable ' لنبدأ من الصفر Items.Clear() ' نملأ الائحة بأسماء أنواع الرسوم If LicenseManager.UsageMode = LicenseUsageMode.Runtime Then For Each ff As FontFamily In fontCollection.Families Items.Add(ff.Name) Next End If IntegralHeight = True End Sub ' هذه الدالة تتم المناداة عليها في كل مرة يجب فيها رسم عنصر من الائحة Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs) ' للحماية من الأخطاء If (e.Index >= fontCollection.Families.Count) Or (e.Index < 0) Then MyBase.OnDrawItem(e) Return End If ' رسم خلفية العنصر e.DrawBackground() ' رسم العنصر بنوع الرسم الذي يشير إلى اسمه Dim f As New Font(fontCollection.Families(e.Index).Name, e.Font.Size, FontStyle.Bold) Dim b As New SolidBrush(e.ForeColor) Dim sf As New StringFormat() sf.LineAlignment = StringAlignment.Center e.Graphics.DrawString(fontCollection.Families(e.Index).Name, f, b, e.Bounds, sf) f.Dispose() b.Dispose() ' رسم إطار الفوكيوس e.DrawFocusRectangle() ' تمرير الحدث إلى الكائن الموروث عنه كي يقوم بعمله MyBase.OnDrawItem(e) End Sub ' تتم المناداة على هذه الدالة قبيل رسم عنصر من الائحة لحساب و تحديد ' حجم العنصر في حالة ما إذا كانت العناصر ليست متساوية في الحجم Protected Overrides Sub OnMeasureItem(ByVal e As System.Windows.Forms.MeasureItemEventArgs) ' للحماية من الأخطاء If (e.Index >= fontCollection.Families.Count) Or (e.Index < 0) Then MyBase.OnMeasureItem(e) Return End If ' حساب حجم العنصر بناء على نوع الرسم الذي سيستعمل لرسم الإسم Dim f As New Font(fontCollection.Families(e.Index).Name, Font.Size, FontStyle.Bold) e.ItemHeight = f.GetHeight(e.Graphics) * 1.1 e.ItemWidth = DropDownWidth f.Dispose() 'تمرير الحدث إلى الكائن الموروث عنه كي يقوم بعمله هو الآخر MyBase.OnMeasureItem(e) End Sub End Class
تحياتي...
