|
AutoCAD二次开发中,实现对外部图形预览的思路为:利用acdbGetPreviewBitmapFromDwg将外部DWG导出为位图,然后把这个位图贴到DC上。实现效果如下:
步骤一
新建一个项目,在资源编辑器中添加一对话框,对话框中拖入一个图片控件和按钮控件,其中图片控件为自绘控件(属性中type为Owner Draw)。
步骤二
在该对话框类头文件中添加变量
private:
CStatic m_wndPicPreview; //和图片控件关联
CString m_sFileName; //保存用户选择的文件名称
步骤三
在对话框类中添加按钮控件的BN_CLICKED消息响应函数,目的是当用户点击对话框“选择文件”按钮时,能够提示用户选择一个DWG文件。并将文件路径存储在m_sFileName 中。
void CDlgPreviewDWG::OnBnClickedBtnSelFile()
{
//第一种接口
//struct resbuf* result = acutNewRb(RTSTR);
//if (RTNORM == acedGetFileD(_T("请选择要预览的文件"), NULL, _T("dwg"), 33, result))
//第二种接口
const ACHAR * dlgname = _T("My File Dialog");
struct resbuf* result = NULL;
if (RTNORM == acedGetFileNavDialog(_T("请选择要预览的文件"), NULL, _T("dwg"), dlgname, 33, &result))
{
m_sFileName = result->resval.rstring;
m_wndPicPreview.Invalidate(); //重绘图片控件
}
acutRelRb(result);
}
然后,在对话框类中添加WM_DRAWITEM消息响应函数,由于图片控件为自绘控件,因此图片控件更新时会调用该函数,在该函数中,调用acdbGetPreviewBitmapFromDwg获取刚刚选择的外部DWG文件的位图,然后将这个位图贴到图片控件中。
void CDlgPreviewDWG::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_STC_PREVIEW_DWG && !m_sFileName.IsEmpty()) //如果发出消息的控件ID为图片控件的ID,则重绘图片控件
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//利用FromHandle接口得到DC
CRect rect;
rect = lpDrawItemStruct->rcItem;
HBITMAP hBitmap;
HPALETTE hPal;
if (acdbGetPreviewBitmapFromDwg(m_sFileName, &hBitmap, &hPal)) //利用该接口获取外部图形的位图句柄
{
// Palette
CPalette* oldPal = pDC->SelectPalette(CPalette::FromHandle(hPal), TRUE);
pDC->RealizePalette();
//在DC中画位图的步骤:1.创建位图;2.创建兼容DC;3.将位图选入兼容DC中;4.将兼容DC贴到当前DC中
CBitmap bmp; //步骤1:创建位图
bmp.Attach(hBitmap);
BITMAP bmpSize;
bmp.GetBitmap(&bmpSize);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC); //步骤2:创建兼容DC
CBitmap *pOldBitmap = dcCompatible.SelectObject(&bmp); //步骤3:将位图选入兼容DC中
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible,
0, 0, bmpSize.bmWidth, bmpSize.bmHeight, SRCCOPY); //步骤4:将兼容DC中的位图贴到当前DC中
dcCompatible.SelectObject(pOldBitmap);
pDC->SelectPalette(oldPal, TRUE);
pDC->RealizePalette();
DeleteObject(hPal);
}
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
[code]原文链接:https://blog.csdn.net/mary288267/article/details/120726946[/code] |
|