创建空白画刷 (使用系统预留画刷,不用删除,不会内存泄漏)
画刷用来填充Rect 里面的区域。
DrawText要设置背景需要setbkmode,setbkcolor.
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));// 创建透明画刷 ;
CBrush *pOldBrush=m_pDC->SelectObject(pBrush);
m_pDC->Rectangle(&rcText);
m_pDC->DrawText(strText,&rcText,0);
m_pDC->SelectObject(pOldBrush);
//创建透明位图
http://www.vckbase.com/document/viewdoc/?id=532
注意,位图资源大小一定要正确,否则肯定出错。
CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_BMP_TEST);
CDC ImageDC;
ImageDC.CreateCompatibleDC(m_pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);
TransparentBlt(m_pDC->m_hDC, 0, 0, 48, 48, ImageDC.m_hDC, 0, 0, 48, 48, RGB(0,0,0xff));
ImageDC.SelectObject(pOldImageBMP);
//兼容dc : 指可以和某种特定的具体DC兼容,然后可以传递给那个DC使用。
可以剪切源图片,但是要保证 偏移+剪切后图片参数相加 = 源图片正常参数。 参数 = x 或 y
//一次性载入一组CBitmap
for(int i = eBoy_left ; i <= eBoy_dead ;++i)
{
m_vecPBitmap.push_back(new CBitmap);
switch (i)
{
case eBoy_left:
m_vecPBitmap[i]->LoadBitmap(IDB_BMP_BOY_LEFT);
break;
case eBoy_center:
m_vecPBitmap[i]->LoadBitmap(IDB_BMP_BOY_CENTER);
break;
case eBoy_right:
m_vecPBitmap[i]->LoadBitmap(IDB_BMP_BOY_RIGHT);
break;
case eBoy_dead:
m_vecPBitmap[i]->LoadBitmap(IDB_BMP_BOY_DEAD);
break;
}
CBoy::~CBoy(void)
{
}
void CBoy::BoyDraw()
{
CDC ImageDC;
ImageDC.CreateCompatibleDC(m_pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(m_vecPBitmap[m_eBoyState]);
TransparentBlt(m_pDC->m_hDC, m_x - m_iXSub , m_y - m_iYSub , 80, 80, ImageDC.m_hDC, 0, 0, 128, 128, RGB(255,255,255));
ImageDC.SelectObject(pOldImageBMP);
DeleteObject(ImageDC);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));// 创建透明画刷 ;
CBrush *pOldBrush=m_pDC->SelectObject(pBrush);
m_pDC->Rectangle(m_x ,m_y ,m_x + m_cx , m_y + m_cy );
}
//双缓冲
if(!m_bHasInitData)
{
m_bHasInitData = TRUE;// 只初始化一次,主要保证 initdata和CDC对象等只一次就够了;
m_pDC = GetDC();
m_pMemDC = new CDC ; //首先定义一个显示设备对象;
m_pMemBitmap = new CBitmap;//定义一个位图对象;
InitData();// 保证了game->m_pMemDC,m_pDlg,m_pGameRect是正确的 ,并构造 一系列对象;
// 兼容DC和Bitmap ;
m_pMemDC->CreateCompatibleDC(m_pDC);
m_pMemBitmap->CreateCompatibleBitmap(m_pDC,m_rcGame.Width(),m_rcGame.Height());
m_pMemDC->SelectObject(m_pMemBitmap);
}
//绘图在m_pMemDc上,通过InitData()传给别m_pGame的成员保存了;
m_pGame->GameDraw();
m_pDC->BitBlt(0, 0,m_rcGame.Width(),m_rcGame.Height(), m_pMemDC, 0, 0, SRCCOPY); //将内存中的图拷贝到屏幕上进行显示;
}
}
//载入位图,并且使用stretchblt拉伸压缩图片不失真!
CDC dcMem;
dcMem.CreateCompatibleDC(m_pDC);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BMP_BK); //IDB_BITMAP是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
SetStretchBltMode(m_pDC->m_hDC,STRETCH_HALFTONE);////不失真之关键
m_pDC->StretchBlt(0,100,5500,300,&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
//切割,拉伸,压缩图片,都可以由bitblt 或 stretchblt两个函数解决。