29-10-15, 03:01 PM
(آخر تعديل لهذه المشاركة : 29-10-15, 03:02 PM {2} بواسطة silverlight.)
السلام عليكم ورحمة الله و بركاته
الجميع يعلم ان معظم الكونترول الموجودة في الدوت نت تمتلك الأداة ContextMenuStrip لكن السؤال كيف يمكن إضافة مثل تلك الأداة الي مستطيل مرسوم علي سطح الكونترول او علي سطح الفورم
لكي ترسم مستطيلا علي الفورم عليك أن تقوم بتعريف هذا المستطيل و تحديد أبعاد له ثم ترسمه في الحدث Paint لكن و لكي تجعل هذه ContextMenuStrip تظهر عند الضغط علي المستطيل هنا أنت تحتاج الي كتابة بعض الكود الي يقوم بإنشاء هذه ContextMenuStrip و اضافة بيانات لها في الحدث MouseDown الخاص بالفورم
الخطوات التالية توضح كيفية عمل ذلك :
1- نحتاج الي تعريف المستطيل كما هو موضوح في الكود التالي
2 - نقوم بتعريف List بها مجموعة من String سوف نستخدمها لاحقا لكي نملأ ContextMenuStrip بالبيانات أو Items و الكود التالي يوضح كيفية تعريق هذه List
3- نحتاج الي تعريف متغير نحدد به Item او String الذي سوف يتم اختياره من ContextMenuStrip
4- في الحدث الخاص بتحميل الفورم نقوم بإضافة بعض String الي المتغير List الموجود في الخطوة 2
5- في الحدث Paint نقوم برسم المستطيل و ايضا نرسم المتغير selectedText الذي قمنا بتعريفه في الخطوة 3
6- في الحدث MouseDown نقوم بكتابة الكود الخاص بظهور ContextMenuStrip علي شاشة الفورم و ذلك حين يتم الضغط علي المستطيل و أيضا نحتاج الي اضافة حدث يحدد ماذا سيجدث عند الضغط علي احد الاختيارات الموجودة في ContextMenuStrip و الكود التالي يوضح ذلك
و الكود كاملا سيكون كالتالي
الأن قم بتشغيل المشروع لتري ماذا سيحدث عندما تضغط علي المستطيل و أيضا لتري ماذا سيحدث عندما تختار Item من ContextMenuStrip التي سوف تظهر لك
تقبلوا تحياتي
أخوكم عمر
الجميع يعلم ان معظم الكونترول الموجودة في الدوت نت تمتلك الأداة ContextMenuStrip لكن السؤال كيف يمكن إضافة مثل تلك الأداة الي مستطيل مرسوم علي سطح الكونترول او علي سطح الفورم
لكي ترسم مستطيلا علي الفورم عليك أن تقوم بتعريف هذا المستطيل و تحديد أبعاد له ثم ترسمه في الحدث Paint لكن و لكي تجعل هذه ContextMenuStrip تظهر عند الضغط علي المستطيل هنا أنت تحتاج الي كتابة بعض الكود الي يقوم بإنشاء هذه ContextMenuStrip و اضافة بيانات لها في الحدث MouseDown الخاص بالفورم
الخطوات التالية توضح كيفية عمل ذلك :
1- نحتاج الي تعريف المستطيل كما هو موضوح في الكود التالي
كود :
Private rect As Rectangle = New Rectangle(10, 10, 100, 20)
2 - نقوم بتعريف List بها مجموعة من String سوف نستخدمها لاحقا لكي نملأ ContextMenuStrip بالبيانات أو Items و الكود التالي يوضح كيفية تعريق هذه List
كود :
Private list As List(Of String) = New List(Of String)
3- نحتاج الي تعريف متغير نحدد به Item او String الذي سوف يتم اختياره من ContextMenuStrip
كود :
Private selectedText As String = Nothing
4- في الحدث الخاص بتحميل الفورم نقوم بإضافة بعض String الي المتغير List الموجود في الخطوة 2
كود :
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.list.Add("Omar")
Me.List.Add("Amin")
Me.List.Add("Ibrahim")
End Sub
5- في الحدث Paint نقوم برسم المستطيل و ايضا نرسم المتغير selectedText الذي قمنا بتعريفه في الخطوة 3
كود :
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
Using sb As New SolidBrush(Color.Black)
e.Graphics.FillRectangle(sb, rect)
Using sf As StringFormat = New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
e.Graphics.DrawString(selectedText, Control.DefaultFont, Brushes.White, rect, sf)
End Using
End Using
End Sub
6- في الحدث MouseDown نقوم بكتابة الكود الخاص بظهور ContextMenuStrip علي شاشة الفورم و ذلك حين يتم الضغط علي المستطيل و أيضا نحتاج الي اضافة حدث يحدد ماذا سيجدث عند الضغط علي احد الاختيارات الموجودة في ContextMenuStrip و الكود التالي يوضح ذلك
كود :
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
Dim pt As Point = Me.PointToClient(Cursor.Position)
If rect.Contains(pt) Then
Dim strip As ContextMenuStrip = New ContextMenuStrip()
For i As Integer = 0 To Me.list.Count - 1
Dim s As String = Me.list(i)
Dim item As ToolStripMenuItem = CType(strip.Items.Add(s, Nothing, AddressOf Me.OnContextMenuItemClick), ToolStripMenuItem)
item.Tag = s
Next
Dim stripLocation As Point = New Point(Me.rect.Left + (rect.Width / 2), Me.rect.Bottom)
strip.Show(Me, stripLocation)
Return
End If
End Sub
Private Sub OnContextMenuItemClick(sender As Object, ea As EventArgs)
If TypeOf sender Is ToolStripItem AndAlso TypeOf (CType(sender, ToolStripItem)).Tag Is String Then
Me.selectedText = CType((CType(sender, ToolStripItem)).Tag, String)
Invalidate(rect)
End If
End Sub
و الكود كاملا سيكون كالتالي
كود :
Public Class Form1
Private list As List(Of String) = New List(Of String)
Private rect As Rectangle = New Rectangle(10, 10, 100, 20)
Private selectedText As String = Nothing
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.list.Add("Omar")
Me.List.Add("Amin")
Me.List.Add("Ibrahim")
End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
Using sb As New SolidBrush(Color.Black)
e.Graphics.FillRectangle(sb, rect)
Using sf As StringFormat = New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
e.Graphics.DrawString(selectedText, Control.DefaultFont, Brushes.White, rect, sf)
End Using
End Using
End Sub
Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
Dim pt As Point = Me.PointToClient(Cursor.Position)
If rect.Contains(pt) Then
Dim strip As ContextMenuStrip = New ContextMenuStrip()
For i As Integer = 0 To Me.list.Count - 1
Dim s As String = Me.list(i)
Dim item As ToolStripMenuItem = CType(strip.Items.Add(s, Nothing, AddressOf Me.OnContextMenuItemClick), ToolStripMenuItem)
item.Tag = s
Next
Dim stripLocation As Point = New Point(Me.rect.Left + (rect.Width / 2), Me.rect.Bottom)
strip.Show(Me, stripLocation)
Return
End If
End Sub
Private Sub OnContextMenuItemClick(sender As Object, ea As EventArgs)
If TypeOf sender Is ToolStripItem AndAlso TypeOf (CType(sender, ToolStripItem)).Tag Is String Then
Me.selectedText = CType((CType(sender, ToolStripItem)).Tag, String)
Invalidate(rect)
End If
End Sub
End Class
الأن قم بتشغيل المشروع لتري ماذا سيحدث عندما تضغط علي المستطيل و أيضا لتري ماذا سيحدث عندما تختار Item من ContextMenuStrip التي سوف تظهر لك
تقبلوا تحياتي
أخوكم عمر