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