C#进行Visio二次开发之自定义右键菜单
Visio Drawing Control Visio 两种实现的效果如下图所示,两者的区别是,使用第二种会保留Visio控件的一些如复制、粘贴的原有菜单
中集成自定义菜单是很多项目必须的,很多朋友也问过我如何实现这些菜单,下面介绍下
Visio
自定义菜单的实现。
二次开发中,为
Visio Drawing Control
添加自定义菜单有两种方式:一种是使用捕捉
Visio
的
MouseUpEvent
事件,弹出
ContextMenu
即可;另一种是通过在
PageSheet
中增加
Action
来实现,也就是使用
RUNADDONWARGS
函数来实现。
先介绍第一种方法,首先注册
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)
转载请注明出处:
撰写人:伍华聪 http:
//
www.iqidi.com