VC2008使用ObjectArx2010创建块属性查看对话框

2012-04-11 19:09:07|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, ObjectArx, AutoCAD|来源:唯设编程网

Step 3: 添加对话框类

在完成对话框的布局和ID设置以后,就应该开始设计对话框管理的类了,由于本人的ObjectArx2010与VS2008中文版没有很好的兼容,张帆老师所说的“ObjectArx MFC Support”工具栏没有找到,于是我们先创建普通的对话框,最后手动将基类CDialog改成CAcUiDialog即可。在对话框设计区域点右键,选择“添加类”,类名设置成“CPreviewBlkDlg",基类选择CDialog,点完成。

Step 4: 添加控件关联的变量

逐个右击窗体中的控件,在弹出菜单中点”添加变量“,最终的结果如下: 

    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;

Step 5: 添加实现函数

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);
}
发表评论0条 】
网友评论(共?条评论)..
VC2008使用ObjectArx2010创建块属性查看对话框