内存泄露老问题 找出分数大大的有!
CClientDC dc(this);
CRect rect;
dlg->GetWindowRect(&rect);
int real_x = rect.left;
int real_y = rect.top;
int real_width = rect.Width();
int real_Height = rect.Height();
CDC dcmem,dcmem2;
dcmem.CreateCompatibleDC(&dc);
dcmem2.CreateCompatibleDC(&dc);
CBitmap Bkbitmap;
Bkbitmap.LoadBitmap(IDB_strenchBK); //IDB_BlackLamp
BITMAP bmpInfo;
Bkbitmap.GetBitmap(&bmpInfo);
CBitmap* pOldBitmap = dcmem.SelectObject(&Bkbitmap);
CRect srect;
GetWindowRect(&srect);
int s_x = srect.left;
int s_y = srect.top -40;
int s_width = srect.Width();
int s_Height = srect.Height();
CBitmap Tempbmp;
Tempbmp.CreateCompatibleBitmap(&dc,srect.Width(),srect.Height() );
CBitmap *mem2oldbmp = dcmem2.SelectObject(&Tempbmp);
dcmem2.StretchBlt(0,0,srect.Width(),srect.Height(),&dcmem,0,s_y,bmpInfo.bmWidth,srect.Height(),SRCCOPY);
//----------------------
CDC dcImage, dcTrans;
dcImage.CreateCompatibleDC(&dc);
dcTrans.CreateCompatibleDC(&dc);
//装入欲显示的位图
CBitmap BlackLamp; HBITMAP hbitmap;
switch(state){
case lp_Gray:BlackLamp.LoadBitmap(IDB_BlackLamp); break;
case lp_Green:BlackLamp.LoadBitmap(IDB_GreenLamp);break;
case lp_Red:BlackLamp.LoadBitmap(IDB_RedLamp);break;
}
//取得位图的详细信息
BITMAP bm;
BlackLamp.GetBitmap(&bm);
int nWidth =bm.bmWidth;
int nHeight =bm.bmHeight;
CBitmap* pOldBitmapImage2 = dcImage.SelectObject(&BlackLamp);
// 建立与欲显示的位图等大的单色的位图,用来过滤背景色
CBitmap bitmapTrans;
//“面具”就在这步做好
bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);
//强行将欲显示的位图的背景色设为白色,以方便建立dcTrans,这步很重要。如果你的
//位图的背景色不是白色的,你只需要修改这一步的参数
dcImage.SetBkColor(RGB(255,255,255));
dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);
//在dcTrans中,背景色变为白色,而主要图像的各种色彩都被设成黑色
//显示“面具”,这步主要目的在于让你更能够明白“面具”的真面目
//pDC->BitBlt(0, bm.bmHeight, nWidth, nHeight, &dcTrans, 0, 0,SRCCOPY);
dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0,SRCINVERT);
//该步将源位图与目标区域进行异或操作
dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);
//通过dcTrans与目标区域进行“与”操作, 建立了与主要图像轮廓一致的黑框
//以保护图片的主要内容不会改变
dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
//----------------------
dc.BitBlt(0,0,srect.Width(),srect.Height(),&dcmem2,0,0,SRCCOPY);
//////////释放
dcmem2.SelectObject(mem2oldbmp); Tempbmp.DeleteObject(); dcmem2.DeleteDC();
dcTrans.SelectObject(pOldBitmapTrans); bitmapTrans.DeleteObject(); dcTrans.DeleteDC();
dcImage.SelectObject(pOldBitmapImage2); BlackLamp.DeleteObject(); dcImage.DeleteDC();
dcmem.SelectObject(pOldBitmap); Bkbitmap.DeleteObject(); dcmem.DeleteDC();