首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

急求诸位大神 给解啊

2012-12-31 
急急急,求各位大神 给解啊!!!!!下面这个函数 有点错误,造成DC泄露,我只要在函数的retrun前调用一下pDC_Mem

急急急,求各位大神 给解啊!!!!!
下面这个函数 有点错误,造成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。
否则会引起资源泄漏。

引用:
pDC_Mem 在函数外部 CreateCompatibleDC,不要在函数内部 CreateCompatibleDC

[解决办法]
应该还有其他的资源泄露!
如果有不停的创建或者get的,而没有对应的删除或者释放,那么肯定会泄露的!

[解决办法]
建议楼主保存DC的句柄,然后在需要使用的时候FromHandle(HDC)获取DC。
如果没有理解错的话楼主是想要一个BMP的截图。没有必要保存DC。只需要获取该窗口的截屏存的BMP中,在需要使用的地方再用StretchBlt输出就行了。
再次楼的GDI在不使用后都要用DeleteObject()删除对象。如CBitmap对象。
楼主想要实现的功能可以这样实现:

        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区域内的位图,吧该位图在你要输出的地方输出。你的功能就实现了
}


代码我有点改动,可能有点小问题。细节楼主自己看吧。四楼就是这样。如果输出时需要伸缩,建议使用StretchBlt(如果不打印的话,这个函数就可以搞定)。
[解决办法]
   
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();//释放位图对象}

}


我这么写过,没发现内存泄露

热点排行