我得到一个类,它可以把图中的某一颜色去掉后透明的显示出来。
         CDC *pDC;
CBitmap pButton;
pDC = GetDC();
pButton.LoadBitmap(IDB_BITMAP3);

m_oTransBmp.SetSrcBitmap(&pButton);
m_oTransBmp.SetTransColor(RGB(0xff, 0xff, 0xff));
m_oTransBmp.SetTargetDC(pDC);
m_oTransBmp.TransBlt(pDC,0,0);它是直接把图透明的画出来,我想先得到透明的图, 我增加了GetTraBitmap();
帮我看一下GetTraBitmap();,我写错什么了。
CBitmap pButton,*ptrbitmap;
CDC dcForCross; 
CDC *pDC; pDC = GetDC();
pButton.LoadBitmap(IDB_BITMAP3); m_oTransBmp.SetSrcBitmap(&pButton);
m_oTransBmp.SetTransColor(RGB(0xff, 0xff, 0xff));
m_oTransBmp.SetTargetDC(pDC);
ptrbitmap=m_oTransBmp.GetTraBitmap();
     dcForCross.CreateCompatibleDC(pDC); 
dcForCross.SelectObject(ptrbitmap); 
pDC->BitBlt(0,100,40,20,&dcForCross,0,0,SRCCOPY);
但是它不画出来。// DrawTransBmp.cpp: implementation of the CDrawTransBmp class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "DrawTransBmp.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CDrawTransBmp::CDrawTransBmp()
{
m_clrTransColor = RGB(0xc0, 0xc0, 0xc0);
m_hBitmap = NULL;
m_nBitmapID = -1;
m_pBitmap = NULL;
m_pTargetDC = NULL;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false;
}CDrawTransBmp::~CDrawTransBmp()
{}CBitmap * CDrawTransBmp::SetSrcBitmap(CBitmap *pBitmap)
{
CBitmap *pOldBmp; pOldBmp = m_pBitmap;
m_pBitmap = pBitmap;
m_hBitmap = (HBITMAP)m_pBitmap->m_hObject;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false;
m_sizeBitmap = GetBitmapSize(m_hBitmap); return pOldBmp;
}HBITMAP CDrawTransBmp::SetSrcBitmap(HBITMAP hBitmap)
{
HBITMAP hOldBmp; hOldBmp = m_hBitmap;
m_hBitmap = hBitmap;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false;
m_sizeBitmap = GetBitmapSize(m_hBitmap); return hOldBmp;
}int CDrawTransBmp::SetSrcBitmap(int nBitmapID)
{
int nOldBmpID; nOldBmpID = m_nBitmapID;
m_nBitmapID = nBitmapID;
m_bmpBitmap.LoadBitmap(m_nBitmapID);
m_hBitmap = m_bmpBitmap;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false;
m_sizeBitmap = GetBitmapSize(m_hBitmap);

return nOldBmpID;
}COLORREF CDrawTransBmp::SetTransColor(COLORREF clr)
{
COLORREF clrOld; clrOld = m_clrTransColor;
m_clrTransColor = clr;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false; return clrOld;
}CBitmap *CDrawTransBmp::GetAndMask()
{
if(m_pTargetDC && m_hBitmap && !m_bAndMaskCreated)
{
CBitmap *pOldBitmap;
CBitmap *pOldAndBitmap; if(m_bmpAndMask.m_hObject)
m_bmpAndMask.DeleteObject();
m_bmpAndMask.CreateBitmap(m_sizeBitmap.cx, m_sizeBitmap.cy, 1, 1, NULL);
pOldAndBitmap = m_cdcAndMask.SelectObject(&m_bmpAndMask);
pOldBitmap = m_cdcHolder.SelectObject(CBitmap::FromHandle(m_hBitmap));
m_cdcHolder.SetBkColor(m_clrTransColor);
m_cdcAndMask.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &m_cdcHolder, 0, 0, NOTSRCCOPY);
m_cdcAndMask.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &m_cdcAndMask, 0, 0, NOTSRCCOPY);
m_cdcAndMask.SelectObject(pOldAndBitmap);
m_cdcHolder.SelectObject(pOldBitmap);
m_bAndMaskCreated = true;
}
return &m_bmpAndMask;
}CDC * CDrawTransBmp::SetTargetDC(CDC *pDC)
{
CDC *pOldDC; pOldDC = m_pTargetDC;
m_pTargetDC = pDC;
m_bAndMaskCreated = false;
m_bXorMaskCreated = false;
if(m_cdcHolder.GetSafeHdc())
m_cdcHolder.DeleteDC();
m_cdcHolder.CreateCompatibleDC(pDC);
if(m_cdcAndMask.GetSafeHdc())
m_cdcAndMask.DeleteDC();
m_cdcAndMask.CreateCompatibleDC(m_pTargetDC);
if(m_cdcXorMask.GetSafeHdc())
m_cdcXorMask.DeleteDC();
m_cdcXorMask.CreateCompatibleDC(m_pTargetDC);

return pOldDC;
}CSize CDrawTransBmp::GetBitmapSize(HBITMAP hBitmap)
{
BITMAP oBitmap; ::GetObject(hBitmap, sizeof BITMAP, &oBitmap);
return CSize(oBitmap.bmWidth, oBitmap.bmHeight);
}CSize CDrawTransBmp::GetBitmapSize(CBitmap *pBitmap)
{
BITMAP oBitmap; pBitmap->GetBitmap(&oBitmap);
return CSize(oBitmap.bmWidth, oBitmap.bmHeight);
}
CBitmap * CDrawTransBmp::GetXorMask()
{
if(m_pTargetDC && m_hBitmap && !m_bXorMaskCreated)
{
CBitmap *pOldBitmap;
CBitmap *pOldBitmapNot;
CBitmap *pOldXorBitmap;
CBitmap bmpNotMask;
CDC cdcNotMask; if(m_bmpXorMask.m_hObject)
m_bmpXorMask.DeleteObject();
m_bmpXorMask.CreateCompatibleBitmap(m_pTargetDC, m_sizeBitmap.cx, m_sizeBitmap.cy);
pOldXorBitmap = m_cdcXorMask.SelectObject(&m_bmpXorMask); bmpNotMask.CreateBitmap(m_sizeBitmap.cx, m_sizeBitmap.cy, 1, 1, NULL);
cdcNotMask.CreateCompatibleDC(m_pTargetDC);
pOldBitmapNot = cdcNotMask.SelectObject(&bmpNotMask);

pOldBitmap = m_cdcHolder.SelectObject(CBitmap::FromHandle(m_hBitmap));
m_cdcHolder.SetBkColor(m_clrTransColor);
m_cdcHolder.SetBkColor(m_clrTransColor); cdcNotMask.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &m_cdcHolder, 0, 0, NOTSRCCOPY);
m_cdcXorMask.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &m_cdcHolder, 0, 0, SRCCOPY);
m_cdcXorMask.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &cdcNotMask, 0, 0, SRCAND); m_cdcXorMask.SelectObject(pOldXorBitmap);
m_cdcHolder.SelectObject(pOldBitmap);
cdcNotMask.SelectObject(pOldBitmapNot);
m_bXorMaskCreated = true;
}
return &m_bmpXorMask;
}void CDrawTransBmp::TransBlt(CDC *pDC, int nXStart, int nYStart, int nWidth, int nHeight)
{
CBitmap     pNewBmp;
CBitmap *pAndMask;
CBitmap *pXorMask;
CDC cdcMem;
CBitmap *pOldBmp;
CSize size; if(nWidth < 0)
size.cx = m_sizeBitmap.cx;
else
size.cx = nWidth;
if(nHeight < 0)
size.cy = m_sizeBitmap.cy;
else
size.cy = nHeight; if(pDC == NULL)
pDC = m_pTargetDC;

pAndMask = GetAndMask();
pXorMask = GetXorMask();
cdcMem.CreateCompatibleDC(pDC);
pOldBmp = cdcMem.SelectObject(pAndMask);
pDC->BitBlt(nXStart, nYStart, size.cx, size.cy, &cdcMem, 0, 0, SRCAND);
cdcMem.SelectObject(pXorMask);
pDC->BitBlt(nXStart, nYStart, size.cx, size.cy, &cdcMem, 0, 0, SRCINVERT);
cdcMem.SelectObject(pOldBmp);

}CBitmap *CDrawTransBmp::GetTraBitmap()  //我增加的
{
CBitmap     pNewBmp;
CBitmap *pAndMask,*pXorMask;
CDC cdcMem;
CBitmap *pOldBmp;
CSize size;
CDC         *pDC;
size.cx = m_sizeBitmap.cx;
size.cy = m_sizeBitmap.cy;
// if(pDC == NULL)
pDC = m_pTargetDC;
pNewBmp.CreateBitmap(m_sizeBitmap.cx, m_sizeBitmap.cy, 1, 1, NULL);

pAndMask = GetAndMask();
pXorMask = GetXorMask();
cdcMem.CreateCompatibleDC(pDC);
pOldBmp = cdcMem.SelectObject(pAndMask);
pDC->SelectObject(&pNewBmp);
pDC->BitBlt(0,0, size.cx, size.cy, &cdcMem, 0, 0, SRCAND);
cdcMem.SelectObject(pXorMask);
pDC->BitBlt(0,0, size.cx, size.cy, &cdcMem, 0, 0, SRCINVERT);
cdcMem.SelectObject(pOldBmp);
return &pNewBmp;
}