2011-04-16 18:00:44|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, ObjectArx, AutoCAD|来源:唯设编程网
以下我们将分五部分对在ARX中使用动态链接的MFC库进行讨论
首先在项目选项中选“MFC AppWizard(DLL)”,然后选Regular DLL using shared MFC DLL,然后输入项目名
在“Project Settings”对话框中“General”标签项中“Microsoft Foundation Classes ”域选“Use MFC ina Shared DLL for the field.”
删除由AppWizard所建立的.cpp、.h项目文件,把arxmfcdll.cpp和resourcehelper.h加入到项目中(在Object ARX SDK中objectArxutilsmfcextras目录下)
在Link标签项中,“General”栏“Output file name”项输入编译后的应用程序名,后缀为.arx
在Link标签项中,“Output”栏,“Base address”项输入“0x1c000000”,“Entry-point symbol”项输入“DllEntryPoint@12”
在C/C++标签项中,“Code Generation”栏“Use Run-time library”项选“Multithread DLL”
在C/C++标签项中,“Preprocessor”栏中定义_WINDLL,_AFXDLL
为了执行DLL初始化,在acrxEntryPoint()函数中应当调用DllMain()函数,方法如下所示:
extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* ) { switch( msg ) { case AcRx::kInitAppMsg: DllMain(_hdllInstance, DLL_PROCESS_ATTACH, NULL); file://加入特定的应用初始化代码 break; case AcRx::UnloadAppMsg: DllMain(_hdllInstance, DLL_PROCESS_DETACH, NULL); break; default; break; } return AcRx::kRetOK; }
开发者只需按前面所述的方法进行设置则以上工作均无需开发者介入,开发者只需加入相应的用户函数即可。
在ARX应用与AutoCAD和其它应用程序使用共享的MFC库时,资源管理变得极为重要。你必须清晰得管理好你的应用程序资源,防止它与AutoCAD或其它ARX应用程序的资源发生冲突。清晰地资源设置一般包括以下三步:
在执行任何导致MFC查找你的资源的步骤时调用函数AfxSetResourceHandle()将自定义资源设为系统缺省值。
在将系统资源设为你的应用资源以前,调用AfxGetResourceHandle()函数获得系统当前资源。
在执行完任何要求使用自定义资源的函数之后,立刻将系统资源还原为以前保存的资源句柄。
在应用程序对话框命令句柄需调用要求获得AutoCAD资源的AutoCAD API函数(或调用AutoCAD命令)时,我们应当首先在调用函数前将资源设为AutoCAD,然后函数执行完后再恢复应用程序资源 (acedGetAcadResourceInstance()函数可获得AutoCAD的资源句柄)。为使资源管理更简单我们使用了一个C++类 CtemporaryResourceOverride(objectarxutilsmfcextras目录下可找到),在该类的一个对象建立时, 对象将系统资源设为你的应用资源,对象删除时,析构函数自动将资源设为系统资源。
CtemporaryResourceOverride声明请查阅objectarxutilsmfcextras目录下的afxmfcdll.cpp文件。
假设现在要在一对话框中按下“OK”按钮后绘制一圆,则利用MFC的ARX应用实现为先利用ClassWizard加入对象ID为ON_OK的消息映射,然后编辑代码
void CDiaTest::OnOK() { HINSTANCE hin_new; hin_new=acedGetAcadResourceInstance(); file://获得ACAD的资源 CTemporaryResourceOverride *jxs; file://定义新对象 jxs=new CTemporaryResourceOverride(hin_new) ;//为jxs分配内存,并初始化 createCircle();//画圆 delete jxs;//删除对象 CDialog::OnOK(); } AcDbObjectId createCircle() { AcGePoint3d center(9.0, 3.0, 0.0); AcGeVector3d normal(0.0, 0.0, 1.0); AcDbCircle *pCirc = new AcDbCircle(center, normal, 2.0); AcDbBlockTable *pBlockTable; acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord; pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pBlockTable->close(); AcDbObjectId circleId; pBlockTableRecord->appendAcDbEntity(circleId, pCirc); pBlockTableRecord->close(); pCirc->close(); return circleId; }
ARX应用程序的升级
使用MFC的ARX应用要想在新版AutoCAD中使用必须进行升级,具体步骤如下:
定义_WINDLL和_AFXDLL
使用“multithreaded DLL runtime library”(发布版)
移走现有的ARX-MFC摸板
移走现有的DLL MFC初始化代码
移走任何CwinApp类的派生对象
把arxmfcdll.cpp和resourcehelper.h加入项目,并作相应调整 (这两个文件都在ObjectARX SDK目录 objectarxutilsmfcextras内)
作者在正进行的模具CAD系统的开发中使用了ARX与MFC结合编程的方法,实践证明一方面利用MFC进行Windows风格的编程,另一方面利用ARX 提供的类和函数深入到AutoCAD系统内部,实现系统功能要求,大大的提高了开发效率,无疑这是AutoCAD开发者们的最佳选择。