- 积分
- 23668
- 明经币
- 个
- 注册时间
- 2011-2-21
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
这是张帆老师的块图标预览中函数
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;
}
其中这一句size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))在x64上编译会出现警告提示隐式转换成64位,在运行中不会出错;如果改成size_t memsize = sizeof(BITMAPINFOHEADER) + ((1i64<<ih.biBitCount) * sizeof(RGBQUAD))编译时没有警告,但是在运行时会引起CAD崩溃。在图标位图为32bit时即ih.biBitCount=32时,sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))=44,而sizeof(BITMAPINFOHEADER) + ((1i64<<ih.biBitCount) * sizeof(RGBQUAD))=40。当memsize=40时,运行到HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT, icon.asArrayPtr() + memsize, bi, DIB_RGB_COLORS)就引起CAD崩溃了。有哪位老师解释一下,并告诉这个代码如何改进。
|
|