明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6079|回复: 5

梦想控件中鼠标事件的响应

[复制链接]
发表于 2010-10-13 15:29:00 | 显示全部楼层 |阅读模式
 
        控件中的窗口消息处理反应器基类,用户从该类继承自己的基类,并重载相应的虚函数,在虚函数里实现对事件的处理代码,然后把基类的实例对象指针调用函数MxDraw::RegisterFilterWinMsg注册到系统中,调用MxDraw::UnRegisterFilterWinMsg反注消。
 
VC接口:
       virtual LRESULT OnViewLButtonDown(UINT nFlags,McGePoint2d point);
       virtual LRESULT OnViewLButtonUp(UINT nFlags,McGePoint2d point);
       virtual LRESULT OnViewMouseMove(UINT nFlags,McGePoint2d point);
 
       virtual LRESULT OnViewMButtonDown(UINT nFlags,McGePoint2d point);
       virtual LRESULT OnViewMButtonUp(UINT nFlags,McGePoint2d point);
       virtual LRESULT OnViewMouseWheel(UINT nFlags, short zDelta, CPoint pt);
 
       virtual LRESULT OnViewMButtonDblClk(UINT nFlags, McGePoint2d point);
 
       virtual LRESULT OnViewLButtonDblClk(UINT nFlags, McGePoint2d point);
 
       virtual LRESULT OnViewRButtonDown(UINT nFlags,McGePoint2d point);
       virtual LRESULTOnViewRButtonUp(UINT nFlags,McGePoint2d point);
参数:
     nFlags            事件标志,与Windows的鼠标事件中的nFlags是同一个值
      point            是鼠标事件发生屏幕位置,单位窗口视区坐标
    返回值           返回为0鼠标事件会继续传递,非0事件不会继续传递。
 
VC调用参考例程:
       参考例程在控件安装目录下sample\Edit\Edit.sln中,例程中,响应了鼠标左键双击事件,在双事件里,找到鼠标双击位置下的实体,得到实体信息并提示。
代码如下:
 
在对话框初化函数中,创建事件反应器,并注册到系统中
m_pWndMsg = new CWinMsg(m_hDrawOcx);
        MxDraw::RegisterFilterWinMsg(m_hDrawOcx,m_pWndMsg);
 
在对话框退出时,反注册
void CTestDlg::OnDestroy()
{
       .
       MxDraw::UnRegisterFilterWinMsg(m_hDrawOcx,m_pWndMsg);
    ..
}
 
重载鼠标双击事件函数,并加上处理代码
LRESULT CWinMsg::OnViewLButtonDblClk(UINT nFlags, McGePoint2d point)
{
 
       CPoint ptView((int)point.x,(int)point.y);
       // 把视区会标变成文档坐标
       AcGePoint3d pt = MxDraw::ViewToDocCoord(m_hOcx,ptView);
      
       double dWidth     = 1.0;
       double dHeight    = 1.0;
 
       // 得到光标拾取框的大小
       int iWidth = 6;
       MxDraw::GetCursorPickRect(m_hOcx,iWidth);
      
       dWidth   = MxDraw::ViewLongToDocCoord(m_hOcx,iWidth);
       dHeight = dWidth;
   
       // 在一点,和给定的范围内搜索实体
       AcDbObjectIdArray aryId;
       MxTools::FindEntAtPoint(pt,NULL,dWidth / 2.0,aryId);
 
       if(aryId.length() > 0)
       {
              // 找到实体后,读方式打开实体,读取信息
              AcDbObjectId entId = aryId[0];
              AcDbObjectPointer<AcDbEntity> spEnt(entId,AcDb::kForRead);
              if(spEnt.openStatus() == Acad::eOk)
              {
                     // 得到实的类名.
                     CString sClassName = spEnt->isA()->name();
           
                     // 得到实体名柄
                     AcDbHandle handle;
                     spEnt->getAcDbHandle(handle);
                     TCHAR szHandle[256];
                     handle.getIntoAsciiBuffer(szHandle);
                     // 得到实体层名
                     CString sLayerName;
                     {
                            AcDbObjectPointer<AcDbLayerTableRecord> spLayerTableRec(spEnt->layerId(),AcDb::kForRead);
                            if(spLayerTableRec.openStatus() == Acad::eOk)
                            {
                                   LPCTSTR pszLayerName = NULL;
                                   spLayerTableRec->getName(pszLayerName);
                                   sLayerName = pszLayerName;
                            }
                     }
           
                     CString sT;
                     sT.Format(_T("类名:%s,层名:%s,名柄:%s"),sClassName,sLayerName,szHandle);
 
                     AfxMessageBox(sT);
 
                     // 取消框选命令。
                     MxDraw::SendStringToExecute(m_hOcx,_T(""));
                      // 返回1 表示鼠标事件不在住下传递。
                     return 1;
              }
       }
 
       return 0;
}
 
 
 
      在MxDrawX.ocx中,响应鼠标事件MouseEventEvent来实现。
 
 
接口定义:
public MouseEventEvent(int lType, double dX, double dY, int lRet)
    AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent 的成员
参数:
lType             事件类型,详细函义如下:
 1鼠标移动,2是鼠标左键按下,
 3是鼠标右键按下,4是鼠标左键双击
 5是鼠标左键释放
 6是鼠标右键释放
 
 7是鼠标中键按下
 8是鼠标中键释放
 9是鼠标中键双击
 
 
dXdY          是鼠标事件发生屏幕位置,单位文档坐标
lRet             返回值,为0鼠标事件会继续传递,非0事件不会继续传递。
 
调用参考例程:
       参考例程在控件安装目录下sample\ CSharp\ CSharp.sln中,例程中,响应了鼠标左键双击事件,在双事件里,找到鼠标双击位置下的实体,得到实体信息并提示。
代码如下:
 
private void axMxDrawX1_MouseEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent e)
        {
            if(e.lType == 4)
            {
                // 鼠标左键双击.
                // 构建选择集,找到鼠标左建双击下的实体。
                MxDrawSelectionSet ss = new MxDrawSelectionSet();
                MxDrawResbuf filter = new MxDrawResbuf();
            
                MxDrawPoint point = new MxDrawPoint();
                point.x = e.dX;
                point.y = e.dY;
 
                ss.SelectAtPoint2(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("");
            }
     }
发表于 2010-10-15 09:23:00 | 显示全部楼层
在ARX中也可以使用钩子来响应这些事件
发表于 2014-1-7 16:20:19 | 显示全部楼层
怎么用法?没看明白
发表于 2014-5-10 11:43:22 | 显示全部楼层
请问这些源代码可以怎么找到?
发表于 2014-7-25 13:32:49 | 显示全部楼层
东西在哪里?
 楼主| 发表于 2014-7-30 10:46:44 | 显示全部楼层
去我们网上下载,www.mxdraw.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:35 , Processed in 0.175940 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表