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