2012-04-11 19:09:07|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, ObjectArx, AutoCAD|来源:唯设编程网
在完成对话框的布局和ID设置以后,就应该开始设计对话框管理的类了,由于本人的ObjectArx2010与VS2008中文版没有很好的兼容,张帆老师所说的“ObjectArx MFC Support”工具栏没有找到,于是我们先创建普通的对话框,最后手动将基类CDialog改成CAcUiDialog即可。在对话框设计区域点右键,选择“添加类”,类名设置成“CPreviewBlkDlg",基类选择CDialog,点完成。
逐个右击窗体中的控件,在弹出菜单中点”添加变量“,最终的结果如下:
DDX_Control(pDX, IDC_BLKDEF_LIST, m_lstBlkDef);
DDX_Control(pDX, IDC_BITMAP, m_bitmap);
DDX_Text(pDX, IDC_NUM_BLKDEF, m_strBlkRefNum);
DDX_Text(pDX, IDC_HAS_ATT, m_strHasAttribute);
变量类型:
CComboBox m_lstBlkDef; CStatic m_bitmap; CString m_strBlkRefNum; CString m_strHasAttribute;
5.1 重写窗体的初始化虚函数OnInitDialog,实现程序启动时在CComboBox控件中加载当前图形的块定义列表,你可以使用向导或者手动添加的方式完成。OnInitDialog函数的完整代码如下:
BOOL CPreviewBlkDlg::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
// 获得当前图形的块表
AcDbBlockTable *pBlkTbl;
AcDbBlockTableRecord *pBlkTblRcd;
acdbHostApplicationServices()
->workingDatabase()
->getBlockTable(pBlkTbl,AcDb::kForRead);
//遍历块表,获得用户自定义块表记录的名称,将其添加到组合框中
AcDbBlockTableIterator *pItr;
pBlkTbl->newIterator(pItr);
for(pItr->start();!pItr->done();pItr->step()){
pItr->getRecord(pBlkTblRcd,AcDb::kForRead);
ACHAR* pName;
pBlkTblRcd->getName(pName);
CString strName(pName);
acutDelString(pName);
if(strName.Compare(ACDB_MODEL_SPACE)!=0&&
strName.Compare(ACDB_PAPER_SPACE)!=0&&
strName.Compare(_T("*Paper_Space0"))!=0){
m_lstBlkDef.AddString(strName);
}
pBlkTblRcd->close();
}
delete pItr;
pBlkTbl->close();
return TRUE;
}
这段代码展示了获得当前图形块表、遍历块表以及组合框控件CComboBox添加元素的方法。
5.2 添加CComboBox控件的CBN_SELCHANGE消息响应函数OnCbnSelchangeBlkdefList,处理CComboBox控件选定内容更改事件,OnCbnSelchangeBlkdefList函数的完整代码如下:
void CPreviewBlkDlg::OnCbnSelchangeBlkdefList()
{
//显示预览图标
CPaintDC dc(this);
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()
->workingDatabase()
->getBlockTable(pBlkTbl,AcDb::kForRead);
AcDbObjectId blkTblRcdId;
CString strBlkDefName;
m_lstBlkDef.GetLBText(m_lstBlkDef.GetCurSel(),strBlkDefName);
Acad::ErrorStatus es=pBlkTbl->getAt(strBlkDefName,blkTblRcdId);
HBITMAP hBitmap=BlockIconToBMP(blkTblRcdId,dc.GetSafeHdc());
m_bitmap.SetBitmap(hBitmap);
//获得块表记录的指针
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(strBlkDefName,pBlkTblRcd,AcDb::kForRead);
//获得块参照的数量
AcDbBlockReferenceIdIterator *pItr;
pBlkTblRcd->newBlockReferenceIdIterator(pItr);
int number=0;
for(pItr->start();!pItr->done();pItr->step()){
number++;
}
m_strBlkRefNum.Format(_T("%d"),number);
//获得块参照是否包含属性
if(pBlkTblRcd->hasAttributeDefinitions()){
m_strHasAttribute=_T("是");
}else{
m_strHasAttribute=_T("否");
}
pBlkTblRcd->close();
pBlkTbl->close();
UpdateData(FALSE);
}