马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
创建Win32项目
.
选Dll
2.右键 属性
在“配置:”下拉列表中,选择“配置”。这将确保我们所做的更改都是应用于所有的配置。 选择节点“C / c++”- >“一般”。在“附加包括目录”项中,添加路径包括ObjectARX SDK的文件夹。也将警告级别设置为1级,“检测64位可移植性问题”。这样做是为了抑制警告我们不会影响我们在这个项目中。点击“OK”按钮申请并关闭对话框。同样,当你改变了任何属性在属性页面对话框中,您可以使用“OK”按钮并关闭申请。 ->>常规.->>> 编译文件Release 把"编辑并继续"改成禁用 另外,你还可以指定为ObjectARX的头文件,并使用VC++ .NET选项对话框(在工具 - 提供>选项菜单)库文件的位置。这将确保VC ++。NET将搜索ObjectARX的头文件和库文件中的这些路径第一,因此你不必设置路径,每一个ObjectARX的项目。要设置的路径在选项对话框中的“项目”节点,选择“VC++目录”的项目。从下拉列表“选择目录为:”选择项“包含文件”。添加新项,并设置路径ObjectARX的头文件。类似地设定为库文件的路径。
单击“配置属性”节点的节点“C / C ++”上。选择项目“代码生成”。在列表中选择项目“运行时库”。通过选择下拉列表中的财产分配财产“多线程DLL(/ MD)。
选择节点“连接器” - >“输入”。在“附加依赖”项中添加以下库:
“rxapi.lib acdb17.lib acge17.lib acad.lib acedapi.lib”
接下来,选择节点“连接器” - >“常规”。在“附加库目录”的项目,增加路径的ObjectARX SDK的库文件夹。
在“输出文件”项,从“.DLL”到“.ARX”更改输出文件的扩展名。
从“项目”下拉菜单中选择“添加新项”(快捷键Ctrl+ Shift + A)。
在“添加新项”对话框中,选择项“C ++文件(的.cpp)”。
在“名称”中输入“HelloWorld”的编辑微博,然后单击“添加”添加cpp文件。
添加代码HelloWorld.cpp。
首先,我们需要包含两个ObjectARX的头文件:aced.h和rxregsvc.h。这些都为接收应用程序定义,并获得了AutoCAD的编辑器专用的服务(aced.h)的头文件,并为acrxXXX效用函数(rxregsvc.h)的标题。加入他们如下:
#include "stdafx.h"
#include <aced.h>
#include <rxregsvc.h>
接下来,我们声明两个函数:
initApp() - 这将是由AutoCAD中被调用时,我们的应用程序加载和
unloadApp() - 这在我们的应用程序被卸载时调用。
请参阅acrxEntryPoint()函数下面来看看如何将这些功能也被称为AutoCAD的。添加以下声明:
void initApp();
void unloadApp();
接下来,我们宣布我们自己的函数来打印的“Hello world!”在AutoCAD命令行。 加:
void helloWorld();
现在我们将定义initApp()函数。此功能寄存器与AutoCAD命令机制,一个新的命令。这个新的命令将成为一个额外的进入我们的应用程序:
void initApp()
{
// register a command with the AutoCAD command mechanism
acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
_T("Hello"),
_T("Bonjour"),
ACRX_CMD_TRANSPARENT,
helloWorld);
}
有关的acedRegCmds宏和addCommand()方法(AcEdCommandStack类)的详细信息,请参阅ObjectARX的联机帮助文件。 addCommand的第一个参数()是命令组名(只包括一个在我们的例子命令)。第二个参数是全球/未翻译命令名称。第三个参数是相同的命令在本地/译名。第四个参数是命令标志(注意,这里我们定义一个透明命令,这意味着该命令可以调用而另一个命令是激活的)。最后,最后一个参数是指向函数被调用我们的命令。在C ++中,这是函数名本身。
下一步我们定义unloadApp()函数。该功能将消除我们的指挥小组,这也将消除我们的命令。由于与AutoCAD注册命令成为其他入口点到我们的应用程序,这是绝对必要删除它们的应用程序卸载时。 加:
void unloadApp()
{
acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
}
接下来,我们定义我们的helloWorld()函数; acutPrintf()是重定向到AutoCAD命令行的C printf函数的等价物。 加:
void helloWorld()
{
acutPrintf(_T("\nHello World!"));
}
漂亮的基本哉!
现在,我们需要定义的最重要功能ObjectARX应用程序。所有ObjectARX应用程序有一个用于通信一个主入口点:在acrxEntryPoint()函数。请记住,ObjectARX应用程序是一个DLL,因此不具有主()入口点。 AutoCAD中调用ObjectARX的模块acrxEntryPoint()函数将消息传递给应用程序。
acrxEntryPoint的第一个参数()是AcRx类称为味精它代表从ObjectARX的内核应用程序发送的消息的数据成员。请参考有关不同消息的ObjectARX应用程序可以从AutoCAD接收信息的在线帮助。
在我们的非常简单的例子,我们需要在应用程序加载和卸载,以注册和注销我们的“你好”命令通知。在第一种情况下,我们将调用我们的initApp()函数;在第二种情况下,我们将调用我们的unloadApp()函数。
acrxEntryPoint的第二个参数()是一个不透明的手柄传递给不同的功能,例如锁定数据和解锁功能(取决于由AutoCAD的传递所述消息此数据的变化)。
默认情况下,应用程序都被锁定,这意味着一旦加载它们不能被卸载。由于我们的应用程序是非常简单的(它没有定义AutoCAD和其他应用程序是指,除了我们的命令对象),我们可以放心地解开我们的应用程序,使之卸,只要我们消除我们的命令首先,这是在我们的unloadApp实现() 功能。
而且在默认情况下,ObjectARX应用程序不是MDI知道(再次,请参阅有关MDI问题的详细信息,在线帮助)。应用程序需要显式地登记自己作为MDI知道使用acrxRegisterAppMDIAware()全局函数。
注:注册的应用程序作为MDI意识到本身并不是足够的应用是有效的MDI察觉。需要被满足的条件在ObjectARX的在线文档细节进行了描述。
由于我们的应用程序是非常简单的(它不使用文件的概念,不与AutoCAD图形数据库进行交互),我们可以放心地注册它作为MDI知道使用acrxRegisterAppMDIAware()全局函数。加:
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
acrxRegisterAppMDIAware(pkt);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
最后,我们需要导出acrxEntryPoint()函数,以便AutoCAD中可以访问它。有几种方法可以做到这一点。其中包括创建一个定义(.DEF)在接下来的主题文件中说明的。
从“项目”下拉菜单中选择“添加新项”(快捷键Ctrl+ Shift + A)。
在“添加新项”对话框中,选择项“DEF文件(.DEF)”。
编辑框:在“名称”中输入“ArxProject”。点击“打开”
添加以下信息到新的文件。所有ObjectARX应用程序拥有自营出口至少有两个功能:
acrxEntryPoint
acrxGetApiVersion。
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
我们的项目已经准备好要建。如果你已经正确地按照本教程中,你应该得0错误和0警告。
注意:您可能会收到链接器警告LNK4099为构建过程中rxapi.lib和acedapi.lib库。您可以放心地忽略这些警告。
在AutoCAD中,输入“你好”加载step01.arx运行我们的命令。
要加载step01.arx,选择这些方法之一:
只需拖动从资源管理器的文件到AutoCAD窗口。
使用AutoCAD的“ARX”命令,“加载”选项,在命令行提示符。
从工具下拉菜单在AutoCAD中,选择“加载应用程序...”选项。
使用AutoCAD命令“APPLOAD”。
一旦应用程序被加载,输入“你好”或“Bonjour”在命令行上会显示的“Hello World!”信息。
您也可以下载解决项目在Step01解决的项目。
|