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

كيفيه تغير شكل القوائم ووضع أيقونه بها بالكود

مغلق
بدأه ايهاب عيسى في 14 أكتوبر 2004 · 3 رد · 896 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سنتعلم في هذا الدرس كيفيه تغير شكل القوائم ووضع أيقونه بها بالكود

لكي يتم ذلك

أولا: خاصية OwnerDraw

الخاصة OwnerDraw لكل عنصر في القائمة نجعلها تساوى true

خاصية OwnerDraw تعنى أن عنصر في القائمة (menuItem) سيكون مرسوم بالكود

وبالتالى فإن New,Open,Save,Exit MenuItem ستكون خاصية

OwnerDraw= true

بينما File MenuItem ستكون هذه الخاصية تساوى false لأننا لن نرسمه بالكود

ثانيا:الحدث MeasureItem

يحدث عندما تحتاج القائمة معرفه حجم عنصر القائمة قبل ما يتم رسمه

مثلا Open MenuItem وهكذا لباقي العناصر بنفس القيم

private void Open_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
	e.ItemWidth = 100;
	e.ItemHeight = 20;
}

نحدد عرض وارتفاع العنصر المراد رسمه

ثلاثا:الحدث DrawItem

وهو الأهم يحدث عندما تكون خاصية OwnerDraw= true لكي يتم رسم القائمة

سوف نعمل داله بسيطة ونسميها Draw_Menu ونستدعيها في حدث DrawItem لكل عنصر في القائمة

 Draw_Menu (int number,object sender,System.Windows.Forms.DrawItemEventArgs e,bool icon)

post-57-1097709202_thumb.jpg

#2

داله Draw_Menu

تأخذ أربع معاملات

1.number : رقم الأيقونة في ImageList

2.sender : عنصر القائمة الذي استدعى الدالة

3.e : يمثل DrawItemEventArgs

4.icon : إذا كان true سيتم وضع أيقونة لعنصر القائمة

من الأشياء التي تم استخدمها داخل هذه الدالة

1.StringFormat : هو يحتوى على معلومات عن تنسيق النص

فائدته هنا هو وضع محاذاة للنص الذي سيتم رسمه على القائمة عن طريق خاصية Alignment

2.DrawItemEventArgs e

e.state : يرجع حالة عنصر القائمة الذي يرسم بيكون من نوع DrawItemState ويوجد عدة حالات منها :

1)DrawItemState.NoAccelerator

معناه انك تستعرض القائمة بدون استخدام لوحة المفاتيح

2)DrawItemState.Selected

معناه انك اخترت عنصر في القائمة

3)DrawItemState.HotLight

عند مرور مؤشر الماوس على عنصر في القائمة

شرح الدالة

إذا تحقق الشرط سيتم

1.رسم مستطيل ممتلئ بلون (SystemColors.InactiveCaptionText)

2.رسم مستطيل فارغ لون حدوده (Pens.CornflowerBlue)

3.رسم اسم عنصر القائمة

4.رسم الأيقونة إذا كان icon=true

إذا لم تحقق الشرط سيتم

1.رسم مستطيل ممتلئ بلون الأبيض

2.رسم مستطيل ممتلئ في الجزء الأيسر من عنصر القائمة بلون (SystemColors.Control)

3.رسم الأيقونة إذا كان icon=true

4.رسم اسم عنصر القائمة

#3

كود داله Draw_Menu

/// <summary>
/// Draw Menu items
/// </summary>
/// <param name="number">No of icon</param>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <param name="icon">wanted icon or not</param>

	private void Draw_Menu (int number,object sender,System.Windows.Forms.DrawItemEventArgs e,bool icon)
{
Rectangle rc = new Rectangle(e.Bounds.X+25 , e.Bounds.Y+2,  e.Bounds.Width, e.Bounds.Height);
 	 
MenuItem s = (MenuItem)sender;
string s1 = s.Text;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Near;
 	 
	if ( e.State ==  (DrawItemState.NoAccelerator | DrawItemState.Selected)  || e.State ==  ( DrawItemState.Selected) || e.State ==  ( DrawItemState.HotLight)) 
{
    e.Graphics.FillRectangle(new SolidBrush(SystemColors.InactiveCaptionText) , e.Bounds.X,e.Bounds.Y,e.Bounds.Width+1,e.Bounds.Height+2);
    e.Graphics.DrawRectangle(Pens.CornflowerBlue ,e.Bounds.X,e.Bounds.Y,e.Bounds.Width-1,e.Bounds.Height-1);

e.Graphics.DrawString( s1 , new Font("Microsoft Sans Serif" , 8) ,  new SolidBrush(Color.Black), rc ,sf);
      if(icon)e.Graphics.DrawImage(imageList1.Images[number],e.Bounds.X+2,e.Bounds.Y+2);
}
else
{
e.Graphics.FillRectangle(new SolidBrush(Color.White) , e.Bounds.X,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height+2);

e.Graphics.FillRectangle(new SolidBrush(SystemColors.Control),e.Bounds.X,e.Bounds.Y,20,e.Bounds.Height+2);
    if(icon)e.Graphics.DrawImage(imageList1.Images[number],e.Bounds.X+2,e.Bounds.Y+2);
e.Graphics.DrawString( s1 , new Font("Microsoft Sans Serif" , 8) ,  new SolidBrush(Color.Black),rc ,sf);
}
e.DrawFocusRectangle();
}

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

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…