关于MFC的游戏开发学习(四) 双缓冲技术及透明png图片处理

双缓冲技术:

双缓冲技术就是通俗理解:由于绘制图像要绘制多次,刷新多次,刷新一次显示一次,就导致屏幕闪烁。双缓冲就是一次性在缓冲里把图像全部绘制一遍,最后再统一进行一次显示,就不会出现闪烁了。

CRect rectWnd;
GetWindowRect(rectWnd);
ScreenToClient(&rectWnd);
CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);
m_pMemDC->FillSolidRect(&rectWnd, RGB(255, 255, 255));
CDC *dc = this->GetDC();//获取当前dc

/*添加要绘制的
如:
CString str;
m_pMemDC->SetBkMode(TRANSPARENT);//设置透明背景
str.Format(_T("当前命数:%d"), ZHAN.life);
m_pMemDC->TextOutA(10, 0, str);
str.Format(_T("当前得分:%d"), ZHAN.score);
m_pMemDC->TextOutA(10, 25, str);
*/

dc->BitBlt(rect.left, rect.top, m_nScreenX, m_nScreenY, m_pMemDC, rect.left, rect.top, SRCCOPY);//绘制
m_pMemDC->SelectObject(pOldBitmap);

透明png图片处理:

使用CImage显示透明的PNG图片

CImage 的AlphaBlend 函数可以显示半透明或透明的图片, 但是当使用这个函数显示PNG 图片时, 经常会发现PNG 图片的背景没有透明, 而是被显示为白色.

只用修改CImage 中像素的颜色, 就可以实现透明与半透明的效果了, 代码如下:

void CSample::Draw(CDC* pDC, int iX, int iY)
{
//m_stImage 为CImage 的对象
    for(int i = 0; i < m_stImage.GetWidth(); ++i)
    {
        for(int j = 0; j < m_stImage.GetHeight(); ++j
        {
            unsigned char* pucColor = m_stImage.GetPixelAddress(i , j);
            pucColor[0] = pucColor[0] * pucColor[3] / 255;
            pucColor[1] = pucColor[1] * pucColor[3] / 255;
            pucColor[2] = pucColor[2] * pucColor[3] / 255;
        }
     }
    m_stImage.AlphaBlend(pDC->m_hDC, iX, iY);      
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值