内存泄露老问题 找出分数大大的有!

qq14923349 qq14923349 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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();
...全文
评论 10
收藏 已收藏
分享
返回顶部
qq14923349
嵌入开发(WinCE) 19,524 成员 41,565 内容