منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : Add ContextMeunStrip To Rectangle
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله و بركاته

الجميع يعلم ان معظم الكونترول الموجودة في الدوت نت تمتلك الأداة 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 التي سوف تظهر لك

تقبلوا تحياتي
أخوكم عمر
يمكن عمل contexmenustrip واظهارها عن الضغط على اي اداة ... تسكت بوكس مثلاً
وبدون كود ... فقط في التيكست بوكس حدد

Textbox1.contexmenustrip = contexmenustrip 1
إضافة ContextMenuStrip الي اي كونترول أمر سهل و بسيط و الكود المستخدم في ذلك غالبا يكون مثل الكود الذي تفضلت انت بكتابته ..... لكن الهدف هنا هو توضيح كيفية إضافة ContextMenuStrip الي مستطيل مرسوم علي سطح اي كونترول او علي سطح الفورم
اشكرك من كل قلبي وكثر الله من امثالك