请教,如何把在gdi内存设备环境中绘制的图形保存下来供下一次绘制使用

SGUav 2013-06-17 01:02:20



是这样的,我利用内存设备环境实现双缓冲、高速,较复杂图形的绘制,刷新频率大概是 25fps,为了减小系统资源消耗,我想两帧间没有发生变化的图形就不进行绘制,而且在将前一次在主内存设备中绘制的图形复制保存到用于剪贴的内存设备环境2中,在本次绘制过程中重新复制到主内存设备环境中,在此基础上,仅仅对发生变化的图形进行绘制。这样就可以达到节省系统资源的目的。

但目前问题在于,似乎前一次绘制的图形未能复制到用于剪贴的内存设备环境2中,再从内存设备环境2复制回主内存设备环境中。

请问这个问题如何解决,谢谢!
...全文
91 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2013-07-17
  • 打赏
  • 举报
回复
如果你绘制时双缓冲模式, 那么改动比较小, 把内存DC 和内存位图 留着就可以, 下次绘制的时候在内存DC上绘制, 绘制完了贴图到目标DC
向立天 2013-07-17
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
dvlinker 2013-06-17
  • 打赏
  • 举报
回复
给LZ一段代码参考一下
dvlinker 2013-06-17
  • 打赏
  • 举报
回复
void CCatchScreenDlg::CopyCatchFileToClipboard( CString strFilePath )
{
	BSTR filePath = strFilePath.AllocSysString();
	Bitmap tempBmp( filePath );
	Color backColor;      
	HBITMAP hTmpBitmap = NULL;  
	tempBmp.GetHBITMAP( backColor, &hTmpBitmap );

	// 当XP系统的颜色设置为16位时,通过GetHBITMAP获取的位图是非兼容的,直接插入到richedit后会抛出
	// “存储空间不足,无法完成此操作”的异常,所以需要将位图转化成兼容的位图后再插入,2012/04/24
	CBitmap* pBitmap = CBitmap::FromHandle( hTmpBitmap );
	if ( pBitmap == NULL )
	{
		return;
	}

	// 获取位图信息,主要是尺寸信息
	BITMAP bitmap;
	pBitmap->GetBitmap( &bitmap );

	HDC hDC = ::GetDC( NULL ); // 获取桌面DC
	HDC hSrcDC = ::CreateCompatibleDC( hDC );
	::SelectObject( hSrcDC, hTmpBitmap ); // 将位图选进DC

	HDC hMemDC = ::CreateCompatibleDC( hDC ); // 为屏幕设备描述表创建兼容的内存设备描述表
	HBITMAP hBitmap = ::CreateCompatibleBitmap( hDC, bitmap.bmWidth,  bitmap.bmHeight ); // 创建一个与屏幕设备描述表兼容的位图
	::SelectObject( hMemDC, hBitmap ); 	// 把新位图选到内存设备描述表中

	::BitBlt( hMemDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hSrcDC, 0, 0, SRCCOPY );

	if( ::OpenClipboard( NULL ) )
	{
		::EmptyClipboard();
		::SetClipboardData( CF_BITMAP, hBitmap );
		::CloseClipboard();
	}

	::DeleteDC( hMemDC );
	::DeleteDC( hSrcDC );
	if ( hDC != NULL )
	{
		::ReleaseDC( NULL, hDC );
	}

	::DeleteObject( hBitmap );

	// Bitmap::GetHBITMAP返回的的位图句柄是该函数内部创建的,用完后要手动将之释放掉,否则会造成内存泄露,2013/06/09
	if ( hTmpBitmap != NULL )
	{
		DeleteObject( hTmpBitmap );
	}

	// 调用AllocSysString后要用SysFreeString释放掉,2013/06/09
	if ( filePath != NULL ) 
	{
		SysFreeString( filePath );
	}
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