///
// 在 OnInitDialog() 时初始化相关数据 HDC hdcs; HBITMAP pBitmap; CBitmap m_bmp;
pBitmap = (HBITMAP)LoadImage(NULL,"图片.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
hdcs = CreateCompatibleDC(NULL);
m_bmp.Attach( pBitmap );
BITMAP bm;
m_bmp.GetBitmap(&bm);
CRect rtWindow;
GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bm.bmWidth;
rtWindow.bottom =rtWindow.top +bm.bmHeight;
MoveWindow(&rtWindow);
CClientDC dc(this);
SetupRegion(&dc,m_bmp,RGB(191,194,114) );
///
// 最后在 OnPaint 的else 里面
CClientDC dc(this);
CDC picDC;
picDC.CreateCompatibleDC (&dc);
CBitmap *pOldBmp;
pOldBmp = picDC.SelectObject (&m_bmp);
BITMAP bm;
m_bmp.GetBitmap(&bm);
dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY);
dc.SelectObject(pOldBmp);
///
// 下面是主代码
void CtextDemoDlg::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();
}