一、鼠标事件

_DMxDrawXEvents::MouseEvent

控件中的鼠标事件。

参数 说明

LONG lType

事件类型,1鼠标移动,2是鼠标左键按下,3是鼠标右键按下,4是鼠标左键双击 5是鼠标左键释放 6是鼠标右键释放 7是鼠标中键按下 8是鼠标中键释放 9是鼠标中键双击 10是鼠标中键滚动

DOUBLE dX

事件发生时的鼠标X坐标,文档坐标

DOUBLE dY

事件发生时的鼠标Y坐标,文档坐标

LONG* lRet

lRet 返回非0,消息将不在往下传递

响应鼠标点击图片对象js代码:

var draw = document.getElementById("MxDrawXCtrl");
      draw.ImplementMouseEventFun = function MouseEvent(dX, dY, lType) { 
             if(lType == 2)
                {    
                  // 鼠标左键按下
         
                   // dTol是搜索范围,50是屏幕像素.
                    var dTol = 50;        
                    // 临时修改CursorWidth的大小,用FindEntAtPoint函数确定搜索范围.
                   var bak = draw.CursorWidth;
                    draw.CursorWidth = dTol;        
                    // 搜索过滤条件,只选择图片.
                    var filter = draw.NewResbuf();        
                    // MxImageMark是图片对象的DXF组码名称,5020在DXF组码,代表MxImageMark是对象类型.
                    filter.AddStringEx("MxImageMark",5020);        
                     // 查找鼠标点击的实体。                        
                     var ent = draw.FindEntAtPoint(dX,dY,filter);        
                      // 恢复光标拾取框的大小.
                        draw.CursorWidth = bak;                       
                         if(ent != null)
                        {
         
                            alert("点击了一个图片");
                            // 设置1,表示鼠标事件,不再往下传递.
                            mxOcx.SetEventRet(1);
                        }
         
                        //
         
         
                    };
                };

提示鼠标双击下被点击的实体C#代码:

if (e.lType == 4)
{
    // 鼠标左键双击.
    // 构建选择集,找到鼠标左建双击下的实体。
  
    MxDrawSelectionSet ss = new MxDrawSelectionSet();
    MxDrawResbuf filter = new MxDrawResbuf();
    filter.AddStringEx("LINE",5020);
    MxDrawPoint point = new MxDrawPoint();
    point.x = e.dX;
    point.y = e.dY;
    ss.SelectAtPoint(point, filter);
    if (ss.Count > 0)
    {
        MxDrawEntity ent = ss.Item(0);
        MessageBox.Show("点击了" + ent.ObjectName + "对象");
        /*
        if (ent is MxDrawLine)
        {
            MxDrawLine line = (MxDrawLine)ent;
        }
            */
    }
    e.lRet = 1;
    // 取消后面的命令。
    axMxDrawX1.SendStringToExecute("");
}

提示鼠标双击下被点击的实体js代码:

function MouseEvent(dX,dY,lType)
{    if(lType == 4)
    {
               
        var mxOcx = document.getElementById("MxDrawXCtrl");
        var ss = mxOcx.Call("Mx_NewSelectionSet","");
        var pt = mxOcx.Call("Mx_NewPoint","");
                var fil = mxOcx.Call("Mx_NewResbuf","");
        pt.x = dX;
                pt.y = dY;
                
                ss.SelectAtPoint2(pt,fil);        
            if(ss.Count > 0)
                {
                    var ent = ss.Item(0);
                    alert("点击了" + ent.ObjectName + "对象");
                }
        // 取消后面的命令。
            mxOcx.SendStringToExecute("");
        return 1;
        
        }
     
       
    return 0;
}

在指定位置弹出一个菜单:

主要用到函数说明:

_DMxDrawX::TrackPopupMenu

在指定位置弹出一个菜单。详细说明如下:

参数 说明

DOUBLE dX

弹出菜单的位置X值,是文档坐标

DOUBLE dY

弹出菜单的位置Y值,是文档坐标

sMenuFile

菜单定义文件,支持http开头的网络路径

_DMxDrawX::FindEntAtPoint

在某点位置处查找实体。详细说明如下:

参数 说明

DOUBLE dX

点X值,文档坐标

DOUBLE dY

点Y值,文档坐标

IDispatch* pFilter

过滤条件

响应鼠标右键事件,弹出菜单c#代码如下:

        private void axMxDrawX1_MouseEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent e)
        {
            if (e.lType == 3)
            {
                // 右键按下
                string sCmd = ""  ;
                if (axMxDrawX1.IsRuningCommand(ref sCmd))
                {
                    // 在命令下运行.
                    String sMenu = axMxDrawX1.GetOcxAppPath() + "\\mxpoptest.mnu";
                    axMxDrawX1.TrackPopupMenu(e.dX, e.dY, sMenu);
                    // 设置1,表示鼠标事件,不再往下传递.
                    axMxDrawX1.SetEventRet(1);
 
                }
                else
                {
                    // 非命令下运行
                    MxDrawXLib.MxDrawResbuf filter = new MxDrawXLib.MxDrawResbuf();
                    MxDrawXLib.MxDrawEntity ent = (MxDrawXLib.MxDrawEntity)axMxDrawX1.FindEntAtPoint(e.dX, e.dY, filter);
 
                    String sPopMenu;
                    if(ent != null)
                    {
                        axMxDrawX1.ClearCurrentSelect();
                        axMxDrawX1.AddCurrentSelect(ent.ObjectID,true,true);
 
                        sPopMenu = axMxDrawX1.GetOcxAppPath() + "\\MxPopMenuEnt.mnu";
                    }
                    else
                    {
                        sPopMenu = axMxDrawX1.GetOcxAppPath() + "\\MxPopMenu.mnu";
                    }
 
 
                    axMxDrawX1.TrackPopupMenu(e.dX, e.dY, sPopMenu);
                    // 设置1,表示鼠标事件,不再往下传递.
                    axMxDrawX1.SetEventRet(1);
                }
 
            }
        }

响应命令执行事件,如下:

 private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
        {
            if(e.iCommandId == 99)
            {
                MessageBox.Show("用户定义命令执行....");
            }
             
         }

js中使用如下:

                    function MouseEvent(dX, dY, lType) {                    
                    if(lType == 3)
                    {                        
                    // 鼠标右键按下
                        var filter = mxOcx.NewResbuf();                        
                        // 5020 = RTDXF0,只选择直线实体,设置过滤条件
                        //filter.AddStringEx("LINE",5020);
 
                        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);
                        }
                    }

求面积

将此段js代码放入鼠标事件中:

// 得到鼠标位置
var point = mxOcx.NewPoint();
point.x = dX;
point.y = dY;
// 构造择集,得到鼠标所在闭合区域。
 
// 设置过滤条件
var filter = mxOcx.NewResbuf();
// 设置PL线为过滤条件
filter.AddStringEx("LWPOLYLINE", 5020);
 
// 选择范围左下角
var pt1 = mxOcx.NewPoint();
pt1.x = point.x - 100;
pt1.y = point.y - 100;
// 选择范围右上角
 
var pt2 = mxOcx.NewPoint();
pt2.x = point.x + 100;
pt2.y = point.y + 100;
 
// 选择pt1,pt2所在范围内的对象.
var ss =mxOcx.NewSelectionSet();
ss.Select(1, pt1, pt2, filter);
 
for (var i = 0; i < ss.Count; i++)
{
    // 遍历所有对象,看当前点是在那个闭合区域内
    var pl =ss.Item(i);
    var dArea = pl.GetArea2 ();
    alert("面积为:" + dArea.toString());
 
}

C#计算鼠标点位置的闭合pl线的面积:

  
    private void axMxDrawX1_MouseEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent e)
            {                
            if (e.lType == 4)
                 
                {                    
                // 是鼠标左键双击
                     
                // 得到鼠标位置
          
                    MxDrawPoint point = new MxDrawPoint();
                    point.x = e.dX;
                    point.y = e.dY;                    
                    // 构造择集,得到鼠标所在闭合区域。
                    // 设置过滤条件
                    MxDrawResbuf filter = new MxDrawResbuf();                    
                    // 设置PL线为过滤条件
                    filter.AddStringEx("LWPOLYLINE", 5020);                    
                    // 选择范围左下角
                    MxDrawPoint pt1 = new MxDrawPoint();
                    pt1.x = point.x - 100;
                    pt1.y = point.y - 100;                    
                    // 选择范围右上角
                    MxDrawPoint pt2 = new MxDrawPoint();
                    pt2.x = point.x + 100;
                    pt2.y = point.y + 100;                    
                    // 选择pt1,pt2所在范围内的对象.
                    MxDrawSelectionSet ss = new MxDrawSelectionSet();
                    ss.Select(MCAD_McSelect.mcSelectionSetCrossing, pt1, pt2, filter);                    
                    for (int i = 0; i < ss.Count; i++)
                    {                        
                    // 遍历所有对象,看当前点是在那个闭合区域内
                        MxDrawPolyline pl = (MxDrawPolyline)ss.Item(i);                        
                        // 得到闭合区域的点坐标。
                        MxDrawPoints pts = new MxDrawPoints();                        
                        for (int j = 0; j < pl.NumVerts; j++)
                        {
                            MxDrawPoint pt = pl.GetPointAt(j);
                            pts.Add(pt.x, pt.y, pt.z);
                        }                        if (pts.Count < 3)                            
                        continue;                        
                        // 判断鼠标点,是不是在这个闭合的区域内.
 
                        MxDrawUtility utility = new MxDrawUtility();                        
                        if (utility.PointInPolyline(pts, point.x, point.y))
                        {                            
                        // 找到用户点击的闭合区域 
                            double dArea = 0.0;
                            pl.GetArea(out dArea);                            
                            // 对选择的区域填充
                            for (int k = 0; k < pts.Count; k++)
                            {
                                MxDrawPoint tmp = pts.Item(k);                                
                                if(k == 0)
                                    axMxDrawX1.PathMoveTo(tmp.x, tmp.y);                                
                                    else
                                    axMxDrawX1.PathLineTo(tmp.x, tmp.y);
                            }
 
                            axMxDrawX1.DrawCADColorIndex = 3;
                            axMxDrawX1.DrawPathToHatch(0.0);
                            axMxDrawX1.UpdateDisplay();
 
                                MessageBox.Show("面积为:" + dArea.ToString());
 
                            e.lRet = 1;                            
                            // 取消后面的命令。                            
                            axMxDrawX1.SendStringToExecute("");                            
                            break;
                        }
                    }
 
                }
            }

二、超链接事件

_DMxDrawXEvents::HyperlinkClick

有超连接的实体被点击了。

参数 说明

IDispatch* pEntity

IMxDrawEntity,被点击的实体

DOUBLE dX

点击位置X,文档坐标

DOUBLE dY

点击位置Y,文档坐标

LONG* pRet

成功,返回1, *pRet = 1

js代码实现:

 document.getElementById("MxDrawXCtrl").ImpHyperlinkClickFun = DoHyperlinkClickFun;
 
                function DoHyperlinkClickFun(ent, dX, dY) {
                    mxOcx.GotoURL(ent.Hyperlinks);
                    mxOcx.SetEventRet(1);
                }

三、动态拖放时的绘制事件

_DMxDrawXEvents::DynWorldDraw

动态拖放时的绘制事件。详细说明如下:

参数 说明

DOUBLE dX

当前鼠标位置X坐标

DOUBLE dY

当前鼠标位置Y坐标

IDispatch* pWorldDraw

IMxDrawWorldDraw对象,用于动态绘制

IDispatch* pData

IMxDrawCustomEntity对象,动态绘制数据

JS调用代码,动态插入一个图块:

  
    function DoInsert()
    {
        var mxOcx = document.all.item("MxDrawXCtrl1");
        var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
        getPt.message ="点取插入点";
        if(getPt.go() != 1)
        {
            return;
        }
 
        var frstPt =getPt.value();
        if(frstPt == null)
        {
 
            return;
        }
 
 
        var  getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
 
        var spDrawData =getSecondPt.InitUserDraw("TestDynDraw");
 
 
        getSecondPt.message = "点取旋转角度";
        getSecondPt.basePoint = frstPt;
        getSecondPt.setUseBasePt(true);
 
        spDrawData.SetPoint("pt1",frstPt);
 
 
        var sBlkName = "Tree";
        var sBlkFile = mxOcx.GetOcxAppPath() + "\Blk\树.dwg";
 
        mxOcx.InsertBlock(sBlkFile,"Tree");
 
        spDrawData.SetString("BlkName","Tree");
 
        if(getSecondPt.go() != 1)
        {
 
            return;
        }
 
        spDrawData.Draw();
    }
 
    function DoDynWorldDrawFun(dX,dY,pWorldDraw,pData)
    {
 
        var mxOcx = document.all.item("MxDrawXCtrl1");
        var sGuid = pData.Guid;
 
        mxOcx.SetEventRet(0);
        if(sGuid = "TestDynDraw")
        {
            // 动态插入图块。
            var firstPt =  pData.GetPoint("pt1");
            if(firstPt == null)
                return;
 
            var sBlkName =  pData.GetString("BlkName");
 
            var secondPt = mxOcx.NewPoint();
 
            secondPt.x = dX;
            secondPt.y = dY;
 
            var vec = firstPt.SumVector(secondPt);
            var dAng = vec.Angle();
 
            pWorldDraw.DrawBlockReference(firstPt.x,firstPt.y,sBlkName,1.0,dAng * 180.0 / 3.14159265 + 90.0);
 
            mxOcx.SetEventRet(1);
        }
 
    }

梦想CAD控件事件COM接口知识点的更多相关文章

  1. 梦想CAD控件图层COM接口知识点

    梦想CAD控件图层COM接口知识点 一.新建图层 主要用到函数说明: _DMxDrawX::AddLayer 增加新的图层.详细说明如下: 参数 说明 BSTR pszName 图层名 c#中实现代码 ...

  2. 梦想CAD控件文字COM接口知识点

    一.参数绘制文字 在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOU ...

  3. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

  4. 如何在网页中浏览和编辑DWG文件 梦想CAD控件

    如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 201 ...

  5. 梦想CAD控件COM接口自定义命令

    在CAD软件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处下载演示实例. _DMxDrawX::RegistUserCustomCommand 向CAD控件注 ...

  6. 梦想CAD控件,用于浏览和编辑DWG文件,在脱离AUTOCAD的情况下独立运行,相当于简易CAD

    (百度百科连接) 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常 ...

  7. 梦想CAD控件网页版关于自定义命令

    在CAD控件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处在线演示. _DMxDrawX::RegistUserCustomCommand 向CAD控件注册一 ...

  8. 梦想CAD控件网页版搜索图面上的文字

    在网页中查找到CAD控件图纸上的文字.点击此处在线演示. 主要用到函数说明: _DMxDrawX::NewSelectionSet 实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数. _DM ...

  9. 梦想CAD控件安卓界面控制

    CAD控件界面上所有元素都可以控制显示或隐藏,下面将逐一介绍详细用法. 设置工具文件 MxFunction.setToolFile 设置工具文件.详细说明如下: 参数 说明 String sFile ...

随机推荐

  1. 关于mysql建立索引 复合索引 索引类型

    这两天有个非常强烈的感觉就是自己在一些特别的情况下还是hold不住,脑子easy放空或者说一下子不知道怎么去分析问题了,比方,问"hash和btree索引的差别",这非常难吗.仅仅 ...

  2. Python爬虫开发【第1篇】【HTTP与HTTPS请求与响应】

    一.HTTP.HTTPS介绍 HTTP协议(超文本传输协议):一种发布.接收HTML页面的方法 HTTPS协议:简单讲是HTTP安全版,在HTTP下加入SSL层 SSL(安全套接层),用于WEB的安全 ...

  3. Python常用数据处理函数

    1.基本统计特征函数 方法名 函数功能 所属库 使用格式 sum() 计算数据样本综合(按列计算) Pandas D.sum() mean() 计算数据样本算数平均数 Pandas D.mean() ...

  4. salt-stack "No Top file or external nodes data matches found"解决

    salt-stack在配置分组时提示如下信息: No Top file or external nodes data matches found 后来在官网上找到如下提示,意思是需要重启master服 ...

  5. 【bzoj1452】[JSOI2009]Count

    二维树状数组 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...

  6. Analyzing with SonarScanner for MSBuild

    https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild Features The So ...

  7. android 使用AlarmManager定时启动service

    private static AlarmManager am; private static PendingIntent pendingIntent; /** * 使用 AlarmManager 来 ...

  8. 怎么样关掉红米note开发者选项

    进 系统设置\应用 ,找到“设置”点进去,清一下数据,再打开“设置”查看,就没有“开发者选项”了

  9. Redis: Redis on Windows Setup

    ylbtech-Redis: Redis on Windows Setup 1.返回顶部 1. 2. 3. 4. 5. 6. 7. 8. 9. 2.返回顶部   3.返回顶部   4.返回顶部   5 ...

  10. 1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)

    1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 935  Solved: 55 ...