作过ObjectArx界面开发的同仁请指点:如何让对话框的按钮调用ACAD API函数或命令? 如题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般的ACAD命令都可以用这个函数实现:acedCommand();比如:acedCommand(RTSTR, "-layer", RTSTR, "s", RTSTR, "0", RTSTR, "", RTNONE);我认为你最好把对话框作为你整个ACAD开发的功能的一部分,也就是说,你使用ARXOBJECT向导生成了一个框架,然后你自己创建一个对话框类,添加到该框架当中,当在CAD环境下运行某一命令时,就会出现这个对话框.这种方法的优点就在于,即使是在对话框当中,你也可以使用ACAD提供的API函数和命令. TO byry(pepsi) ﹕首先謝謝你的回答。恕我沒有把意思表達清楚﹐這裡我再詳述一下﹕我想讓對話框上的按鈕添加一個處理函數﹐該函數中調用了acedCommand(...)等ACAD命令﹐起初﹐我認為直接調用是沒問題的就寫了下面的類似語句﹕void OnClick_InsertBtn(){... acedCommand(RTSTR,"_DDINSERT",0);...}結果發現﹐插入圖塊的對話框並不出現﹐同樣的語句在其它命令(用OBJECTARX工具添加的)中調用卻沒有問題﹐向ACAD輸入/輸出窗口寫字符串也沒有效果。(對話框的創建如下)void BM(){ CBMDlg* dlg=new CBMDlg; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); }後來我把dlg作為了一個全局指針變量﹐在函數InitApplication()中將它創建﹐BM()僅作為顯示使用﹐但還是沒有效果﹐只是可以輸出字符串了﹐看來acedCommand(RTSTR,"_DDINSERT",0);這樣的語句是沒有找到地方和ACAD通信﹐你能告訴我如何解決嗎﹖ 1\我试过了,用对话框可能进行CAD命令的传递,我认为应该是你的OnClick_InsertBtn()事件写的有问题吧,你是不是没有得到当前CAD控制台的句柄就开始发送acedCommand(RTSTR,"_DDINSERT",0);???2\你现在既然能把命令输入到控制台上,为什么这个命令不能执行呢? To:byry(pepsi) :1。我確實沒有得到当前CAD控制台的句柄﹐也不知道如何去得到﹐你能給我一些示例代碼嗎﹖2。我沒有把命令輸入上去﹐而是輸出的字符串。 謝謝byry(pepsi) 的指點﹐問題已解決。 感谢byry(pepsi)的帮助,以下方案是在他的帮助下完成的,下列关键代码也是他写的,我只是稍微改了改,现在我总结一下,贴出来.程序的相关下载地址是:http://www.mjtd.com/bbs/viewFile.asp?Boardid=14&ID=6798,可以在http://www.mjtd.com/bbs/dispbbs.asp?boardID=14&ID=19696&page=1访问到.关于模式对话框按钮调用外部命令的总结:首先,我创建了一个新的ObjectArx工程"OuterCommandTest",在里面插入了一个对话框,其ID是"IDD_DIALOG1",并由此生成了一个新类"CTestDlg",由于此类要与资源"IDD_DIALOG1"联系,在文件"TestDlg.h"开头的地方还要加上"#include "resource.h""这句话.然后,在对话框中添加一个按钮"IDC_BUTTON1",并生成函数"void CTestDlg::OnButton1() ",在函数中添加调用CAD外部命令的语句,函数如下:void CTestDlg::OnButton1() { // TODO: Add your control notification handler code here acedCommand(RTSTR,"_DDINSERT",0);// Call Cad Outer Command}然后,转到函数"void InitApplication()"所在的文件"outercommandtest.cpp"中,在开头部分改写如下://HINSTANCE _hdllInstance =NULL ;//这句话取消,因为下面要做个新的再添加下面三句:HWND adsw_acadMainWnd();HINSTANCE _hdllInstance;extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD, LPVOID);再添加下面两个函数:void InitMFC(){ DllMain(_hdllInstance, DLL_PROCESS_ATTACH, NULL); hWndACAD = adsw_acadMainWnd();}void EndMFC(){ DllMain(_hdllInstance, DLL_PROCESS_DETACH, NULL);}然后让InitApplication()调用函数InitMFC(),UnloadApplication()调用EndMFC().处理完毕后,在"StdAfx.h"和"StdAfx.cpp"中创建全局变量hWndACAD,这样做使文件"outercommandtest.cpp"和"outercommandtestcommands.cpp"中的函数都可以调用它了.创建代码:extern HWND hWndACAD;//"StdAfx.h"HWND hWndACAD = NULL;//"StdAfx.cpp"最后,用ObjectArx工具条创建一个新的命令函数"test",实现如下:void test(){ CTestDlg dlg(CWnd::FromHandle(hWndACAD)); dlg.DoModal();}这样,就实现了byry(pepsi)说的"得到当前AUTOCAD窗口的句柄hWndACAD,通过这个句柄我们才能创建一个对话框:C***Dlg Dlg(CWnd::FromHandle(hWndACAD)),这样才能实现与CAD窗口的通信"了.然后起动程序,用命令"TEST"调用对话框,点击按钮"TEST",就可以看到acedCommand(RTSTR,"_DDINSERT",0);调出来的对话框了. 向AutoCAD窗口(adsw_acadMainWnd())发送WM_COPYDATA消息,就可以调用一个命令,该方式使用起来安全!使用方法如下:COPYDATASTRUCT cmdMsg;cmdMsg.dwData=1;cmdMsg.cbData=10;cmdMsg.lpData=“_DDINSERT”;::SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL,(LPARAM)&cmdMsg);采用acedCommand方式调用时候,注意调用的命令,如_DDINSERT和DDINSERT、._DDINSERT在程序调用中是有区别的! 向AutoCAD窗口(adsw_acadMainWnd())发送WM_COPYDATA消息,就可以调用一个命令,调用命令和执行Api函数是两码事情,该方式调用命令安全,你所使用的ads_command方式经常会无效,特别是在钩子里面使用的时候更是如此,但我说说的方式却可以在任何时候使用,常规向阿AutoCAD中加入一个实体,不是使用命令,而使你自己创建一个命令,在该命令函数中编写你的操作代码,你可以去买一本ObjetARx的书,那上面讲解的很详细。绘制一条线的方式有多种,你可以调用命令绘制一台条,也可以将参数通过命令的方式掺入绘制,最常规的是创建一个AcDbLine实体,添加到数据库中就行!CAD的API函数一般用在自己所写的函数中,如设置进度条函数等等。ads_command就是一个Api函数,他的功能就是调用一个命令。 VC读TS流文件不对,大家帮忙看看! VC 智能感应消失 如何设置工具条按钮之间的间隔? 全局函數如何調用類的成員函數? 怎样用DirectShow采集数据到ASF文件,能否提供代码?? 一个非常非常非常难的问题 怎么样在设计时把控件置后? atl com dll 函数怎样用参数传出汉字 回调函数? 多文档结构,界面的问题。 高分求解---关于自定义消息的问题 对话框为什么不显示?
acedCommand();
比如:
acedCommand(RTSTR, "-layer", RTSTR, "s", RTSTR, "0", RTSTR, "", RTNONE);我认为你最好把对话框作为你整个ACAD开发的功能的一部分,也就是说,你使用ARXOBJECT向导生成了一个框架,然后你自己创建一个对话框类,添加到该框架当中,当在CAD环境下运行某一命令时,就会出现这个对话框.
这种方法的优点就在于,即使是在对话框当中,你也可以使用ACAD提供的API函数和命令.
首先謝謝你的回答。
恕我沒有把意思表達清楚﹐這裡我再詳述一下﹕
我想讓對話框上的按鈕添加一個處理函數﹐該函數中調用了acedCommand(...)等ACAD命令﹐起初﹐我認為直接調用是沒問題的就寫了下面的類似語句﹕
void OnClick_InsertBtn()
{
...
acedCommand(RTSTR,"_DDINSERT",0);
...
}
結果發現﹐插入圖塊的對話框並不出現﹐同樣的語句在其它命令(用OBJECTARX工具添加的)中調用卻沒有問題﹐向ACAD輸入/輸出窗口寫字符串也沒有效果。
(對話框的創建如下)
void BM()
{
CBMDlg* dlg=new CBMDlg;
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_SHOW);
}
後來我把dlg作為了一個全局指針變量﹐在函數InitApplication()中將它創建﹐BM()僅作為顯示使用﹐但還是沒有效果﹐只是可以輸出字符串了﹐看來acedCommand(RTSTR,"_DDINSERT",0);這樣的語句是沒有找到地方和ACAD通信﹐你能告訴我如何解決嗎﹖
2。我沒有把命令輸入上去﹐而是輸出的字符串。
程序的相关下载地址是:http://www.mjtd.com/bbs/viewFile.asp?Boardid=14&ID=6798,可以在http://www.mjtd.com/bbs/dispbbs.asp?boardID=14&ID=19696&page=1访问到.关于模式对话框按钮调用外部命令的总结:
首先,我创建了一个新的ObjectArx工程"OuterCommandTest",在里面插入了一个对话框,其ID是"IDD_DIALOG1",并由此生成了一个新类"CTestDlg",由于此类要与资源"IDD_DIALOG1"联系,在文件"TestDlg.h"开头的地方还要加上"#include "resource.h""这句话.
然后,在对话框中添加一个按钮"IDC_BUTTON1",并生成函数"void CTestDlg::OnButton1() ",在函数中添加调用CAD外部命令的语句,函数如下:
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
acedCommand(RTSTR,"_DDINSERT",0);// Call Cad Outer Command
}
然后,转到函数"void InitApplication()"所在的文件"outercommandtest.cpp"中,在开头部分改写如下:
//HINSTANCE _hdllInstance =NULL ;//这句话取消,因为下面要做个新的
再添加下面三句:
HWND adsw_acadMainWnd();
HINSTANCE _hdllInstance;
extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD, LPVOID);再添加下面两个函数:
void InitMFC()
{
DllMain(_hdllInstance, DLL_PROCESS_ATTACH, NULL);
hWndACAD = adsw_acadMainWnd();
}void EndMFC()
{
DllMain(_hdllInstance, DLL_PROCESS_DETACH, NULL);
}然后让InitApplication()调用函数InitMFC(),UnloadApplication()调用EndMFC().处理完毕后,在"StdAfx.h"和"StdAfx.cpp"中创建全局变量hWndACAD,这样做使文件"outercommandtest.cpp"和"outercommandtestcommands.cpp"中的函数都可以调用它了.
创建代码:
extern HWND hWndACAD;//"StdAfx.h"
HWND hWndACAD = NULL;//"StdAfx.cpp"最后,用ObjectArx工具条创建一个新的命令函数"test",实现如下:
void test()
{
CTestDlg dlg(CWnd::FromHandle(hWndACAD));
dlg.DoModal();
}
这样,就实现了byry(pepsi)说的"得到当前AUTOCAD窗口的句柄hWndACAD,通过这个句柄我们才能创建一个对话框:C***Dlg Dlg(CWnd::FromHandle(hWndACAD)),这样才能实现与CAD窗口的通信"了.然后起动程序,用命令"TEST"调用对话框,点击按钮"TEST",就可以看到acedCommand(RTSTR,"_DDINSERT",0);调出来的对话框了.
该方式使用起来安全!
使用方法如下:
COPYDATASTRUCT cmdMsg;
cmdMsg.dwData=1;
cmdMsg.cbData=10;
cmdMsg.lpData=“_DDINSERT”;
::SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL,(LPARAM)&cmdMsg);采用acedCommand方式调用时候,注意调用的命令,如_DDINSERT和DDINSERT、._DDINSERT
在程序调用中是有区别的!
调用命令和执行Api函数是两码事情,该方式调用命令安全,你所使用的ads_command方式经常会无效,特别是在钩子里面使用的时候更是如此,但我说说的方式却可以在任何时候使用,常规向阿AutoCAD中加入一个实体,不是使用命令,而使你自己创建一个命令,在该命令函数中编写你的操作代码,你可以去买一本ObjetARx的书,那上面讲解的很详细。
绘制一条线的方式有多种,你可以调用命令绘制一台条,也可以将参数通过命令的方式掺入绘制,最常规的是创建一个AcDbLine实体,添加到数据库中就行!CAD的API函数一般用在自己所写的函数中,如设置进度条函数等等。ads_command就是一个Api函数,他的功能就是调用一个命令。