绘图知识

创建空白画刷 (使用系统预留画刷,不用删除,不会内存泄漏)

画刷用来填充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两个函数解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值