1

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

谢谢。

4

2 回答 2

1

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

一步步。

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

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

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

  4. 将控件的类型从“框架”更改为“所有者绘制”

  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( );
    }
    
于 2012-07-05T09:35:20.003 回答
0

这是可能的,但我强烈反对直接这样做。

通常,对话框应该充当控件的容器。

因此,您可能想要的是某种分层绘图控件,它可以将位图显示为背景,并在其前面显示其他对象(点、可能的线、曲线等)。在 MFC 中编写一个 ActiveX 控件来做到这一点几乎是微不足道的。使用ATL有点困难,但并不多——从更小和(可能)更快的角度来看,结果几乎不可避免地会“更好”。

于 2012-07-05T04:10:10.627 回答