الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية إنشاء لائحة Combobox بأسماء أنواع رسوم الحروف المتبثة على النظام

بدأه محمد رضى في 10 أغسطس 2009 · 3 رد · 4,852 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

في هذا الموضوع سأتشارك معكم هذا الكنترول الذي طورته لتمكين المستخدم من سهولة اختيار رسم للكتابة. هذا الكنترول طورته لاستخدامه في مشروع أنا على وشك اتمامه و رغبة مني في المشاركة في المساهمة في تنشيط هذا المنتدى قمت بترجمة كود الكنترول إلى لغة VB.NET لأن المشروع الذي أعمل عليه بطور بلغة C#.

post-207152-1249912327_thumb.jpg

الكنترول الذي أسميته 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

تحياتي...

WindowsApplication1.rar

#2

جزاك الله خيرا أخى محمد وزادك الله علما ونفع بك

هنا درس مشابه عن كيفية ملأ الكومبوبوكس بالألوان

/index.php?showtopic=196902

هذا أول الدروس المرشحة لقسم الدروس والمواضيع المتميزة

ننتظر باقى الدروس وباقى الأعضاء :evil:

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#3

شكرا لك أخي GHOST2010

في الحقيقة, مازلت أطور أسلوبي في اللغة العربية التقنية لأنني أجد صعوبة في الكتابة و الشرح. و لا أخفيكم سرا أنني لم أكتب نصا باللغة العربية قبل تسجيلي في هذا المنتدى بسنوات. و حتى أصبح قادرا على الكتابة و الشرح مثل باقي الأعضاء المحترمين, و حتى أصبح قادرا على الكتابة بلغتي الأم بدون الإستعانة بـ bing translator, فلن أسمي مواضيعي دروسا.

تحياتي...

1
#4

شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا شكرا

يعطيك العافيه وسلامه

مواضيع مشابهة