Visio Drawing Control中集成自定義菜單是很多項目必須的,很多朋友也問 過我如何實現這些菜單,下面介紹下Visio自定義菜單的實現。
Visio二次 開發中,為Visio Drawing Control添加自定義菜單有兩種方式:一種是使用捕捉 Visio的MouseUpEvent事件,彈出ContextMenu即可;另一種是通過在PageSheet中 增加Action來實現,也就是使用RUNADDONWARGS函數來實現。
兩種實現的 效果如下圖所示,兩者的區別是,使用第二種會保留Visio控件的一些如復制、粘 貼的原有菜單
先 介紹第一種方法,首先注冊MouseUpEvent的事件,如下代碼所示:
drawingControl.MouseUpEvent += new AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEventHandler(this.onDrawingControlMouseUp);
然後,你 需要實現
onDrawingControlMouseUp函數的內容,在裡面你需要限制下右 鍵的一些事件,然後通過X,Y坐標獲取選定的Shape對象,彈出你的ContextMenu 對象即可,如下代碼所示。
private void onDrawingControlMouseUp(object sender,AxMicrosoft.Office.Interop.VisOcx.EVisOcx_MouseUpEvent eventData)
{
if ((eventData.button == (int) VisKeyButtonFlags.visMouseRight) &&
((eventData.keyButtonState & (int)VisKeyButtonFlags.visKeyControl) ==0 )) {
clickedShape = Utility.GetClickedShape (drawingControl, eventData.x, eventData.y);
if (clickedShape != null) {
eventData.cancelDefault = true;
shapeShortcutMenu.Show (this,Utility.MapVisioToWindows(drawingControl, eventData.x, eventData.y));
}
}
第二種方式是通過 添加Action方式,使用RUNADDONWARGS函數來實現。操作也很簡單,先獲取指定的 Page對象,清除Action事件(因為你每次加入的話,Action始終保留你的添加的 內容,防止出現多個相同的右鍵菜單,我每次刪除舊的內容,然後再添加我需要 的東西),然後添加所需要的右鍵菜單即可。
Visio.Page page = VisioUtility.GetPage(VisDocument, "饋線圖");
if (page != null)
{
//清除所有相關的菜單事件
page.PageSheet.DeleteSection((short)VisSectionIndices.visSectionAction);
//加入新的菜單
VisioUtility.AddRightMouseAction(page.PageSheet,
"\"停電分析\"",
"RUNADDONWARGS(\"QUEUEMARKEREVENT\", \"/Drawing=停電分析\")",
isEnable, true, false, false, true, true);
}
AddRightMouseAction是一個添加右鍵菜單的函數 ,函數比較復雜,這裡列出函數的原型, 它其實現的內容就是將內容寫入Page對 象的Actions中而已:
/**//// <summary>
/// 給SHPAE增加一個 彈出菜單
/// </summary>
/// <param name="TargetShape"></param>
/// <param name="menuCaption">菜單標題</param>
/// <param name="menuAction">菜單動作 </param>
/// <param name="menuEnabled">菜單的可用性</param>
/// <param name="menuChecked"></param>
/// <param name="beginGroup"></param>
/// <param name="addToBottom"></param>
/// <param name="menuCaptionISFormula"></param>
/// <param name="menuVisible">是否可見 </param>
public static void AddRightMouseAction (Visio.Shape TargetShape, string menuCaption, string menuAction,
bool menuEnabled, bool menuChecked, bool beginGroup, bool addToBottom, bool menuCaptionISFormula,
bool menuVisible)