Need to hide/disable the context menu which appears after clicking the page tab

Started by jigar189, January 07, 2009, 07:47:56 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

jigar189

Hi,

   I need to hide/disable the context menu which appears on right clicking the page tab at the bottom of the drawing.
   Can anone pls help me with the approach?

??? ???

Paul Herber

Here is some code that disables the Insert page menu. It's not C# (it's Delphi) but I'm sure you can cope with that. It also assumes that the Custom menu has already replaced the Builtin menu.


procedure removeUnwantedPageMenu();
var
  UIObj:     Visio_TLB.UIObject;
  MenuSets:  Visio_TLB.MenuSets;
  MenuSet:   Visio_TLB.MenuSet;
  Menus:     Visio_TLB.Menus;
  Menu:      Visio_TLB.Menu;
  MenuItems: Visio_TLB.MenuItems;
  i, j, k:   integer;
begin
  UIObj := VSL.visApp.Application.CustomMenus;
  MenuSets := UIObj.MenuSets;
  for j := 0 to menuSets.Count-1 do
  begin
    MenuSet := MenuSets.Item[j];
    Menus := MenuSet.Menus;
    for k := 0 to Menus.Count-1 do
    begin
      Menu := Menus.Item[k];
      MenuItems := Menu.MenuItems;
      for i := 0 to MenuItems.Count-1 do
      begin
        if (MenuItems[i].Get_CmdNum = visCmdOptionsNewPage) then
        begin
          MenuItems[i].Enabled := false;
        end; // if
      end; // i
    end; // k
  end; // j
  VSL.visApp.ActiveDocument.SetCustomMenus(UIObj);
end;


Electronic and Electrical engineering, business and software stencils for Visio -

https://www.paulherber.co.uk/

jigar189

Hi Paul,
     
     Thanks for the help !!!
     I guess the code you have given would disable all the menus and i needed to disable a specific menuset. The Menuset index for the Pagetab menu which I was looking for is 46.
Neways thanks for the code.
:)

RaWaS

Menus: Add Items to the File menu.

Public Sub MenuItem_Add()

Dim uiObj As Visio.UIObject
Dim visMenuSets As Visio.MenuSets
Dim visMenuSet As Visio.MenuSet
Dim visMenus As Visio.Menus
Dim visMenu As Visio.Menu
Dim visMenuItems As Visio.MenuItems
Dim visMenuItem As Visio.MenuItem

Set uiObj = Visio.Application.BuiltInMenus
Set visMenuSets = uiObj.MenuSets
' Get the Visio object context menu set.
Set visMenuSet = visMenuSets.ItemAtID(visUIObjSetDrawing)
Set visMenus = visMenuSet.Menus
' Get the file menu from the menus collection.
Set visMenu = visMenus.Item(0)
' Get the items collection from the file menu
Set visMenuItems = visMenu.MenuItems

' Add Example Menu Item to the File menu in the 4th position
Set visMenuItem = visMenuItems.AddAt(3)
visMenuItem.Caption = "Example"
visMenuItem.State = Visio.visButtonUp

' Have Example run the HelloWorld Sub procedure
visMenuItem.AddOnName = "ThisDocument.HelloWorld"

' Set the new menus.
Visio.Application.SetCustomMenus uiObj
' Tell Visio to use the new UI when the document is active.
ThisDocument.SetCustomMenus uiObj
End Sub




RaWaS

Attribute VB_Name = "modPopupMenu"
Option Explicit

' Required API declarations
Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function InsertMenuItem Lib "user32" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, ByRef lpcMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As RECT) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

' Type required by TrackPopupMenu although this is ignored !!
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

' Type required by InsertMenuItem
Private Type MENUITEMINFO
    cbSize As Long
    fMask As Long
    fType As Long
    fState As Long
    wID As Long
    hSubMenu As Long
    hbmpChecked As Long
    hbmpUnchecked As Long
    dwItemData As Long
    dwTypeData As String
    cch As Long
End Type

' Type required by GetCursorPos
Private Type POINTAPI
        X As Long
        Y As Long
End Type

