天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 64|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
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]

 

 

 

 

ObjectARX中如何实现对外部图形的预览
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:38 , Processed in 0.121649 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表