控件中的窗口消息处理反应器基类,用户从该类继承自己的基类,并重载相应的虚函数,在虚函数里实现对事件的处理代码,然后把基类的实例对象指针调用函数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是鼠标中键双击
dX,dY 是鼠标事件发生屏幕位置,单位文档坐标
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("");
}
} |