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); }