您的位置:首页 > 其它

VC透掉背景色

2015-07-06 14:44 274 查看
//透掉背景色

 //CBitmap   m_bit;

 //m_bit.LoadBitmap(strBmpPath);

 //HBITMAP bBit = (HBITMAP)m_bit.m_hObject;

 //if (GetObjectType(bBit) == OBJ_BITMAP)

 //{

 // CSize csBitmap = GetBitmapSize(bBit);

 // m_Bitmap.Attach(bBit);

 // CClientDC dc(this);

 // SetupRegion(&dc,m_Bitmap,RGB(255,0,255)); 

 // //调整到背景图片大小

 // CSize size = GetImageSize(BmpMain);

 // SetWindowPos(NULL,0,0,size.cx,size.cy,SWP_NOZORDER);

 //}

 

 

HBITMAP LoadResImageBMP(LPCTSTR bmpName)

{

 HBITMAP hBitmap = NULL;

 int tries = 3;

 

 //2009-12-05 by zhuhaiyan

 do

 {

  hBitmap = (HBITMAP)LoadImage(

   NULL, 

   GetResourcePath() + bmpName,

   IMAGE_BITMAP,

   0,

   0,

   (LR_CREATEDIBSECTION | LR_LOADFROMFILE)

   );

 } while (hBitmap ==  NULL && (tries--) > 0);

 return hBitmap;

}

 

CSize GetBitmapSize(HBITMAP hBitmap)

{

 if (hBitmap == NULL)

 {

  return CSize(0, 0);

 }

 PBITMAPINFO pBtimapInfo;

 if (!GetBitmapHeaderInfo(hBitmap, pBtimapInfo))

 {

  return 0;

 }

 UINT nWidth = pBtimapInfo->bmiHeader.biWidth;

 UINT nHeight = pBtimapInfo->bmiHeader.biHeight;

 CSize csBitmap(nWidth, nHeight);

 if (pBtimapInfo)

 {

  free(pBtimapInfo);

 }

 return csBitmap;

}

void SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)

{

 CDC memDC;

 //创建与传入DC兼容的临时DC

 memDC.CreateCompatibleDC(pDC);

 CBitmap *pOldMemBmp=NULL;

 //将位图选入临时DC

 pOldMemBmp=memDC.SelectObject(&cBitmap);

 CRgn wndRgn;

 //创建总的窗体区域,初始region为0

 wndRgn.CreateRectRgn(0,0,0,0);

 BITMAP bit;  

 cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽    

 int y;

 for(y=0;y<=bit.bmHeight  ;y++)

 {

  CRgn rgnTemp; //保存临时region

  int iX = 0;

  do

  {

   //跳过透明色找到下一个非透明色的点.

   while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) == TransColor)

    iX++;

   //记住这个起始点

   int iLeftX = iX;

   //寻找下个透明色的点

   while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) != TransColor)

    ++iX;

   //创建一个包含起点与重点间高为1像素的临时“region”

   rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

   //合并到主"region".

   wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

   //删除临时"region",否则下次创建时和出错

   rgnTemp.DeleteObject();

  }while(iX <bit.bmWidth );

  iX = 0;

 }

 if(pOldMemBmp)

  memDC.SelectObject(pOldMemBmp);

 CWnd * pWnd = pDC->GetWindow();

 pWnd->SetWindowRgn(wndRgn,TRUE);   

 pWnd->SetForegroundWindow();   

}

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: