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

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

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

这段代码展示了在对话框中显示位图的简单方法,也给出了获取当前图形中指定块参照数量的具体实现。在代码中,使用了函数BlockIconToBMP根据ID获取指定块定义的缩略图,下面将给出函数BlockIconToBMP的完整代码:

// 获得指定的块表记录的预览图像,输入参数:块表记录的ID、设备描述表句柄
HBITMAP CPreviewBlkDlg::BlockIconToBMP(const AcDbObjectId& blkId, HDC hdc)
{
    Acad::ErrorStatus es;
    //块表记录指针
    AcDbBlockTableRecord *pBlkTblRcd=NULL;
    //保存预览图标的数组
    AcArray<Adesk::UInt8> icon;

    //获得保存块表记录的预览图标的数组
    try{
        es=acdbOpenObject(pBlkTblRcd,blkId,AcDb::kForRead);

        if(es!=Acad::eOk)
            throw 1;

        //如果块表定义不包含预览图标
        if(!pBlkTblRcd->hasPreviewIcon()){
            pBlkTblRcd->close();
            return NULL;
        }

        es=pBlkTblRcd->getPreviewIcon(icon);
        if(es!=Acad::eOk)
            throw 2;

        es=pBlkTblRcd->close();
        if(es!=Acad::eOk)
            throw 3;
    }catch(...){
        pBlkTblRcd->close();
        return NULL;
    }

    //由icon数组获得可显示的位图
    BITMAPINFOHEADER ih;    //位图信息头
    memcpy(&ih,icon.asArrayPtr(),sizeof(ih));
    size_t memsize=sizeof(BITMAPINFOHEADER)+((1<<ih.biBitCount)*sizeof(RGBQUAD));
    LPBITMAPINFO bi=(LPBITMAPINFO)malloc(memsize);    //位图信息
    memcpy(bi,icon.asArrayPtr(),memsize);
    HBITMAP hbm=CreateDIBitmap(hdc,&ih,CBM_INIT,icon.asArrayPtr()+memsize,bi,DIB_RGB_COLORS);
    free(bi);

    return hbm;
}

Step 6: 注册AutoCAD命令

使用ObjectArx集成的工具栏注册一个新命令ViewBlk,在响应函数中完成模态对话框的调用,最终代码如下:

// - CHAP3._ViewBlk command (do not rename)
static void CHAP3_ViewBlk(void)
{
    // 显示 “块定义查看器”对话框
    CAcModuleResourceOverride resOverride;    //防止资源冲突
    CPreviewBlkDlg dlg;
    dlg.DoModal();
}

由于使用了类CAcModuleResourceOverride,你需要添加头文件:

#include "AcExtensionModule.h"

到此,查看当前图形块定义属性的ObjectArx对话框应用程序便完成了,最终程序的运行效果如图:

ObjectArx2010开发的块定义属性浏览应用程序

<123>
发表评论0条 】
网友评论(共?条评论)..
VC2008使用ObjectArx2010创建块属性查看对话框