使用DRX代码的选择错误?
你好执行下面的代码会在Bricscad中产生错误:
我试图创建一个简单的对话框,设置一些参数,并在关闭该对话框后立即选择一些实体。按下OK对话框按钮后,我得到了一个错误
类CustomDialog:public OdStaticRxObject<ODDCommand><br>{<br>public:const OdString localName()const{return globalName();}
const-OdString-groupName()const{return-DD_T(“DRXGLOBAL”);}
const OdString globalName()const{return OdString(“test_dialog”);}
无效执行(OdEdCommandContext*pCmdCtx)
{
OdDbCommandContextPtr-pDbCmdCtx(pCmdCtx);//数据库访问的向下转换
ODBDatabasePtr-pDb=pDbCmdCtx->database();//当前数据库
OdDbUserIO*pDbIO=pDbCmdCtx->dbUserIO();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDialog-TestDlg(CWnd::FromHandle(sds_gethwnd())));
/*sds_name:ssname
sds_ssget(NULL、NULL、NULL和ssname)
sds_ ssfree(ssname)*/
OdDbSelectionSetPtr pFirstSel=pDbIO->select(DD_T(“选择第一组对象”),OdEd::kSelSingleEntity/*,0,OdString::kEmpty,&filter*/)
}
}
我缺少什么
**** Hidden Message ***** 这可能是一个线程问题,AFX_MANAGE_STATE(AfxGetStaticModuleState());当它超出范围时应该停用
,所以一旦它到达你的选择调用,它可能仍然在范围内,你调试了吗? 丹,你能发布一个工作程序吗?
谢谢您!
迈克 我已经检查了调试!当它尝试开始选择时,线程仍在对话框创建范围内。谢谢丹尼尔!!
//...
try
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDialog StockDlg(CWnd::FromHandle(sds_getmainhwnd()));
StockDlg.DoModal();
}
catch(...)
{
}
OdDbSelectionSetPtr pFirstSel = pDbIO->select(DD_T(“Select first set of objects”), OdEd::kSelSingleEntity/*, 0, OdString::kEmpty, &filter*/);
//...
话筒 很好
另一种方法可能是添加一个方法,即代码0] 对于常规dll,可以使用Bricscad DRX轻松添加MFC对话框,如上所述(再次感谢Daniel!)。
这可能是扩展dll的等效代码(创建一个对话框并在关闭它以选择某些内容后自动关闭它)?
AFX_MANAGE_STATE(AfxGetStaticModuleState())不允许使用扩展dll。
有什么想法吗?
Mike
在这种情况下,您可以考虑放弃DRX并使用BRX,
BRX(希望是下一个版本)将具有处理从对话框中挑选和选择等操作的特殊控件。
I. e CAcUiSelectButton&CAcUiPickButton 不幸的是,BRX不适用于Bricscad Classic,因此我不得不继续使用DRX
然后...
#pragma once
#include "MyDialog.h"
//++--
class CommandDoit : public OdStaticRxObject
{
public:
const OdString localName() const { return globalName(); }
const OdString groupName() const { return DD_T("DRXGLOBAL"); }
const OdString globalName() const { return OdString("doit"); }
void execute(OdEdCommandContext* pCmdCtx)
{
OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
OdDbDatabasePtr pDb = pDbCmdCtx->database();
OdDbUserIO* pDbIO = pDbCmdCtx->dbUserIO();
CMyDialog dlg(CWnd::FromHandle(sds_getmainhwnd()));
if(dlg.DoModal() == IDOK)
{
OdDbSelectionSetPtr pFirstSel = pDbIO->select(DD_T("Select first set of objects"),
OdEd::kSelSingleEntity);
}
}
};
您甚至可以创建一个结构或类来保存实例,如果您需要调用AfxSetResourceHandle...
无论如何,我已经创建了一个示例项目,您可以看看。
简直,简直完美!
我尝试测试这是否适用于可停靠对话框。正常情况下是应该的!
再次感谢您!
迈克 应该没问题,它几乎和我在这个CDockBar中使用的设置一样
页:
[1]