ObjectARX中如何实现对外部图形的预览

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);
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值