MFC 使用 TransparentBlt() 在背景图的基础上画东西

项目背景:

假设现在在我的代码中,有:

  1. CDC里面已经存有一个背景图,背景图的坐标系是它自己;
  2. 两个点坐标,坐标系是相对于软件全界面,

需求:我需要在这个背景图上使用这两个点的坐标绘制一条直线。

方案1:直接在CDC上面绘制

好处:简单直接
坏处:需要分别将点的坐标系进行变换,然后才能绘制正确。但是因为我在软件其它地方又得使用软件全界面坐标系,所以这个变换对我来说不够理想。

方案2:使用TransparentBlt()另外绘制一个DC,然后贴在原先的CDC上面。

好处:无需转变坐标系,只需保证新DC上里的bitmap跟背景图大小一致就行

需求实现

/** Show red lines of b-mode capture images
 *
 *	@param[in]	MemDC - 已经绘制好背景图的 CDC 
 *				displayRect - 背景图的 CRect
 *
 *	@author:	Ashui
 *	@date:		2022-07-16
 */
			HBITMAP		m_hBufferDCBitmap;
			CDC BufferDC;
			BITMAPINFO   bmi;										// The Bitmap info to define the parameter in each frame and create the HBitmap handle 
			LPBYTE   pBits;											// The buffer pointer for creating the HBitmap handle

			// 0. Create BitmapInfo for 24-bits
			ZeroMemory(&bmi, sizeof(bmi));
			bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
			bmi.bmiHeader.biWidth = displayRect.Width();
			bmi.bmiHeader.biHeight = displayRect.Height();
			bmi.bmiHeader.biPlanes = 1;
			bmi.bmiHeader.biBitCount = 24;
			bmi.bmiHeader.biCompression = BI_RGB;

			// 1. Build Buffer Bitmap with 24-bits
			m_hBufferDCBitmap = CreateDIBSection(MemDC->GetSafeHdc(), &bmi, DIB_RGB_COLORS, (void**)&pBits, 0, 0);

			// 2. Attach BufferDC
			BufferDC.CreateCompatibleDC(MemDC);
			BufferDC.SelectObject(m_hBufferDCBitmap);

			// 3. Set background color
			// NOTE: Don't use SetBkColor(BufferDC.GetSafeHdc(), RGB(0, 0, 255)) 
			BufferDC.FillSolidRect(0, 0, displayRect.Width(), displayRect.Height(), RGB(0, 0, 255));
			
			// 4. Draw Lines
			LOGBRUSH logBrush;
			logBrush.lbStyle = BS_SOLID;
			logBrush.lbColor = RGB(0, 255, 255);
			CPen linePen(PS_DASH | PS_GEOMETRIC | PS_ENDCAP_ROUND, 5, &logBrush);

			BufferDC.SelectObject(linePen);
			
			CPoint strpt(0, 100), endpt(0, 200);
			BufferDC.MoveTo(strpt);
			BufferDC.LineTo(endpt);

			// 5. Draw transparent lines
			TransparentBlt(MemDC->GetSafeHdc(), displayRect.left, displayRect.top, displayRect.Width(), displayRect.Height(), BufferDC.GetSafeHdc(), 0, 0, displayRect.Width(), displayRect.Height(), RGB(0, 0, 255));

效果

背景 背景图
在这里插入图片描述 效果图

注意

设置贴图的背景色时,只能用 FillSolidRect() , 不能用 SetBkColor() ,否则背景图会被完全覆盖掉,只剩下绘制的线!

猜你喜欢

转载自blog.csdn.net/A_water_/article/details/127693601