明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2770|回复: 7

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

[复制链接]
发表于 2004-4-21 11:42:00 | 显示全部楼层 |阅读模式
我想讓對話框上的按鈕添加一個處理函數﹐該函數中調用了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通信﹐大家能告訴我如何解決嗎﹖
 楼主| 发表于 2004-4-22 10:19:00 | 显示全部楼层
斑竹能否來幫幫忙﹖
 楼主| 发表于 2004-4-22 14:56:00 | 显示全部楼层
在CSDN大俠byry指點下﹐我已經解決了此問題﹐如果得到他的同意﹐我將把代碼貼出來與大家共享。
 楼主| 发表于 2004-4-22 14:59:00 | 显示全部楼层
另外﹐由於我的短信功能不好用了﹐上次那位向我問詢同樣問題的同仁請報一下名好嗎﹖
 楼主| 发表于 2004-4-22 17:17:00 | 显示全部楼层
感谢byry(pepsi)的帮助,以下方案是在他的帮助下完成的,下列关键代码也是他写的,我只是稍微改了改,现在我总结一下,贴出来.
关于模式对话框按钮调用外部命令的总结:
首先,我创建了一个新的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);调出来的对话框了.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 金钱 +2 贡献 +2 收起 理由
zfbj + 1 + 2 + 2 【好评】好文章希望继续努力

查看全部评分

发表于 2006-11-5 11:18:00 | 显示全部楼层

请问在arx2006+vs.net2002中怎么实现啊???

发表于 2006-11-10 09:13:00 | 显示全部楼层
很好,谢谢。
发表于 2007-2-23 22:37:00 | 显示全部楼层
学习一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 20:53 , Processed in 0.198265 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表