hey 发表于 2004-4-21 11:42:00

如何让对话框的按钮调用ACAD API函数或命令?

我想讓對話框上的按鈕添加一個處理函數﹐該函數中調用了acedCommand(...)等ACAD命令﹐起初﹐我認為直接調用是沒問題的就寫了下面的類似語句﹕<BR>void OnClick_InsertBtn()<BR>{<BR>...<BR>        acedCommand(RTSTR,"_DDINSERT",0);<BR>...<BR>}<BR>結果發現﹐插入圖塊的對話框並不出現﹐同樣的語句在其它命令(用OBJECTARX工具添加的)中調用卻沒有問題﹐向ACAD輸入/輸出窗口寫字符串也沒有效果。<BR>(對話框的創建如下)<BR>void BM()<BR>{        <BR>        CBMDlg* dlg=new CBMDlg;<BR>        dlg-&gt;Create(IDD_DIALOG1);<BR>        dlg-&gt;ShowWindow(SW_SHOW);        <BR>}


<BR>後來我把dlg作為了一個全局指針變量﹐在函數InitApplication()中將它創建﹐BM()僅作為顯示使用﹐但還是沒有效果﹐只是可以輸出字符串了﹐看來acedCommand(RTSTR,"_DDINSERT",0);這樣的語句是沒有找到地方和ACAD通信﹐大家能告訴我如何解決嗎﹖

hey 发表于 2004-4-22 10:19:00

斑竹能否來幫幫忙﹖

hey 发表于 2004-4-22 14:56:00

在CSDN大俠byry指點下﹐我已經解決了此問題﹐如果得到他的同意﹐我將把代碼貼出來與大家共享。

hey 发表于 2004-4-22 14:59:00

另外﹐由於我的短信功能不好用了﹐上次那位向我問詢同樣問題的同仁請報一下名好嗎﹖

hey 发表于 2004-4-22 17:17:00

感谢byry(pepsi)的帮助,以下方案是在他的帮助下完成的,下列关键代码也是他写的,我只是稍微改了改,现在我总结一下,贴出来.<BR>关于模式对话框按钮调用外部命令的总结:<BR>首先,我创建了一个新的ObjectArx工程"OuterCommandTest",在里面插入了一个对话框,其ID是"IDD_DIALOG1",并由此生成了一个新类"CTestDlg",由于此类要与资源"IDD_DIALOG1"联系,在文件"TestDlg.h"开头的地方还要加上"#include "resource.h""这句话.<BR>然后,在对话框中添加一个按钮"IDC_BUTTON1",并生成函数"void CTestDlg::OnButton1() ",在函数中添加调用CAD外部命令的语句,函数如下:<BR>void CTestDlg::OnButton1() <BR>{<BR>        // TODO: Add your control notification handler code here<BR>        acedCommand(RTSTR,"_DDINSERT",0);// Call Cad Outer Command<BR>}<BR>然后,转到函数"void InitApplication()"所在的文件"outercommandtest.cpp"中,在开头部分改写如下:<BR>//HINSTANCE _hdllInstance =NULL ;//这句话取消,因为下面要做个新的<BR>再添加下面三句:<BR>HWND adsw_acadMainWnd();<BR>HINSTANCE _hdllInstance;<BR>extern "C" BOOL APIENTRY DllMain(HINSTANCE, DWORD, LPVOID);


再添加下面两个函数:<BR>void InitMFC()<BR>{<BR>        DllMain(_hdllInstance, DLL_PROCESS_ATTACH, NULL);<BR>        hWndACAD = adsw_acadMainWnd();<BR>}


void EndMFC()<BR>{<BR>        DllMain(_hdllInstance, DLL_PROCESS_DETACH, NULL);<BR>}


然后让InitApplication()调用函数InitMFC(),UnloadApplication()调用EndMFC().


处理完毕后,在"StdAfx.h"和"StdAfx.cpp"中创建全局变量hWndACAD,这样做使文件"outercommandtest.cpp"和"outercommandtestcommands.cpp"中的函数都可以调用它了.<BR>创建代码:<BR>extern HWND hWndACAD;//"StdAfx.h"<BR>HWND hWndACAD = NULL;//"StdAfx.cpp"


最后,用ObjectArx工具条创建一个新的命令函数"test",实现如下:<BR>void test()<BR>{<BR>        CTestDlg dlg(CWnd::FromHandle(hWndACAD));<BR>        dlg.DoModal();<BR>}<BR>这样,就实现了byry(pepsi)说的"得到当前AUTOCAD窗口的句柄hWndACAD,通过这个句柄我们才能创建一个对话框:C***Dlg Dlg(CWnd::FromHandle(hWndACAD)),这样才能实现与CAD窗口的通信"了.


然后起动程序,用命令"TEST"调用对话框,点击按钮"TEST",就可以看到acedCommand(RTSTR,"_DDINSERT",0);调出来的对话框了.<BR>

lyp1115 发表于 2006-11-5 11:18:00

<P>请问在arx2006+vs.net2002中怎么实现啊???</P>

jemmyyan 发表于 2006-11-10 09:13:00

很好,谢谢。

wildfire 发表于 2007-2-23 22:37:00

学习一下!
页: [1]
查看完整版本: 如何让对话框的按钮调用ACAD API函数或命令?