在图像visual c ++上绘制点

时间:2012-07-05 03:58:36

标签: visual-c++ mfc drawing

当用户选中复选框时,我必须将图像插入MFC对话框并在其上打印点。是否可以在MFC中的图像上绘制点?

感谢。

2 个答案:

答案 0 :(得分:1)

尝试创建自己的CStatic所有者绘制控件,以显示您的位图。当您获得DrawItem请求时,将原始位图加载到兼容的DC中。然后,您可以在DC上绘制您的修改,并在完成BitBlt时将DC转换为DRAWITEMSTRUCT信息中提供的实际屏幕DC。

一步一步。

  1. 基于CStatic创建一个名为CMyPic的新MFC控件

  2. 在对话框上放置一个Picture控件(作为控件的占位符)

  3. 将图片控件的名称从IDC_STATIC更改为IDC_MYPIC

  4. 将控件的类型从“Frame”更改为“Owner Draw”

  5. 右键单击控件和“添加变量”。使它成为一个名为m_mypic的控制变量,并将变量类型更改为CMyPic。

  6. 在CMyPic中为DrawItem添加覆盖

  7. 在DrawItem中,您可以绘制您的位图(在我的情况下,我绘制的是PNG并覆盖一些文本),如下所示:

    void CMyPic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){
    
        CPngImage img;
        img.Load( IDB_PNG1 );
    
        CDC dcScreen;
        dcScreen.Attach( lpDrawItemStruct->hDC );
    
        CDC dcMem;
        dcMem.CreateCompatibleDC( &dcScreen );
        CBitmap * pold = (CBitmap*)dcMem.SelectObject( img );
    
        dcMem.DrawText( L"Hi", &lpDrawItemStruct->rcItem, NULL );
    
        dcScreen.BitBlt( 0, 0, lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom, &dcMem, 0, 0, SRCCOPY );
    
        dcMem.SelectObject( pold ); 
        dcScreen.Detach( );
    }
    

答案 1 :(得分:0)

这是可能的,但我强烈不鼓励直接这样做。

通常,对话框应作为控件的容器。

因此,您可能想要的是某种分层绘图控件,它可以将位图显示为背景,并在其前面显示其他对象(点,可能是线,曲线等)。在MFC中编写一个ActiveX控件来完成边界操作。使用ATL是一个很难的,但并不多 - 从较小和(可能)更快的角度来看,结果几乎不可避免地“更好”。