تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- الكومبو بوكس ComboBox كيف تضيف أيقونات
#1
كاتب الموضوع : silverlight

اخواني الكرام

في سؤال لأحد الزملاء بالموقع عن كيفية إظهار Drives الموجودة علي الهارد ديسك داخل كونترول مثل Listview وإضافة أيقونات لها للأسف كنت مشغول ولم استطيع ان أرد عليه بالشكل المناسب ومن اجل ذلك أردت ان أرد عليه بهذا الموضوع لكي نستفيد جميعا

في الواقع إن استخدام الكونترول بشكل عام يحدده احتياجات البرنامج الذي نصممه مثلا عندما أريد أن اعرض جميع Drives الموجوده داخل الكمبيوتر من الأفضل ان أختار الكونترول المناسب لمثل هذه العملية عموما انا لن أناقش هنا كيفية التخطيط للبرامج أو كيفية تحديد الكونترول المناسب للكود المناسب فتخطيط البرامح علم كبير جدا الأن

لكن مثلا عندما أريد ان استعرض Drives الموجوده علي الكمبيوتر من الأفضل ان اختار لذلك ComboBox لأن صفاته Properties الخاصة بهذا الكونترول مهيأة لمثل هذا الهدف عموما هذا رأي شخصي مش أكتر

الحقيقة الجزء الي يهمني هنا أن اتحدث عنه هو كيفية إضافة أيقونات مناسبة الي الكومبو بوكس مثلا او إلي أي كونترول اخر فعملية إضافة أسماء Drives الي الكومبوبوكس أو حتي أي كونترول أخر ليست هي الجزء الهام في الامر فهي امر سهل يعلمه الجميع

كما يعلم الجميع إن أي كونترول من الممكن تغيير شكله وتغيير صفاته وأيضا يمكن بناؤه كاملا لناخذ مثالا علي ذلك الكومبو بوكس ومن اجل ان لا أطيل عليكم ٍادخل مباشرة في الموضوع

بعض الكونترول الموجوده بداخل الفيجوال استوديو بها خاصية OwnerDraw وهي خاصية تسمح للمبرمج بتطوير الكونترول والتغيير فيه بما يناسب البرنامج الذي يصممه ومثال علي ذلك الكومبو بوكس مثلا

كيف نستفيد من هذه الخاصية لنعيد رسم الكومبوبوكس ومن ثم نضيف له بعض الأيقونات لكي يظهر بشكل أفضل

اولا نقوم بفتح مشروع windowforms عادي جدا

أولا: نضيف الي المشروع كلاس جديد ولنطلق عليه مثلا DirComboBox

ثانيا: من داخل هذا الكلاس نقوم بعمل Inherits لكومبوبوكس

ثالثا: نضيف له بعض Items ولتكن مثلا Drives الموجوده علي الهارد ديسك

الجزء التالي من الكود يوضح الخطوات الثلاث السابقة في واقع الأمر فيه شئ قمت باستخدامه هنا وهو كلاس مهم جدا ربما نتحدث عنه في مقال اخر وهو LicenseManager ولقد قمت باستخدامه لتحديد ان عملية إضافة Items الي الكومبوبوكس يجب ان تتم في حالة RunTime Modes أي أثناء تشغيل البرنامج فقط لا غير


كود :
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.IO

Public Class DirComboBox

Inherits ComboBox

Public Sub New()

MyBase.DropDownStyle = ComboBoxStyle.DropDownList
MyBase.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
MyBase.ItemHeight = 18

Dim Drives As ReadOnlyCollection(Of DriveInfo)
If LicenseManager.UsageMode = LicenseUsageMode.Runtime Then
Drives = My.Computer.FileSystem.Drives
For Each Drive As DriveInfo In Drives
MyBase.Items.Add(Drive)
Next

MyBase.SelectedIndex = -1

End If

End Sub

End Class

رابعا: نقوم بعمل Overrides كلاس sub الموجودة داخل الكومبوبوكس وهو Sub OnDrawItem

هنا سنتوقف قليلا لتوضيح الفكره

الفكرة ببساطة تعتمد علي إضافة بعض Resources للمشروع تمثل بعض الأيقونات التي سوف تظهر بجانب كل Drive موجود داخل الكمبيوتر مثل الهارد ديسك او CD/DVD وغيرهم

وبعد ان نقوم بتعريف الايقونات نقوم برسمها داخل الكومبوبوكس مع ربط كل أيقونة بكل Drive يناسبها عن طريق استخدام Select Case وايضا نقوم برسم Text وهو هنا سيكون اسماء Drives بالإضافة الي VolumeLabel

كما تلاحظون كل شئ تم باستخدام +GDI وأعتقد الدوت نت جعل الأشياء افضل ووفر الوقت في حاجات كتيير لكن المهم نعرف أين وكيف وماذا نستخدم لكي نصل الي ما نريد