' Constants required by TrackPopupMenu
Private Const TPM_LEFTALIGN = &H0&
Private Const TPM_TOPALIGN = &H0
Private Const TPM_RETURNCMD = &H100
Private Const TPM_RIGHTBUTTON = &H2&

' Constants required by MENUITEMINFO type
Private Const MIIM_STATE = &H1
Private Const MIIM_ID = &H2
Private Const MIIM_TYPE = &H10
Private Const MFT_STRING = &H0
Private Const MFT_SEPARATOR = &H800
Private Const MFS_DEFAULT = &H1000
Private Const MFS_ENABLED = &H0
Private Const MFS_GRAYED = &H1

' Contants defined by me for menu item IDs
Private Const ID_Cut = 101
Private Const ID_Copy = 102
Private Const ID_Paste = 103
Private Const ID_Delete = 104
Private Const ID_SelectAll = 105


' Variables declared at module level
Private FormCaption As String
Private Cut_Enabled As Long
Private Copy_Enabled As Long
Private Paste_Enabled As Long
Private Delete_Enabled As Long
Private SelectAll_Enabled As Long



Public Sub ShowPopup(oForm As UserForm, strCaption As String, X As Single, Y As Single)

    Dim oControl As MSForms.TextBox
    Static click_flag As Long
   
    ' The following is required because the MouseDown event
    ' fires twice when right-clicked !!
    click_flag = click_flag + 1
       
    ' Do nothing on first firing of MouseDown event
    If (click_flag Mod 2 <> 0) Then Exit Sub
               
    ' Set object reference to the textboxthat was clicked
    Set oControl = oForm.ActiveControl
       
    ' If click is outside the textbox, do nothing
    If X > oControl.Width Or Y > oControl.Height Or X < 0 Or Y < 0 Then Exit Sub
   
    ' Retrieve caption of UserForm for use in FindWindow API
    FormCaption = strCaption
   
    ' Call routine that sets menu items as enabled/disabled
    Call EnableMenuItems(oForm)
   
    ' Call function that shows the menu and return the ID
    ' of the selected menu item. Subsequent action depends
    ' on the returned ID.
    Select Case GetSelection()
        Case ID_Cut
            oControl.Cut
        Case ID_Copy
            oControl.Copy
        Case ID_Paste
            oControl.Paste
        Case ID_Delete
            oControl.SelText = ""
        Case ID_SelectAll
            With oControl
                .SelStart = 0
                .SelLength = Len(oControl.Text)
            End With
    End Select

End Sub

Private Sub EnableMenuItems(oForm As UserForm)

    Dim oControl As MSForms.TextBox
    Dim oData As DataObject
    Dim testClipBoard As String
   
    On Error Resume Next
   
    ' Set object variable to clicked textbox
    Set oControl = oForm.ActiveControl
   
    ' Create DataObject to access the clipboard
    Set oData = New DataObject
   
    ' Enable Cut/Copy/Delete menu items if text selected
    ' in textbox
    If oControl.SelLength > 0 Then
        Cut_Enabled = MFS_ENABLED
        Copy_Enabled = MFS_ENABLED
        Delete_Enabled = MFS_ENABLED
    Else
        Cut_Enabled = MFS_GRAYED
        Copy_Enabled = MFS_GRAYED
        Delete_Enabled = MFS_GRAYED
    End If
   
    ' Enable SelectAll menu item if there is any text in textbox
    If Len(oControl.Text) > 0 Then
        SelectAll_Enabled = MFS_ENABLED
    Else
        SelectAll_Enabled = MFS_GRAYED
    End If
   
    ' Get data from clipbaord
    oData.GetFromClipboard
   
    ' Following line generates an error if there
    ' is no text in clipboard
    testClipBoard = oData.GetText

    ' If NO error (ie there is text in clipboard) then
    ' enable Paste menu item. Otherwise, diable it.
    If Err.Number = 0 Then
        Paste_Enabled = MFS_ENABLED
    Else
        Paste_Enabled = MFS_GRAYED
    End If
   
    ' Clear the error object
    Err.Clear
   
    ' Clean up object references
    Set oControl = Nothing
    Set oData = Nothing

