当用户选中复选框时,我必须将图像插入 MFC 对话框并在其上打印点。是否可以在 MFC 中的图像上绘制点?
谢谢。
尝试创建您自己的基于 CStatic 所有者绘制的控件来显示您的位图。当您收到 DrawItem 请求时,将原始位图加载到兼容的 DC 中。然后,您可以在 DC 上绘制您的修改,并在完成后将 DC BitBlt 到 DRAWITEMSTRUCT 信息中提供的实际屏幕 DC。
一步步。
基于 CStatic 创建一个名为 CMyPic 的新 MFC 控件
在对话框上放置一个图片控件(作为控件的占位符)
将图片控件的名称从IDC_STATIC更改为IDC_MYPIC
将控件的类型从“框架”更改为“所有者绘制”
右键单击控件并“添加变量”。使其成为一个名为 m_mypic 之类的控制变量,并将变量类型更改为 CMyPic。
在 CMyPic 中为 DrawItem 添加一个覆盖
在 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( );
}
这是可能的,但我强烈反对直接这样做。
通常,对话框应该只充当控件的容器。
因此,您可能想要的是某种分层绘图控件,它可以将位图显示为背景,并在其前面显示其他对象(点、可能的线、曲线等)。在 MFC 中编写一个 ActiveX 控件来做到这一点几乎是微不足道的。使用ATL有点困难,但并不多——从更小和(可能)更快的角度来看,结果几乎不可避免地会“更好”。