https://blog.csdn.net/a42795761/article/details/526800721
加载图片作为画布背景
原理是通过brush加载图片作为brush然后通过selectobject的方式加载成为画布
代码如下:
void LoadScrollBitmapEx(CString strImagePath, CRect rtPostion,CDC* pInDC)
{
if (strImagePath.IsEmpty()) // 代码路径的有效性
{
return ;
}
CImage img;
img.Load(strImagePath); // 通过image加载图片,避免多格式图片不能加载的情况
if (img.IsNull())
{
return ;
}
HBITMAP hbmp =(HBITMAP)img.operator HBITMAP(); // 创建bitmap
CBitmap* MemBitmap = CBitmap::FromHandle(hbmp);
CDC tmpdc;
CBitmap Bitmaptmp;
tmpdc.CreateCompatibleDC(m_pCDC); // 创建临时的dc
Bitmaptmp.CreateCompatibleBitmap(m_pCDC, rtPostion.Width(),rtPostion.Height());
BITMAP bmp;
MemBitmap->GetBitmap(&bmp);// 加载图片
CBrush brush(MemBitmap); // 创建brush
tmpdc.SelectObject(Bitmaptmp);
tmpdc.FillRect(CRect(0,0, bmp.bmWidth,bmp.bmHeight),&brush);// 把填充dc
brush.DeleteObject();
// 把dc拷贝到对应的输出dc上
if (NULL == pInDC)
{
m_pDC.BitBlt(rtPostion.left, rtPostion.top, bmp.bmWidth,bmp.bmHeight,&tmpdc,0,0,SRCCOPY);
}else
{
pInDC->BitBlt(rtPostion.left, rtPostion.top, bmp.bmWidth,bmp.bmHeight,&tmpdc,0,0,SRCCOPY);
}
tmpdc.DeleteDC();
Bitmaptmp.DeleteObject();
img.Destroy();
}
效果自己测试
2 加载PNG图片, 透明背景:
void LoadImageEx(CString strImagePath, int x, int y, CDC& pdc)
{
CImage Image;
Image.Load(strImagePath);
if (Image.IsNull())
{
::AfxMessageBox(_T("没加载成功"));
return ;
}
if (Image.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i = 0; i < Image.GetWidth(); i++)
{
for (j = 0; j < Image.GetHeight(); j++)
{
byte *pByte = (byte *)Image.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
Image.Draw(pdc.GetSafeHdc(), x, y);
Image.Destroy();
}
// 此处加载的图片大小是原始图片大小
3 等比缩放加载图片
void PaintImageDC(CString strImagePath,CRect rtPos, CDC*& dc)
{
CImage pic;
pic.Load(strImagePath);
dc->SetStretchBltMode(HALFTONE);
pic.Draw(dc->GetSafeHdc(),rtPos);
}
// 此时加载的图片是原始大小加载,但是按照传入的矩形区域进行绘制
4 等比缩放加载透明图片
void CBodyMark::LoadMarkImage(CString strImagePath, int x, int y, CDC* pInDC)
{
if (strImagePath.IsEmpty())
{
return;
}
m_img.Load(strImagePath);
if (m_img.IsNull())
{
MessageBox(_T("没加载成功"));
return ;
}
if (m_img.GetBPP() == 32) //确认该图像包含Alpha通道
{
int i;
int j;
for (i = 0; i < m_img.GetWidth(); i++)
{
for (j = 0; j < m_img.GetHeight(); j++)
{
byte *pByte = (byte *)m_img.GetPixelAddress(i, j);
pByte[0] = pByte[0] * pByte[3] / 255;
pByte[1] = pByte[1] * pByte[3] / 255;
pByte[2] = pByte[2] * pByte[3] / 255;
}
}
}
if (NULL == pInDC)
{
m_img.Draw(m_pCDC->m_hDC, x, y);
}else{
m_img.Draw(pInDC->m_hDC, x, y);
}
m_img.Destroy();
}