End Sub

Private Function GetSelection() As Long

    Dim menu_hwnd As Long
    Dim form_hwnd As Long
    Dim oMenuItemInfo1 As MENUITEMINFO
    Dim oMenuItemInfo2 As MENUITEMINFO
    Dim oMenuItemInfo3 As MENUITEMINFO
    Dim oMenuItemInfo4 As MENUITEMINFO
    Dim oMenuItemInfo5 As MENUITEMINFO
    Dim oMenuItemInfo6 As MENUITEMINFO
    Dim oRect As RECT
    Dim oPointAPI As POINTAPI
   
    ' Find hwnd of UserForm - note different classname
    ' Word 97 vs Word2000
    #If VBA6 Then
        form_hwnd = FindWindow("ThunderDFrame", FormCaption)
    #Else
        form_hwnd = FindWindow("ThunderXFrame", FormCaption)
    #End If

    ' Get current cursor position
    ' Menu will be drawn at this location
    GetCursorPos oPointAPI
       
    ' Create new popup menu
    menu_hwnd = CreatePopupMenu
   
    ' Intitialize MenuItemInfo structures for the 6
    ' menu items to be added
   
    ' Cut
    With oMenuItemInfo1
            .cbSize = Len(oMenuItemInfo1)
            .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
            .fType = MFT_STRING
            .fState = Cut_Enabled
            .wID = ID_Cut
            .dwTypeData = "Cut"
            .cch = Len(.dwTypeData)
    End With
   
    ' Copy
    With oMenuItemInfo2
            .cbSize = Len(oMenuItemInfo2)
            .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
            .fType = MFT_STRING
            .fState = Copy_Enabled
            .wID = ID_Copy
            .dwTypeData = "Copy"
            .cch = Len(.dwTypeData)
    End With
   
    ' Paste
    With oMenuItemInfo3
            .cbSize = Len(oMenuItemInfo3)
            .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
            .fType = MFT_STRING
            .fState = Paste_Enabled
            .wID = ID_Paste
            .dwTypeData = "Paste"
            .cch = Len(.dwTypeData)
    End With
   
    ' Separator
    With oMenuItemInfo4
            .cbSize = Len(oMenuItemInfo4)
            .fMask = MIIM_TYPE
            .fType = MFT_SEPARATOR
    End With
   
    ' Delete
    With oMenuItemInfo5
            .cbSize = Len(oMenuItemInfo5)
            .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
            .fType = MFT_STRING
            .fState = Delete_Enabled
            .wID = ID_Delete
            .dwTypeData = "Delete"
            .cch = Len(.dwTypeData)
    End With
   
    ' SelectAll
    With oMenuItemInfo6
            .cbSize = Len(oMenuItemInfo6)
            .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
            .fType = MFT_STRING
            .fState = SelectAll_Enabled
            .wID = ID_SelectAll
            .dwTypeData = "Select All"
            .cch = Len(.dwTypeData)
    End With
   
    ' Add the 6 menu items
    InsertMenuItem menu_hwnd, 1, True, oMenuItemInfo1
    InsertMenuItem menu_hwnd, 2, True, oMenuItemInfo2
    InsertMenuItem menu_hwnd, 3, True, oMenuItemInfo3
    InsertMenuItem menu_hwnd, 4, True, oMenuItemInfo4
    InsertMenuItem menu_hwnd, 5, True, oMenuItemInfo5
    InsertMenuItem menu_hwnd, 6, True, oMenuItemInfo6
   
    ' Return the ID of the item selected by the user
    ' and set it the return value of the function
    GetSelection = TrackPopupMenu _
                    (menu_hwnd, _
                     TPM_LEFTALIGN Or TPM_TOPALIGN Or TPM_RETURNCMD Or TPM_RIGHTBUTTON, _
                     oPointAPI.X, oPointAPI.Y, _
                     0, form_hwnd, oRect)
       
    ' Destroy the menu
    DestroyMenu menu_hwnd

End Function

Paul Herber

Electronic and Electrical engineering, business and software stencils for Visio -

https://www.paulherber.co.uk/