用户需要右键弹出菜单,则需要响应鼠标事件,右键按下后,弹出菜单分为在命令下运行及在非命令下运行,具体介绍如下 :
一、新建菜单文件
1、新一个文本文件: mxpoptest.mnu,内容如下(此文件为在命令下运行菜单):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 菜单条文件头说明.
// "文件类型字符串" "资源文件名" "透明颜色" "位置,可以是:top,left,bottom,right"
"MxDrawMenuBarFile" "MxDraw.dll" (214 211 206) "top" "弹出菜单2"
// 菜单内容说明
// "命令名称" "命令" "图标索引字符串" "资源文件名" "命令提示字符串" "命令ID" "ID类型" "是否命令当着函数执行"
"POPMENUS" "对象(&O)"
"确定" "" "" "" "确定" "" "ID_OK_BUTTON"
//"取消" "" "" "" "取消" "" "ID_CANCLE_BUTTON"
"关键字" "" "" "" "关键字" "" "ID_KEYWORD_BUTTON"
"SEPARATOR"
"Test(&E)" "Test" "" "" "编辑文字" "55" "" "Y"
"POPMENUE"
|
此处的关键字为命令行提示命令。
2、新一个文本文件: MxPopMenuEnt.mnu,内容如下(此文件为在非命令下运行点击实体菜单):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 菜单条文件头说明.
// "文件类型字符串" "资源文件名" "透明颜色" "位置,可以是:top,left,bottom,right"
"MxDrawMenuBarFile" "MxDraw.dll" (214 211 206) "top" "弹出菜单2"
// 菜单内容说明
// "命令名称" "命令" "图标索引字符串" "资源文件名" "命令提示字符串" "命令ID" "ID类型"
"POPMENUS" "对象(&O)"
"删除(&E)" "_Erase" "IDB_ERASE_BITMAP"
"复制(&Y)" "_Copy" "IDB_COPY_BITMAP"
"移动(&V)" "_Move" "IDB_MOVE_BITMAP"
"旋转(&R)" "_Rotation" "IDB_ROTATION_BITMAP"
"缩放(&L)" "_Scale" "IDB_SCALE_BITMAP"
"SEPARATOR"
"对象特性(&O)" "Mx_ShowProperties" "IDB_PROPERTY_BITMAP" "PropertyEditor.mrx"
"SEPARATOR"
"用户自加命令(&U)" "" "" "" "" "99"
"POPMENUE"
|
3、新一个文本文件: MxPopMenu.mnu,内容如下(此文件为在非命令下运行无实体右击菜单):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// 菜单条文件头说明.
// "文件类型字符串" "资源文件名" "透明颜色" "位置,可以是:top,left,bottom,right"
"MxDrawMenuBarFile" "MxDraw.dll" (214 211 206) "top" "弹出菜单1"
// 菜单内容说明
// "命令名称" "命令" "图标索引字符串" "资源文件名" "命令提示字符串" "命令ID" "ID类型"
"POPMENUS" "弹出菜单1(&V)"
"新建(&N)" "Mx_New" "IDB_NEW_BITMAP" "MxEdit.mrx" "" "" "ID_NEW_BUTTOM"
"打开(&O)" "Mx_OpenMxg" "IDB_OPENMXG_BITMAP" "" "" "" "ID_OPEN_BUTTOM"
"重画(&R)" "Re" "IDB_REGEN_BITMAP"
"SEPARATOR"
"实时缩放(&Z)" "ZoomR" "IDB_ZOOM_BITMAP"
"SEPARATOR"
"上一步" "ZoomP" "ID_PRVVIEW_BITMAP"
"窗口缩放(&W)" "WindowZoom" "IDB_ZOOMW_BITMAP"
"范围缩放(&E)" "ZoomE" "IDB_ZOOME_BITMAP"
"视区平移(&P)" "P" "IDB_PAN_BITMAP"
"视区旋转(&L)" "Mx_Plan" "IDB_PLAN_BITMAP" "MxEdit.mrx"
"SEPARATOR"
"鸟瞰(&D)" "DsViewer" "IDB_DSVIEWER_BITMAP"
"放大镜(&M)" "MagnifyingGlass" "IDB_MAGNIFYINGCLASS_BITMAP"
"SEPARATOR"
"视区背景色(&C)" "_ViewColor" "IDB_VIEWCOLOR_BITMAP"
"线重(&S)" "_ShowLineWeight" "IDB_LINEWEIGHT_BITMAP"
"绘图模式(&A)" "_DrawModle" "IDB_DRAWMODLE_BITMAP"
"全屏显示(&F)" "MxFullScreen" "IDB_FULLSCREEN_BITMAP"
"SEPARATOR"
"用户坐标系(&U)" "Mx_Ucs" "IDB_UCS_BITMAP" "MxEdit.mrx"
"POPMENUE"
|
4、文件中第一行是菜单文件头,每列内容如下 :
文件类型字符串 |
资源文件名(后面菜单的图标默认从该dll中加载) |
图标的透明颜色 |
位置 |
菜单名 |
"MxDrawMenuBarFile" |
"MxDraw.dll" |
(214 211 206) |
"top" |
"弹出菜单" |
“//”是文件中的注释
文件中后面每行代表一个菜单项
"POPMENUS" "对象(&O)",表示一个弹出菜单开始
"POPMENUE" 表示弹出菜单的结束
"SEPARATOR" 表示弹出菜单的分割线
5、后面每列的内容如下:
命令名称 |
点击执行的命令 |
图标索引字符串 |
资源文件名 |
命令提示字符串 |
"命令ID" |
ID类型(目前控件内部使用,一般为空) |
"新建(&N)" |
Mx_New |
"IDB_NEW_BITMAP" |
"" |
"" |
"" |
"" |
命令名称:新建(&N)。
点击执行的命令:其它语言使用DMxDrawX::RegistUserCustomCommand注册命令。
图标索引字符串:IDB_NEW_BITMAP。
资源文件名:
(1) 为空取默认资源文件名,该名称需要去掉控件版本号如:MxDraw52.dll写成MxDraw.dll,控件会根据具体情况加上这个版本号。
(2) 资源文件如是local:开头,表示是一个本地bmp文件,如:取mytoolbar.bmp做工具按钮图标:local:mytoolbar.bmp
比如:菜单图标从本地bmp文件加载:
"自定义新建(&N)" "Mx_New" "IDB_NEW_BITMAP" "local:mytoolbar.bmp"
(3)资源文件如是web:开头,表示是一个网络服务器上的bmp文件,如:取mytoolbar.bmp做工具按钮图标: web:mytoolbar.bmp
比如:菜单图标从服务器bmp文件加载,bmp文件与菜单文件在同一个服务器目录中:
"自定义新建(&N)" "Mx_New" "IDB_NEW_BITMAP" "web:mytoolbar.bmp"
命令提示字符串:为空。
命令ID:指定菜单点击后响应的命令事件id,如不为空,可以在控件的命令执行事件中响应菜单点击事件: ImplementCommandEvent。
ID类型:目前控件内部使用,一般为空。
二、响应鼠标右键事件,弹出菜单
主要用到函数说明:_DMxDrawX::TrackPopupMenu
在指定位置弹出一个菜单。详细说明如下:
参数 |
说明 |
DOUBLE dX
|
弹出菜单的位置X值,是文档坐标
|
DOUBLE dY
|
弹出菜单的位置Y值,是文档坐标
|
sMenuFile
|
菜单定义文件,支持http开头的网络路径
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
if (lType == 3)
{
// 右键按下
var ret = mxOcx.Call( "Mx_IsRuningCommand" , "" );
var sStatuIsOK = ret.AtString(0);
var sStatuIsintellisel = ret.AtString(1);
if ((sStatuIsOK == "Ok" ) && (sStatuIsintellisel != "intellisel" )){
// 在命令下运行.
var sMenu = mxOcx.GetOcxAppPath() + "\\mxpoptest.mnu" ;
mxOcx.TrackPopupMenu(dX, dY, sMenu);
// 设置1,表示鼠标事件,不再往下传递.
mxOcx.SetEventRet(1);
return ;
}
else
{
// 非命令下运行
var filter = mxOcx.NewResbuf();
var ent = mxOcx.FindEntAtPoint(dX, dY, filter);
var sPopMenu;
if (ent != null )
{
mxOcx.ClearCurrentSelect();
mxOcx.AddCurrentSelect(ent.ObjectID, true , true );
sPopMenu = mxOcx.GetOcxAppPath() + "\\MxPopMenuEnt.mnu"
}
else
{
sPopMenu = mxOcx.GetOcxAppPath() + "\\MxPopMenu.mnu"
}
mxOcx.TrackPopupMenu(dX, dY, sPopMenu);
// 设置1,表示鼠标事件,不再往下传递.
mxOcx.SetEventRet(1);
}
}
|
三、响应命令执行事件
如下:
1
2
3
4
5
6
7
|
function DoCommandEventFunc(iCmd)
{
if (iCmd == 55) {
alert( "菜单按钮点击" );
}
}
|
四、运行效果如下
1、当CAD控件视区无实体时用户右击效果:
2、当CAD控件视区有实体时用户右击实体效果:
3、当CAD控件在命令下运行时用户右击实体效果:
4、用户定义命令执行效果: