一、鼠标事件


SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

_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);          }        }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