天天看點

實作滑鼠輕按兩下事件

摘要:本文為在AutoCAD ObjectARX二次開發中遇到的滑鼠輕按兩下事件提供了多種解決方法。

在AutoCAD程式設計中,開發者可能會有這樣一個好想法,或者使用者有這麼一個需求:當用滑鼠輕按兩下某個實體的時候,彈出一個窗體,顯示實體的屬性,比如說,一所學校的名稱、座落等資訊。

(一) 在AutoCAD2000i中的實作

在AutoCAD2000i中有一個新的ObjectARX 

API專門用來處理實體的輕按兩下事件,此API基于新的ARX類AcDbDoubleClickEdit。在AutoCAD2000i中輕按兩下實體時,預設的行為是調用相應的實體定義編輯器或對象屬性管理器。如果多個實體同時被選中,在選擇集中輕按兩下實體會彈出對象屬性管理器。對于自定義實體,可以重載輕按兩下事件,改變預設行為,為此需要從AcDbDoubleClickEdit為每個要處理輕按兩下事件的實體派生類。請看下面是一個處理多義線的例子(為節省篇幅,一些代碼已經省略): #include "AcDblClkEdit.h"

class AcDbDoubleClickEditPline : public AcDbDoubleClickEdit

{

public:

...

void startEdit(AcDbEntity *pEnt,AcGePoint3d pt);

void finishEdit(void);

};

為了接受通告消息,在這個類中必需聲明兩個方法:一個是startEdit(),另一個是finishEdit()。

當應用程式被加載的時候,AcDbDoubleClickEdit類要對要處理的資料庫對象增加協定擴充,例如在InitApplication()初始化過程中增加如下的代碼:

pPlineEdit = new AcDbDoubleClickEditPline;

AcDbPline::desc()->addX(AcDbDoubleClickEdit::desc(),pPlineEdit);

同樣地,在解除安裝應用程式的時候去除資料庫對象的協定擴充,方法如下:

AcDbPline::desc()->delX(AcDbDoubleClickEdit::desc());

要使程式能夠被編譯,還必需連接配接AcDblClkEditPE.lib庫,并且在InitApplication()中增加如下的代碼:

acrxDynamicLinker->loadModule("ACDBLCLKEDITPE.ARX",Adesk::kFalse);

(二) 在AutoCAD2000和2002中的實作

在AutoCAD2000和2002中沒有AcDbDoubleClickEdit類,又如何來響應輕按兩下呢?

了解ObjectARX的朋友應該知道,Autodesk為開發者提供了反應器機制,它類似于MFC的消息處理,利用它我們可以響應輸入事件、實體添加/編輯/删除等事件。常見的AutoCAD反應器有:編輯反應器(AcEditorReactor)、實體反應器(AcDbEntityReactor)、對象反應器(AcDbObjectReactor)、圖形資料庫反應器(AcDbDatabaseReactor)、文檔管理反應器(AcApDocManagerReactor)等。

我們在這裡是利用編輯反應器來實作滑鼠輕按兩下事件的響應的,下面是實作步驟。

第一步 我們要利用向導工具派生一個新的編輯反應器類――TTCDblClkTestReactor。并重載編輯反應器的如下方法:

virtual void beginDoubleClick(const AcGePoint3d& clickPoint);

第二步 聲明一個全局TTCDblClkTestReactor對象,如下:

static TTCDblClkTestReactor *gpDblClkTest;

第三步 在應用程式初始化時建立反應器對象。

// Init this application. Register your

// commands, reactors...

void InitApplication()

{

// NOTE: DO NOT edit the following lines.

//{{AFX_ARX_INIT

AddCommand("TT", "TEST", "TEST", ACRX_CMD_TRANSPARENT | 

ACRX_CMD_USEPICKSET, TTtest);

//}}AFX_ARX_INIT

// TODO: add your initialization functions

gpDblClkTest = new TTCDblClkTestReactor(); // 建立編輯反應器對象

}

第四步 在應用程式解除安裝時從記憶體中清除反應器對象。

// Unload this application. Unregister all objects

// registered in InitApplication.

void UnloadApplication()

{

// NOTE: DO NOT edit the following lines.

//{{AFX_ARX_EXIT

acedRegCmds->removeGroup("TT");

//}}AFX_ARX_EXIT

// TODO: clean up your application

if(gpDblClkTest)

{

delete gpDblClkTest; // 清除編輯反應器對象

gpDblClkTest = NULL;

}

}

第五步 響應滑鼠事件,編寫響應代碼。

void TTCDblClkTestReactor::beginDoubleClick(const AcGePoint3d& clickPoint)

{

// 在此編寫你的滑鼠事件代碼

AfxMessageBox("這是一個測試程式!");

}

好了,看一下您的郊果吧!祝您開心!J

其實,實作滑鼠輕按兩下事件的方法還有,我這裡知道的還有:(1)利用Windows系統或AutoCAD 

Hook消息;(2)利用acedGrRead()函數。不過本人不提倡此兩種做法,原因是它們實作比較麻煩,異常控制比較難解決,也不符合面向對象程式設計的理念。當然,當你遇特殊情況時用一下也未嘗不可。

Arx