?? 11.txt
字號:
使用Visual C++創建ARX程序
本小節通過一個簡單的實例來講述ARX程序的創建過程,介紹編制Object ARX程序的一些基本步驟和原則,并初步了解ARX程序與AutoCAD進行通訊的方式。如同學習其它計算機語言一樣,我們首先來創建一個最簡單的ARX程序—“Hello.ARX”,在AutoCAD 2002中加載并運行該程序,將會在命令行出現-“Hello, ObjectARX!”。
38.2.1 建立ARX程序的基本步驟
由于ARX程序是一種可以共享AutoCAD地址空間并對AutoCAD進行直接調用的動態鏈接庫,因此應該按照下列基本步驟建立ARX程序:
(1) 創建自定義類來實現新的命令:用戶可以從ARX類層次關系中的大多數類和符號表類中派生自己的類。
(2) 決定ARX程序應該響應的AutoCAD消息:AutoCAD通過向ARX程序發出一系列的消息指明在它內部發生的特殊事件,ARX程序必須對其中的某些消息作出反映,并觸發相應的操作。
(3) 實現應用程序與AutoCAD通信的入口:AutoCAD通過函數acrxEntryPoint()來調用ARX程序,而不是象普通的C++程序那樣使用main()函數。函數acrxEntryPoint()中可以用switch語句處理AutoCAD的各種返回信息,根據不同信息執行不同的函數,并返回狀態碼。如果針對特定的消息返回出錯代碼,則必須用case語句來處理。最后,必須用AcRx::kRetOk作為函數acrxEntryPoint()的最終返回值。
(4) 完成ARX程序的初始化:用戶必須在acrxEntryPoint()函數的AcRx::kInitAppMsg事件中或者該事件調用的函數(例如:initApp()函數)中,對程序中自定義的所有類進行初始化,然后調用acedRegCmds->addCommand()函數在AutoCAD命令堆棧中注冊新命令。
(5) 實現卸載(Unload)功能:用戶必須在acrxEntryPoint()函數的AcRx:: kUnloadAppMsg事件中或者該事件調用的函數(例如:unloadApp()函數)中,調用acedRegCmds->removeGroup()函數將initApp()函數中注冊的新命令組從AutoCAD命令堆棧中清除,調用deleteAcRxClass()函數清除程序中自定義的任何類,然后刪除所有由應用程序添加到AutoCAD中的對象,并清除所有與AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor對象相關聯的事件反應器。
注意 缺省情況下,ARX程序處于被鎖定狀態而不能被卸載,如果要使ARX程序可以被卸載,需保存由AcRx::kInitAppMsg傳送的appId參數,由unlockApplication()函數調用,見acrxEntryPoint ()函數注釋。
38.2.2 AutoCAD與ARX程序之間的消息傳遞
AutoCAD向ARX程序發送四類消息:
(1) 發送給所有ARX程序的消息:kInitAppMsg、kUnloadAppMsg、kLoadDwgMsg、kPreQuitMsg。
(2) 只發送給通過調用acedDefun() 函數注冊AutoLISP函數的ARX程序的消息:kUnloadDwgMsg、kInvkSubrMsg、kEndMsg、kQuitMsg、kSaveMsgkCfgMsg。
(3) 只發送給注冊service對象的ARX程序的消息:kDependencyMsg、kNoDependencyMsg。
(4) 只發送給使用ActiveX控件對象的ARX程序的消息:kOleUnloadAppMsg。
普通的ARX程序僅需要響應消息kInitAppMsg和kUnloadAppMsg,這兩種消息的含義和ARX程序對它們的響應方式為:
(1) 消息kInitAppMsg:當AutoCAD 加載ObjectARX應用程序并開始進行與應用程序的通信時發送此消息。
對于此消息,ARX程序應該注冊服務對象、類、AcEd命令和事件反應器,以及AcRxDynamicLinker類事件反應器,初始化應用程序的系統資源(如設備、窗口),并執行簡單的初始化操作;這時,AcRx、AcEd和AcGe類庫都應該被激活;如果需要對應用程序進行解鎖或重新加鎖操作,還應該保存pkt參數。
但是這里不能進行下列操作:初始化設備驅動程序、激活用戶界面資源、按特殊順序加載應用程序、執行AutoLISP程序以及打開任何數據庫,否則將導致錯誤發生或者系統崩潰;AcDb和AcGi類庫也不能在這里激活,盡管它們與AcRx 和其它結構有聯系。
(2) 消息kUnloadAppMsg:當ObjectARX程序被卸載時(由用戶卸載或者AutoCAD程序終止時),AutoCAD發送此消息,關閉當前文件并執行清除操作。
對于此消息,ARX程序應該清除所有系統資源,所有對kInitAppMsg消息所做的初始化等工作都應該在這里被終止或者析構。AutoCAD不會自動解除初始化所做的工作。
38.2.3 實例1 最簡單的ARX程序——“Hello.ARX”
Hello.ARX是最簡單的ARX程序,但是麻雀雖小,五臟俱全,它是進一步學習編寫復雜程序的基礎,現在請大家和我來一步步的完成它,具體過程如下:
Step 1 創建工程
(1) 運行Visual C++ 6.0,選擇菜單命令【File】→【New…】,彈出“New”對話框。
(2) 在“New”對話框中選擇“Projects”選項卡。
(3) 在“Projects”選項卡中選擇“Win32 Dynamic-Link Library”項。
(4) 輸入程序名稱“Hello”和存放目錄,并確認“Platforms:”內選中“Win32”。
(5) 完成以上步驟后(如圖38-2所示),單擊OK按鈕,并在下一提示對話框中單擊Finishig按鈕來建立一個空的DLL工程。
Step 2 建立源文件“Hello.cpp”
(1) 選擇菜單命令【File】→【New…】,彈出“New”對話框。
(2) 在“New”對話框中選擇“Files”選項卡。
(3) 在“Files”選項卡中選擇“C++ Source File”項。
(4) 輸入源文件名稱“Hello.cpp”和存放目錄,確認“Add to project:”項被選中,并選擇加入的工程為“Hello”。
(5) 完成以上步驟后(如圖38-3所示),單擊OK按鈕確定。
(6) 在Visual C++的工作窗口中輸入源文件“Hello.cpp”的內容并保存,程序清單如下:
// Hello.cpp
#include <rxregsvc.h>
#include <aced.h>
#include <ADSLib.h>
// 執行函數,在AutoCAD中執行Hello命令時被調用
void Hello()
{
acutPrintf("Hello, Object ARX!");
}
// 初始化函數
// 在acrxEntryPoint()函數的kInitAppMsg事件中被調用,
// 向AutoCAD命令堆棧中添加新命令組以及ACRX類層次
// 中添加新的自定義類,本實例中無自定義類,故不用初始化新類
void initApp()
{
//顯示提示信息
acutPrintf("\n初始化函數\n");
// addCommand函數在AutoCAD命令堆棧中注冊
// 新的命令組名“HelloARX_COMMANDS”、
// 通用命令名“Hello”、
// 本地命令名“Hello”和該命令的執行函數Hello()
acedRegCmds->addCommand("HelloARX_COMMANDS","Hello","Hello",
ACRX_CMD_MODAL,Hello);
}
// 程序卸載函數
// 在acrxEntryPoint()函數的kUnloadAppMsg事件中被調用
// 從AutoCAD命令堆棧清除已添加的命令以及從ACRX類層次中清除自定義類
void unloadApp()
{
// 顯示提示信息
acutPrintf("\n卸載函數\n");
// 從命令堆棧中清除命令組“HelloARX_COMMANDS”
acedRegCmds->removeGroup("HelloARX_COMMANDS");
}
// ARX程序主函數
// 與AutoCAD通信的入口,處理AutoCAD發送的各類消息
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
//調用initApp()函數
initApp();
break;
case AcRx::kUnloadAppMsg:
//調用unloadApp()函數
unloadApp();
}
return AcRx::kRetOK;
}
Step 3 建立源文件“Hello.def”
重復Step 2中步驟,建立源文件“Hello.def”,
程序內容如下:
LIBRARY HelloARX
DESCRIPTION 'The simplest ObjectARX sample program - Hello'
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
Step 4 設置ObjectARX文件路徑
(1) 選擇菜單命令【Tools】→【Options…】,彈出“Options”對話框。
(2) 在“Options”對話框中選擇“DirectorIEs”選項卡。
(3) 在“Show directories for:”下拉列表中選擇“Include files”項。
(4) 在“Directories:”列表的空白項中添加ObjectARX中“Inc”目錄的路徑(如圖38-4所示)。
(5) 在“Show directories for:”下拉列表中選擇“Library files”項。
(6) 在“Directories:”列表的空白項中添加ObjectARX中“Lib”目錄的路徑(如圖38-5所示)。
Step 5 ObjectARX工程設置
(1) 選擇菜單命令【Project】→【Settings…】,彈出“Project Settings”對話框。
(2) 在“Project Settings”對話框中選擇“Setting For:”下拉列表的“All Configurations”項。
(3) 在“Project Settings”對話框中選擇“C/C++”選項卡。
(4) 在“Category:”下拉列表中選擇“Code Generation”項。然后選中“Use run-time library”下拉列表中的“Multithreaded DLL”選項(如圖38-6所示)。再在“Category:”下拉列表框中選擇“Preprocessor”項,然后在“Preprocessor definitions:”編輯框中內容的后面添加“ACRXAPP,RADPACK”,表示需要預鏈接的庫(如圖38-7所示)。
(5) 在“Project Settings”對話框中選擇“Link”選項卡。
(6) 在“Category:”下拉列表中選擇“General”項,然后在“Output file name:”編輯框中鍵入應用程序名“.\HelloARX.arx”(圖38-8);在“Object/library modules:”編輯框中添加“acutil15.lib acrx15.lib acdb15.lib acedapi.lib rxapi.lib acad.lib acge15.lib”;在“Category:”下拉列表框中選擇“Output”項,然后在“Base address:”編輯框中鍵入“0x1c000000”(圖38-9)。
(7) 完成上述步驟后,單擊OK按鈕確定設置。
Step 6 編譯和建立ARX程序
選擇菜單命令【Build】→【Build HelloARX】,編譯和建立Hello.arx程序。
Step 7 加載并運行ARX程序
(1) 在AutoCAD 2002環境中,選擇菜單命令【Tools(工具)】→【Load Application…(加載應用程序)】,彈出“Load/Unload Applications(加載/卸載應用程序)”對話框。
(2) 選中“Hello.arx”文件,單擊Load...按鈕。
(3) 單擊Close按鈕返回AutoCAD主窗口。
(4) 在命令行中輸入命令“Hello”,將在命令行中出現“Hello, Object ARX!”。
(5) 如果需要卸載程序,則再彈出“Load/Unload Applications(加載/卸載應用程序)”對話框,如圖38-10所示。在“Loaded Applications(已加載應用程序)”選項卡內選擇“Hello.ARX”程序,單擊Unload按鈕,則該程序被卸載。
實例說明
1. 在AutoCAD 2002中還可通過“appload”和“arx”命令來載入或卸載ARX程序。
2. ARX程序還可在AutoCAD啟動時加載。編輯AutoCAD初始加載文件acad.rx,指定需要在啟動時加載的ARX程序名稱。
小 結
本章主要介紹了ObjectARX的概念和作用,并通過一個最簡單的ARX應用程序實例,介紹了Object ARX程序的基本結構、AutoCAD與ARX應用程序之間的消息傳遞機制、建立ARX應用程序的基本步驟,以及如何在AutoCAD中使用ARX程序。
上一篇: 了解AutoCAD 2006 Beta2新特性
下一篇: AutoCAD中“布局”的使用
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -