找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Ben1978

[讨论]:关闭文档时不弹出保存对话框的实现

[复制链接]
发表于 2006-3-19 00:55:16 | 显示全部楼层
其实,实现的方法有好几种,不过的问清楚你需要在那里用?
1、在用户随意关闭AutoCAD文档时候用,可以检测该文档存到一个临时文件里面,关闭就完事了,只是会给硬盘造成一个垃圾文件。这是最简单的解决方法。
2、如果是在你的控制内退出,com、方法也许是一个最直接的方法,还有很多其他的方法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-19 09:09:49 | 显示全部楼层
biostrong兄弟:你好
请你谈谈使用com的思路,好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-19 19:51:45 | 显示全部楼层
谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-21 14:50:03 | 显示全部楼层
acdbSetDbmod(pDb, 0);  不行啊   我测试过
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-21 17:45:02 | 显示全部楼层
是啊,我早就试过了不行的,希望研究过的朋友站出来说句话吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-26 14:17:56 | 显示全部楼层
看不懂!我要学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-27 23:52:45 | 显示全部楼层
思路是这样的,这个问题麻烦就麻烦在如何截取保存提示框,
当用户点击关闭按扭的时候,这时候实际上是一个标准Windows消息WM_CLOSE,关闭时候实际上是Windows标准库检测CDocument的修改标志CDocument::IsModified(),而不是AutoCAD系统检测当前图库的DBMODE。
从AcApDocument中可以的到CDocument指针。
所以必须截住这一步,可以采用Windows的钩子,Arx提供的钩子钩不住这个消息,当你截住这个消息时候再采用COM方式操作,

在你需要处理的地方,加上这段代码:
IAcadApplication app=acedGetAcadWinApp()->GetIDispatch(TRUE);
IAcadDocument doc=IApp.GetActiveDocument();
COleVariant vsave((short)0);
COleVariant file("");
doc.Close(vsave,file);

附件给你提供COM的接口文件.
不知道你具体干什么,好像没有你这样干的,
可以探讨一下QQ17103837
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-28 10:15:42 | 显示全部楼层
太感谢你了,这确实是一个非常规的做法,但我的目的是想给用户更加清晰明了的交互界面,所有的提示我都希望从专业的角度去考虑。你的分析太正确了,你的VC功底很不错哦,我VC一般般,所以一直未能解决,再次感谢你啊,现在为和不用MSN了,我还没QQ呢?等我声请了再告诉你吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-28 10:28:06 | 显示全部楼层
CDocument::IsModified是检测不到是否修改了文当的内容(可以试一下中键的缩放)

查DBMODE系统变量有两种方法,一个acedGetVar (只能查当前活动的文档)另一个就是用COM中的IAcadDocument::GetVariable(LPCTSTR Name)

另外说明一下:还有一种方法在打开文档是做一下PushDbMod(),然后在关闭时如果不希望保存文件就PopDbMod(),这样文档在关闭是就不会出现提示框
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-29 21:58:17 | 显示全部楼层
一下为实现该功能的代码:(COM方法)

        COleVariant vNull(""),
                vTrue((short)TRUE),
                vFalse((short)FALSE);

        IAcadApplication IApp;
        IAcadDocuments IDocs;
        IAcadDocument IDoc;

        IApp.AttachDispatch(acedGetAcadWinApp()->GetIDispatch(TRUE));
        IDocs.AttachDispatch(IApp.GetDocuments());

        if(IDocs.GetCount() == 0)
        {
                IApp.ReleaseDispatch();
                IDocs.ReleaseDispatch();
                return;
        }
        IDoc.AttachDispatch(IApp.GetActiveDocument());

        IDoc.Close(vFalse,COleVariant(DWGFileName));

        IDoc.ReleaseDispatch();
        IDocs.ReleaseDispatch();
        IApp.ReleaseDispatch();

在关闭该文档处使用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-30 07:39:48 | 显示全部楼层
好像可以通过设置AutoCAD的一个系统变量来实现
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-3 00:58:53 | 显示全部楼层
以上各位所说我都分析过了,非常感谢
但只有biostrong提供的思路是在理论上可行的,有一点几位朋友搞错了,
我是要关闭CAD主程序而不是CAD文档。
现在的关键问题是如何截获AutoCAD的WM_CLOSE消息,这要用到Windows的外壳钩子函数,
但这个钩子函数如何来安装还是存在问题,具体是哪一个函数,我搞了一天还是未弄好,还望
大家再次帮忙。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-4 00:23:42 | 显示全部楼层
你上程序员大本营www.csdn.net上,
好多关于钩子的例子,只要你截住了这个消息,
其他的问题都解决了。
我也好久没做钩子了,到我可以告诉你一些基本方法。
系统底层的钩子需要在动态库中才能拦截的住,
但我没有试过在ARX(实际也是DLL)中能否拦截住,你试一下。

这是一个键盘钩子例子,你参照修改一下:
class AFX_EXT_CLASS  CKbhook : public CObject
{
public:
        CKbhook(HWND hwnd);
        //钩子类的构造函数
        ~CKbhook();
        //钩子类的析构函数
        BOOL StartHook();
        //安装钩子函数
        BOOL StopHook();
        //卸载钩子函数
};


#pragma data_seg("mydata")
HHOOK glhHook=NULL;//安装的鼠标勾子句柄
HINSTANCE glhInstance=NULL;//DLL实例句柄
HWND        glhWnd = NULL;
LRESULT WINAPI KbHookProc(int nCode,WPARAM wparam,LPARAM lparam);

CKbhook::CKbhook(HWND hwnd)
{
        glhWnd = hwnd;
}

CKbhook::~CKbhook()
{
}
BOOL CKbhook::StartHook()
{
        BOOL bResult=FALSE;
        glhHook=SetWindowsHookEx(WH_KEYBOARD,KbHookProc,glhInstance,0);

        if(glhHook!=NULL)
                bResult=TRUE;
       
        return bResult;
}
BOOL CKbhook::StopHook() //卸载钩子
{
        BOOL bResult=FALSE;
        if(glhHook)
        {
                bResult= UnhookWindowsHookEx(glhHook);
                if(bResult)
                        glhHook=NULL;                
        }
        return bResult;
}
LRESULT WINAPI KbHookProc(int nCode,WPARAM wparam,LPARAM lparam)
{       
        if(nCode>=0)
        {               
                ::SendMessage(glhWnd,WM_NOTIFY_KBHOOK,wparam,lparam);
        }
        return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息
}

注意:在实验的时候,经常会造成系统死机或崩溃,多注意存盘!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-21 11:09:44 | 显示全部楼层
有些不懂呀!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-1 11:55:06 | 显示全部楼层
都看完了,可是还是不懂!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-23 12:30 , Processed in 0.271802 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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