急急急,求各位大神 给解啊!!!!!
下面这个函数 有点错误,造成DC泄露,我只要在函数的retrun前调用一下pDC_Mem->DeleteDC(); 问题就解决了,但是我是想把pDC_Mem 传到外面用呢 所以在return前 调用pDC_Mem->DeleteDC(); 就起不到效果了, 但是在我用完了pDC_Mem之后 马上调用释放 pDC_Mem,也释放成功了,但是为啥 还是存在泄露 重复调用几次GetParentDC() ,界面就卡死了,我就想问下,pDC_Mem 这个cdc 在函数外面释放 为啥引来内存泄露啊。
int CG3WLan_WMDlg::GetParentDC( CDC *pDC_Mem )
{
//return 0;
//CDC *pDC;//屏幕DC
//pDC = this->GetDesktopWindow()->GetDC();
//pDC = GetWindowDC();
/*CFrameWnd * pfrm = GetTopLevelFrame();
CWindowDC DC(pfrm);*/
//CClientDC DC(this);
CPaintDC DC(this);
int Width = GetSystemMetrics( SM_CXSCREEN );
int Height = GetSystemMetrics( SM_CYSCREEN );
//建立和屏幕兼容的bitmap
CBitmap memBitmap;
CBitmap *oldmemBitmap;
memBitmap.CreateCompatibleBitmap(&DC, Width, Height);
pDC_Mem->DeleteDC();
pDC_Mem->CreateCompatibleDC(&DC);
oldmemBitmap = pDC_Mem->SelectObject(&memBitmap);//将memBitmap选入内存DC
pDC_Mem->BitBlt(0, 0, Width, Height, &DC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC
return 0;
}
[解决办法]
"pDC_Mem->DeleteDC();
pDC_Mem->CreateCompatibleDC(&DC);"
怎么先
DeleteDC()再创建?
[解决办法]
GetParentDC是在哪儿调用的?照理说CPaintDC只能在OnPaint中使用的。
OnPaint以外的时候,可以使用GetDC获取窗口的常驻DC,但是用完了要ReleaseDC。
[解决办法]
pDC_Mem 在外部 CreateCompatibleDC,不要在函数内部 CreateCompatibleDC
[解决办法]
oldmemBitmap = pDC_Mem->SelectObject(&memBitmap);//
最后将oldmemeBitmap SelectObject回去
[解决办法]
pDC_Mem 在函数外部 CreateCompatibleDC,为何不试试呢?
Create 和 Delete 是配对的,你在函数外定义,在函数外 Delete,那也得在函数外 Create。
否则会引起资源泄漏。
CRect rect;
GetWindowRect(rect);
Cbitmap Bitmap,OldBitmap;
CDC *pDC;
pDC=GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
Bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height);
OldBitmap = memDC.SelectObject(Bitmap);
memDC.BitBlt(0, 0, BitWidth, BitHeight,pDC, 0, 0, SRCCOPY);
Bitmap = (HBITMAP)memDC.SelectObject(OldBitmap); //Bitmap储存着rect区域内的位图,吧该位图在你要输出的地方输出。你的功能就实现了
}
CDC *pDC=pView->GetDC();
CRect rc;
pView->GetClientRect(rc);
CDC memDC;//定义一个设备上下文
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
while(pDlg->open)
{
..............
HBITMAP Bmp;
Bmp=(HBITMAP)LoadImage(NULL,Filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap *bmp=NULL;
bmp=CBitmap::FromHandle(Bmp);
memDC.SelectObject(bmp);//选中位图对象
pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,1280,1024,SRCCOPY);//绘制位图
bmp->DeleteObject();//释放位图对象}
}