objectarx与mfc的结合

来源:互联网 发布:定时提醒休息软件 编辑:程序博客网 时间:2024/05/02 01:37

 

1、新建项目->arx项目,名称为MFClab,点击左边MFC Support,选择Extension DLL using MFC shared DLL (recommended for MFC support),再点Finish;

 

2、上步完成后解决方案应该可以看到acrxEntryPoint.cpp,DocData.cpp,MFClab.cpp,StdAfx.cpp,DocData.h,Resource.h,StdAfx.h这几个文件有MFC.rc;

 

3、双点acrxEntryPoint.cpp打开,点arx工具条上的"a>",出现ObjectARX Commands对话框,在ARX command list:列表中点右键,在右键中点New,则命令列表中多出了一行,将Localized Name里的MyCommand1改成你的命令名,这个命令名即是你以后在cad中输入的命令名,然后点OK;

 

4、加入对话框资源。点项目—>添加资源,在添加资源对话框中选Dialog,然后点新建,对话框资源就加入到了项目中。双点对话框蓝色的部份,出现MFC类向导对话框,在类名中输入类名Dialog1,基类选CDialog,其它的按默认值,点击完成,回到C++主界面;

 

5、在解决方案资源管理器中双点Dialog1.cpp(与第4步输入的对话框名相同)打开它,点菜单编辑->查找替换,查找内容为“CDialog”退第4步中的基类名,替换为"CAcUiDialog",注意这里的大小写,点全部替换;

 

6、打开Dialog1.h(与第4步输入的对话框名相同),按第5步的方法将"CDialog"替换为"CAcUiDialog",在文件的开头加上这几行#include "resource.h"

#include <dbsymtb.h>

#include <dbapserv.h>

#include <adslib.h>

#include <adui.h>

#include <acui.h>

 

7、在解决方案资源管理器中双点Dialog1.cpp(与第4步输入的对话框名相同)打开它,在文件头部有一行#include "arxMFClab.h"(与C++主窗口左上角的工程名相同),将这行删除,加上一行#include "resource.h"

 

8、在解决方案资源管理器中双点acrxEntryPoint.cpp打开它,在文件顶上加上一行#include "Dialog1.h"(与第4步中的对话框名同名),在virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {

  ............

                                   //这里加上下边一行

                   CAcModuleResourceOverride resOverride;

  return (retCode) ;

 }

 ///在ARX程序应用中,经常需要同时加载多个ARX文件,如果多个文件都含有对话框,可能就会导致某些程序无法运行,这是非常常见的问题。

  为了防止这种问题,可以在该应用程序的与工程同名的源文件中包含头文件“#include "AcExtensionModule.h"”,然后在加载对话框的函数中添加语句“CAcModuleResourceOverride resOverride;”,就可以解决这个问题

 

源文档 <http://www.365jt.com/html/CADSOFT/0121130706976.html>

 

 

9、编译应该没有错误;

,在你自已的命令函数里加上下边两行

static void arxMFClab_MyCommand1(void)

 {

  // Add your code for command arxMFClab._MyCommand1 here

 Dialog1 dlg(CWnd::FromHandle(adsw_acadMainWnd()));

///CWnd::FromHandle的解释是:

Returns a pointer to a CWnd object when given a handle to a window.

If a CWnd object is not attached to the handle, a temporary CWnd object

is created and attached.当为窗口定义句柄时返回一个指针给CWnd对象.如果CWnd对象没有附着句柄,

则临时CWnd对象被创建.

CWnd::FromHandle(adsw_acadMainWnd())只是明确指出了所创建的Dialog的父窗体是

AutoCAD Main Frame?

 

源文档 <http://bbs.mjtd.com/dispbbs.asp?BoardID=14&id=31356>

 

    int nReturnValue = dlg.DoModal();

 }

 

源文档 <http://bbs.mjtd.com/dispbbs.asp?boardID=14&ID=68938&page=10>

原创粉丝点击