Serialcoder en Français Serialcoder in English
TEL : +33 (0)9 72 13 15 17

Windows Forms FAQ resources

10. Windows Forms Menus

10.5 How do I make the context menu appear only when clicked at certain portions of the Control?


You can listen to the Popup event, determine where the mouse was clicked and selectively make the menu items visible in the menu as follows:


          // In C#
          private void contextMenu1_Popup(object sender, System.EventArgs e)
          {
               // Get current mouse click position in the control (assuming pictureBox1 is the control):
               Point ptClick = this.pictureBox1.PointToClient(Control.MousePosition);
               // Get the rectangle where you want to show the context menu.
               Rectangle preferredClickRect = new Rectangle(0, 0, 50, 50);
               if(preferredClickRect.Contains(ptClick))
               {
                    // Show all the menu items so that the menu will appear
                    foreach(MenuItem item in this.contextMenu1.MenuItems)
                         item.Visible = true;
               }
               else
               {
                    // Hide all the menu items so that the menu will not appear
                    foreach(MenuItem item in this.contextMenu1.MenuItems)
                         item.Visible = false;
               }
          }



          ' In VB.Net
          Private Sub contextMenu1_Popup(ByVal sender As Object, ByVal e As System.EventArgs)
               ' Get current mouse click position in the control (assuming pictureBox1 is the control):
               Dim ptClick As Point = Me.pictureBox1.PointToClient(Control.MousePosition)
               ' Get the rectangle where you want to show the context menu.
               Dim preferredClickRect As Rectangle = New Rectangle(0,0,50,50)
               If preferredClickRect.Contains(ptClick) Then
                    ' Show all the menu items so that the menu will appear
                    Dim item As MenuItem
                    For Each item In Me.contextMenu1.MenuItems
                         item.Visible = True
                    Next
               Else
                    ' Hide all the menu items so that the menu will not appear
                    Dim item As MenuItem
                    For Each item In Me.contextMenu1.MenuItems
                         item.Visible = False
                    Next
               End If
          End Sub