(续)arx随cad的启动一起加载
(续)arx随cad的启动一起加载
(续)
上次已经说了如何通过手工修改注册表来使得arx程序随着cad的启动而被加载.这次主要是介绍如何通过一个可执文件来修改注册表,并且相应的启动autocad.这样我们就可以不用手动去加载arx了,直接可以用arx的命令.
首先打开工程
新建一个名为test2的mfc工程,对话框界面(根据你自己的爱好来选择!),其它选项默认。
test2.cpp文件的代码如下:
#include "stdafx.h"
#include "test2.h"
#include "textprogressctrl.h" //一个进度条
#include <atlbase.h> //这个头文件跟注册表的操作有关!
#ifdef _debug
#define new debug_new
#undef this_file
static char this_file[] = __file__;
#endif
/////////////////////////////////////////////////////////////////////////////
// ctest2app
begin_message_map(ctest2app, cwinapp)
//{{afx_msg_map(ctest2app)
// note - the classwizard will add and remove mapping macros here.
// do not edit what you see in these blocks of generated code!
//}}afx_msg
on_command(id_help, cwinapp:

nhelp)
end_message_map()
/////////////////////////////////////////////////////////////////////////////
// ctest2app construction
ctest2app::ctest2app()
{
// todo: add construction code here,
// place all significant initialization in initinstance
}
/////////////////////////////////////////////////////////////////////////////
// the one and only ctest2app object
ctest2app theapp;
/////////////////////////////////////////////////////////////////////////////
// ctest2app initialization
bool ctest2app::initinstance()
{
afxenablecontrolcontainer();
// standard initialization
// if you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
//
// #ifdef _afxdll
// enable3dcontrols(); // call this when using mfc in a shared dll
// #else
// enable3dcontrolsstatic(); // call this when linking to mfc statically
// #endif
//============这是原来的代码(start)============================//
// ctest2dlg dlg;
// m_pmainwnd = &dlg;
// int nresponse = dlg.domodal();
// if (nresponse == idok)
// {
// // todo: place code here to handle when the dialog is
// // dismissed with ok
// }
// else if (nresponse == idcancel)
// {
// // todo: place code here to handle when the dialog is
// // dismissed with cancel
// }
//============这是原来的代码(end)============================//
//===============我的启动界面仅有一个进度条============================//
ctextprogressctrl myctrl;
// create a child progress control.
cwnd*pwnd = cwnd::fromhandle(getdesktopwindow());
myctrl.create(ws_child|ws_visible|ws_border, crect(10,10,500,50), pwnd,1);
// advance the position to the next step.
myctrl.setrange(0,100);
myctrl.stepit();
myctrl.showwindow(sw_show);
myctrl.centerwindow(pwnd);
for (int i=0;i<100;i++)
{
myctrl.setpos(i);
sleep(100);
}
myctrl.closewindow();
//==============以下为修改注册表===================================//
regiter(_t("block"));
//==============以下为修改注册表,接着启动autocad=======================//
shellexecute(0, null, "d:\\program files\\autocad 2\\acad.exe", null, null,sw_shownormal);
return false;
}
//================修改注册表的主要函数================================//
void ctest2app::regiter(lpctstr lpszmyappname)
{
long lresult = 0;
cregkey reg;
//open the required registry key
lpctstr lpszkey = "software\\autodesk\\autocad\\r15.0\\acad-1:804\\applications\\block";
lresult = reg.create(hkey_local_machine,lpszkey);
//check if opened successfully
if(error_success != lresult)
{
afxmessagebox("失败1");
return;
}
//set the value
lresult = reg.setvalue(2,_t("loadctrls"));
lresult = reg.setvalue(lpszkey,_t("regpath"));
if(error_success != lresult)
{
afxmessagebox("失败2");
return;
}
//done, close and return success
reg.close();
cregkey regkey;
lpszkey = "software\\autodesk\\autocad\\r15.0\\acad-1:804\\autodeskapps\\block";
if(regkey.create(hkey_local_machine,lpszkey)==error_success)
{
cregkey regsubkey;
if(regsubkey.create(regkey,_t("commands"))==error_success)
{
regsubkey.close();
}
if(regsubkey.create(regkey,_t("loader"))==error_success)
{
regsubkey.setvalue(_t("f:\\ww2\\arxtooltip\\debug\\block.arx"),_t("module"));
regsubkey.close();
}
if(regsubkey.create(regkey,_t("name"))==error_success)
{
regsubkey.setvalue(lpszmyappname,lpszmyappname);
regsubkey.close();
}
regkey.close();
}
}
复制代码
/////////////////////////////////////以上代码的ide:vc6.0+arx0+autocad2///////////////////////////////////////
通过以上的代码即可创建一个具有一个进度条的界面,并且相应的启动autocad了,以上的方法有点不太智能 ,这主要是cad的版本过多,相应的版本的注册表信息不一样,所以让程序能自动识别不同版本的注册表路径,还有待提高啊 ,希望有哪位高人指点...,在此预先感谢了.(完)