نفس الفكرة ممكن استخدامها مع Listview ايضا مع بعض التغييرات البسيطة

الكود التالي يوضح الكود كاملا واعتقد انه بسيط ومش محتاج تفسيرات كثيرة عموما لمن يريد الاستفسار يمكنه ان يسال


كود :
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.IO
Imports System.Windows.Forms
Imports System.Drawing

Public Class DirComboBox

Inherits ComboBox

Public Sub New()

MyBase.DropDownStyle = ComboBoxStyle.DropDownList
MyBase.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
MyBase.ItemHeight = 18

Dim Drives As ReadOnlyCollection(Of DriveInfo)
If LicenseManager.UsageMode = LicenseUsageMode.Runtime Then
Drives = My.Computer.FileSystem.Drives
For Each Drive As DriveInfo In Drives
MyBase.Items.Add(Drive)
Next

MyBase.SelectedIndex = -1

End If

End Sub

Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)

If e.Index = -1 Then Return

Dim drive As DriveInfo = MyBase.Items(e.Index)

Dim img As Icon

Select Case drive.DriveType

Case DriveType.Fixed
img = My.Resources.Hard_Drive

Case (DriveType.CDRom)
img = My.Resources.DVD_ROM

Case (DriveType.Network)
img = My.Resources.Network

Case (DriveType.Removable)
img = My.Resources.emd

Case DriveType.Ram
img = My.Resources.ram

Case Else
img = My.Resources.UnknownDrive

End Select

Dim imgbox As New Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height)
e.DrawBackground()
e.Graphics.DrawIcon(img, imgbox)
img.Dispose()
Dim text As String
text = drive.Name
If drive.IsReady Then
If drive.VolumeLabel IsNot Nothing Then
text = drive.VolumeLabel & " (" & drive.Name & ")"
End If
End If

e.Graphics.DrawString(text, e.Font, New SolidBrush(e.ForeColor), e.Bounds.X + imgbox.Width + 2, e.Bounds.Y)
If e.State = DrawItemState.Focus Then
e.DrawFocusRectangle()
End If

End Sub

End Class
ممكن تجرب تغير في السطرين دول من الكود مثلا


كود :
text = drive.VolumeLabel & " (" & drive.Name & ")" & "

ممكن مثلا تكتبه بالطريقه دي

text = drive.VolumeLabel & " (" & drive.Name & ") " & "VB4Arab"

كود :
e.Graphics.DrawString(text, e.Font, New SolidBrush(e.ForeColor), e.Bounds.X + imgbox.Width + 2, e.Bounds.Y)

مثلا جرب هنا تغير الفونت وتغير الألوان وممكن تسخدم LinearGradientBrush بدلا من solidBrush

جرب مش ها تخسر حاجه
ملحوظه اخيره الايقونات المستخدمه موجود بالفعل مع الفيجوال استوديو مثلا في نسخة 2008 ستجد الايقونات تحت

C:\Programfiles\Microsoft visual Studio 9.0\common7
ستجدون ملف مضغوط اسمه VS2008ImageLibrary

ونفس الشئ بالنسبة للفيجوال 2005
C:\Programfiles\Microsoft visual Studio 8.0\common7
ستجدون ملف مضغوط اسمه VS2005ImageLibrary

قم بفك الملفات المضغوطه ستجدون بها الكثير من الايقونات وملفات animations وغيرهم حيث يمكن استخدامها داخل برامجك

بالتوفيق
أخوكم عمر
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Question [مثال] كيف تضيف اكثر من لغة الى برنامجك HASAN6.0 3 418 26-11-15, 11:20 PM
آخر رد: hamada558
Thumbs Down [كود] كود لمسح كل التيكست بوكس مرة واحدة مهما كان العدد medo_ya 11 2,248 13-09-15, 05:35 PM
آخر رد: khodor1985
  معلومة ::: ComboBox Width RaggiTech 0 371 06-10-12, 10:31 PM
آخر رد: RaggiTech
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 1,243 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 365 06-10-12, 12:20 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Skin Control RaggiTech 0 530 06-10-12, 12:08 AM
آخر رد: RaggiTech
  مقال- كيف تصنع ملفات المساعدة Help Files وتربطها مع برنامجك RaggiTech 0 727 05-10-12, 07:30 PM
آخر رد: RaggiTech
  مقال- تطوير الفورم رسم الفورم باستخدام +GDI وتحريكه Moving و تغيير أبعاده Resize RaggiTech 2 870 05-10-12, 07:00 PM
آخر رد: RaggiTech
  مقال- أفكار في الدوت نت كبف تصنع ColorPicker RaggiTech 0 435 05-10-12, 06:53 PM
آخر رد: RaggiTech
  مقال- أفكار في الدوت نت Overrides DisplayRectangle Property RaggiTech 1 520 05-10-12, 06:50 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم