CDC画图_yuan1988219_新浪博客

https://blog.csdn.net/a42795761/article/details/52680072

加载图片作为画布背景

  原理是通过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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值