如何绘制半透明位图

来源:互联网 发布:永恒之塔天族捏脸数据 编辑:程序博客网 时间:2024/05/17 06:12
使用时记得倒入Msimg32.lib 静态库啊,否则会报错的

void CAADlg::OnButton1()
{
    
  CDC DialogDC;
  CDC *pDC;
  pDC = GetDC();
  CBitmap b;
  b.LoadBitmap(IDB_BITMAP1);
  DialogDC.createCompatibleDC(pDC);
DialogDC.selectObject(b);
  CPen p;
  p.createPen(PS_SOLID,12,0x004422);
  DialogDC.FillSolidRect(0,0,145,143,0xf30332);
  DialogDC.TextOut(40,40,"fsdfsd");
  DialogDC.selectObject(p);
  DialogDC.MoveTo(0,0);
  DialogDC.LineTo(60,60);  

  BLENDFUNCTION bbf;
  bbf.AlphaFormat = 0;
  bbf.BlendFlags = 0;
  bbf.BlendOp = AC_SRC_OVER;
  bbf.SourceConstantAlpha = 111;
  AlphaBlend( pDC->GetSafeHdc(),0,0,100,100,DialogDC.GetSafeHdc(),0,0,100,190,bbf );

}

方法2:

#define GetR(pixel)  (((pixel) & 0x00ff0000) >> 16)
#define GetG(pixel)  (((pixel) & 0x0000ff00) >> 8)
#define GetB(pixel)   ((pixel) & 0x000000ff)


  CPaintDC dc(this);
  BITMAP bmpX,bmpY;

  CBitmap bmp1,bmp2;
  bmp2.LoadBitmap(IDB_BITMAP2);
  bmp1.LoadBitmap(IDB_BITMAP1);

  bmp1.GetBitmap(&bmpX);
  UINT* bmpBuffer=(UINT*)GlobalAlloc(GPTR,bmpX.bmWidthBytes*bmpX.bmHeight);
  bmp1.GetBitmapBits(bmpX.bmWidthBytes*bmpX.bmHeight,bmpBuffer);

  CDC memdc;
  memdc.createCompatibleDC(&dc);
  memdc.selectObject(bmp1);
  dc.BitBlt(10,10,bmpX.bmWidthBytes,bmpX.bmHeight ,&memdc,0,0,SRCCOPY);

  bmp2.GetBitmap(&bmpY);
  UINT* bmpBuffer2=(UINT*)GlobalAlloc(GPTR,bmpY.bmWidthBytes*bmpY.bmHeight);
  bmp2.GetBitmapBits(bmpY.bmWidthBytes*bmpY.bmHeight,bmpBuffer2);

  memdc.selectObject(bmp2);
  dc.BitBlt(200,10,bmpX.bmWidthBytes,bmpX.bmHeight ,&memdc,0,0,SRCCOPY);

  int nSize = bmpY.bmWidth*bmpY.bmHeight;
  double blend = 0.5;

  for (int i=0; i<nSize; i++)
  {
    int abR = (int) (GetR(bmpBuffer[i]) * blend + (1-blend) * GetR(bmpBuffer2[i]));
    int abG = (int) (GetG(bmpBuffer[i]) * blend + (1-blend) * GetG(bmpBuffer2[i]));
    int abB = (int) (GetB(bmpBuffer[i]) * blend + (1-blend) * GetB(bmpBuffer2[i]));

    bmpBuffer2[i] = RGB(abB, abG, abR);
  }

  bmp2.SetBitmapBits(bmpX.bmWidthBytes*bmpX.bmHeight, bmpBuffer2);

  memdc.selectObject(bmp2);
  dc.BitBlt(390,10,bmpX.bmWidthBytes,bmpX.bmHeight ,&memdc,0,0,SRCCOPY);

  GlobalFree((HGLOBAL)bmpBuffer);
  GlobalFree((HGLOBAL)bmpBuffer2);
  memdc.deleteDC();
   
原创粉丝点击