双缓存显示问题以及图片

本文介绍了在Windows应用程序中如何处理双缓存显示问题,特别是当需要显示图片或文字时。代码示例展示了如何使用CDC、CBitmap和CClientDC创建兼容位图,实现内存DC与屏幕DC之间的位图传输。当图片不存在时,程序会显示提示文字。此外,还涉及到 StretchBlt 函数用于拉伸位图以适应目标矩形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	if (!pdc)
		return;

	CClientDC dc(this);

	CRect rect; 
	GetClientRect(rect); 

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc); 

	CBitmap MemBitmap; 
	

	if(GetFileAttributes(m_strFileName) == INVALID_FILE_ATTRIBUTES)//显示文字
	{
		MemBitmap.CreateCompatibleBitmap(pdc,rect.right,rect.bottom); 

		CBitmap* pOldBitmap = (CBitmap*)MemDC.SelectObject(&MemBitmap);

		MemDC.FillSolidRect(&rect,RGB(0xFA, 0xFA, 0xFA)); 
		static CBrush brFrame(RGB(202, 202, 202));
		MemDC.FrameRect(rcBounds, &brFrame);

		MemDC.SetTextColor(RGB(128, 128, 128));

		MemDC.SetBkMode(TRANSPARENT);

		CString sTextOut(_T("未扫描到图片"));

		CRect rcTextOut(rect);
		const int iTextHeight = MemDC.DrawText(sTextOut, CRect(rcTextOut), DT_CALCRECT | DT_CENTER | DT_WORDBREAK | DT_EDITCONTROL);

		rcTextOut.DeflateRect(0, (rcTextOut.Height() - iTextHeight) / 2);

		MemDC.DrawText(sTextOut, rcTextOut, DT_CENTER | DT_SINGLELINE|DT_WORDBREAK | DT_EDITCONTROL);

		pdc->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);

		MemDC.SelectObject(pOldBitmap);

		MemDC.DeleteDC();

		DeleteObject(MemBitmap); 

		return;
	}
	//显示图片

	

         

	/*HBITMAP hbmp;//LoadImage加载png图片

	hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
		m_strFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
	if( hbmp == NULL ) 
	{
		return;
	}*/

	CImage imgTemp;
	imgTemp.Load(m_strFileName);
	if ( MemBitmap.m_hObject ) MemBitmap.Detach();
	MemBitmap.Attach(imgTemp.Detach());

	//MemBitmap.Attach( hbmp );
	
	DIBSECTION ds;
	BITMAPINFOHEADER &bminfo = ds.dsBmih; 
	MemBitmap.GetObject( sizeof(ds), &ds );


	MemDC.SelectObject(&MemBitmap);    //连接位图

	pdc->SetStretchBltMode(HALFTONE);
	pdc->StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,bminfo.biWidth,bminfo.biHeight,SRCCOPY);

	MemDC.DeleteDC();

	DeleteObject(imgTemp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值