关闭文档不提示保存
2011-12-20 17:12
399 查看
最近,有一个这样的需求,所以把解决方法给贴出来一下。
首先,cad判断图纸是否被修改过,是根据一个变量的值来判断的,这个变量就是 DBMOD,很多人肯定会想到,那我把这个变量的值给修改成0或者是-1不就行了吗? 很不幸告诉你,这个变量是只读的。那么怎么办呢? 幸好桌子公司还挺厚道的,导出了一个接口给我们来修改database的这个flag,只不过是在官方的sdk文档里没有给出来而已,这个接口的原型如下:
//声明设置数据库模式的函数
extern long acdbSetDbmod(AcDbDatabase * pDb, long newVal);
这个函数在我以前的blog文章中也提到过,按照我上面的方法,声明一下,就可以使用这个接口来解决问题。
好了,现在有解决问题的接口啊,那么设置的时机应该在什么时候? 我想说的是,一个是,在你所有的修改操作之后,还有一个就是关闭文档之前。
明显的后面一个实现起来更现实,因为,我们知道,可以通过反应器这个东东来实现,我就是通过反应器来实现的,能过editor反应器来hook Quit命令和CLOSE命令 willstart的时候,来设置对应数据库的flag,这样就可以认cad不弹出提示保存的对话框了,代码如下:
void AMenEditorReactor::commandWillStart(const ACHAR * cmdStr)
{
CString strCmd = cmdStr;
strCmd.MakeUpper();
if( !strCmd.CompareNoCase(_T("_CLOSE")) || !strCmd.CompareNoCase(_T("CLOSE")) )
{
const TCHAR* szBuffer = NULL;
acdbCurDwg()->getFilename(szBuffer);
CString strRemoteFile = AMenFileManager::GetInstance()->GetLocaleBindFile(szBuffer);
if( !strRemoteFile.IsEmpty() )
{
struct resbuf res;
acedGetVar(L"DBMOD",&res);
if(res.resval.rint) // If changes have been made...
{
//清除保存位
acdbSetDbmod(acdbCurDwg(),0);
}
}
}
else if( !strCmd.CompareNoCase(_T("_QUIT")) || !strCmd.CompareNoCase(_T("QUIT")) )
{
AcApDocumentIterator *pIt;
pIt=acDocManager->newAcApDocumentIterator();
while(!pIt->done())
{
// For each open document...
AcApDocument* pDoc=pIt->document();
acDocManager->setCurDocument(pDoc);
struct resbuf res;
acedGetVar(L"DBMOD",&res);
if(res.resval.rint) // If changes have been made...
{
acDocManager->lockDocument(pDoc); // Lock
acdbSetDbmod(pDoc->database(),0); // clear changes flag
acDocManager->unlockDocument(pDoc);//unlock
}
pIt->step();
}
delete pIt;
}
AcEditorReactor::commandWillStart (cmdStr) ;
}
PS: 另外还有方法的,记得AcApDocment类有两个成员接口,pushDbmod和popDbmod。 看文档可以得知,pushDbmod接口是copy当前DBMOD变量的值放在DBMOD栈上,从而pushDbmod之后对database的修改,改变是将是你copy后的这个值,在编辑完毕后,你再把这个值给popDbmod,这样就可以做到系统修改的是一个临时值,而不是database的DBMOD,而当系统判断database是否被修改的时候,就会以database本身的DBMOD来判断,这样也就不会提示保存对话框了。所以,这个模型可以如下:
修改前:pushDbmod
修改ing
修改后:popDbmod
关闭:不提示
0了。
首先,cad判断图纸是否被修改过,是根据一个变量的值来判断的,这个变量就是 DBMOD,很多人肯定会想到,那我把这个变量的值给修改成0或者是-1不就行了吗? 很不幸告诉你,这个变量是只读的。那么怎么办呢? 幸好桌子公司还挺厚道的,导出了一个接口给我们来修改database的这个flag,只不过是在官方的sdk文档里没有给出来而已,这个接口的原型如下:
//声明设置数据库模式的函数
extern long acdbSetDbmod(AcDbDatabase * pDb, long newVal);
这个函数在我以前的blog文章中也提到过,按照我上面的方法,声明一下,就可以使用这个接口来解决问题。
好了,现在有解决问题的接口啊,那么设置的时机应该在什么时候? 我想说的是,一个是,在你所有的修改操作之后,还有一个就是关闭文档之前。
明显的后面一个实现起来更现实,因为,我们知道,可以通过反应器这个东东来实现,我就是通过反应器来实现的,能过editor反应器来hook Quit命令和CLOSE命令 willstart的时候,来设置对应数据库的flag,这样就可以认cad不弹出提示保存的对话框了,代码如下:
void AMenEditorReactor::commandWillStart(const ACHAR * cmdStr)
{
CString strCmd = cmdStr;
strCmd.MakeUpper();
if( !strCmd.CompareNoCase(_T("_CLOSE")) || !strCmd.CompareNoCase(_T("CLOSE")) )
{
const TCHAR* szBuffer = NULL;
acdbCurDwg()->getFilename(szBuffer);
CString strRemoteFile = AMenFileManager::GetInstance()->GetLocaleBindFile(szBuffer);
if( !strRemoteFile.IsEmpty() )
{
struct resbuf res;
acedGetVar(L"DBMOD",&res);
if(res.resval.rint) // If changes have been made...
{
//清除保存位
acdbSetDbmod(acdbCurDwg(),0);
}
}
}
else if( !strCmd.CompareNoCase(_T("_QUIT")) || !strCmd.CompareNoCase(_T("QUIT")) )
{
AcApDocumentIterator *pIt;
pIt=acDocManager->newAcApDocumentIterator();
while(!pIt->done())
{
// For each open document...
AcApDocument* pDoc=pIt->document();
acDocManager->setCurDocument(pDoc);
struct resbuf res;
acedGetVar(L"DBMOD",&res);
if(res.resval.rint) // If changes have been made...
{
acDocManager->lockDocument(pDoc); // Lock
acdbSetDbmod(pDoc->database(),0); // clear changes flag
acDocManager->unlockDocument(pDoc);//unlock
}
pIt->step();
}
delete pIt;
}
AcEditorReactor::commandWillStart (cmdStr) ;
}
PS: 另外还有方法的,记得AcApDocment类有两个成员接口,pushDbmod和popDbmod。 看文档可以得知,pushDbmod接口是copy当前DBMOD变量的值放在DBMOD栈上,从而pushDbmod之后对database的修改,改变是将是你copy后的这个值,在编辑完毕后,你再把这个值给popDbmod,这样就可以做到系统修改的是一个临时值,而不是database的DBMOD,而当系统判断database是否被修改的时候,就会以database本身的DBMOD来判断,这样也就不会提示保存对话框了。所以,这个模型可以如下:
修改前:pushDbmod
修改ing
修改后:popDbmod
关闭:不提示
0了。
相关文章推荐
- 多文档的MFC中,如何去掉菜单栏,父窗体,子窗体最大化显示,关闭子窗体是去掉保存提示
- word2003保存文时总是提示“文档被保存,但是语音识别的数据丢失,因为没有足够的空间存储这些数据。确保没有录音时关闭麦克风,并检查磁盘上的存储空间。[转]
- 用arx 如何让 cad关闭文档时,不提示保存。
- 【原创】用arx 如何让 cad关闭文档时,不提示保存。
- 用arx 如何让 cad关闭文档时,不提示保存。
- Word文档丢失找回之没有保存Word文档就关闭了怎么解决
- 【VBA研究】关闭或保存文件时的提示信息
- C#中操作Word(2)—— 新建、打开、保存和关闭文档
- “文档被保存,但是语音识别的数据丢失,因为没有足够的空间存储这些数据。确保没有录音时关闭麦克风,并检查磁盘上的存储空间。”
- 解决Sublime文件被修改后关闭不提示保存的现象
- 如何真正实现无提示保存Excel文档
- Bug日记:C#导出Word文件时,提示word内存不足,请现在保存文档
- js中关闭子窗口不弹出保存提示的方法
- C# WebBrower1控件提示“该文档已被修改,是否保存修改结果”解决方法
- 如何在关闭应用程序时自动保存文档到指定名称的文件
- 将数据库内表中的数据导出到txt文档中,并且显示一个对话框,提示用户保存文件的位置
- 关于VS C++ 操作 EXCEL(关闭EXCEL文件提示是否保存,早期公式...)
- 去掉excel保存文件时提示:隐私问题警告:此文档中包含宏
- 点击网页中PDF链接时,打开PDF文档不再是直接IE查看,而是提示下载保存
- C#中操作Excel(2)—— 新建、打开、保存和关闭Excel文档