在mfc中调整对话框窗口大小(通过拖动)时,内存资源使用率会上升

时间:2015-11-11 04:17:35

标签: c++ mfc imagemagick

在调整对话框大小(通过拖动)时,我遇到了内存资源使用量变得非常高的问题。

我在对话框上做了一个视图,并在视图中显示了bmp图像。 但是当我对对话框进行大量调整(通过拖动)时,内存资源的使用量增加得非常高。我不知道从哪里开始。 我应该检查什么?

我的代码概念如下。

CTestView::OnDraw(CDC * pDC)
{
...
DodisplayImage();
...
}  


Void CTestView::DodisplayImage(void)
{ 
if (m_pImage == NULL) { return; } 
PixelPacket *pPixels; 
CPoint pt; 
CRect rectClient; 
CDC * pDC; 
pDC = GetDC(); 
GetClientRect(rectClient);
 if (pDC != NULL) {
 int nImageY;
 int nImageX; 
 CSize sizeScaled; // Clear the background pDC->FillSolidRect(rectClient,pDC->GetBkColor()); 
...
BITMAPINFOHEADER bmi;
 bmi.biSize = sizeof(BITMAPINFOHEADER); bmi.biWidth = m_pImage->columns(); 
 bmi.biHeight = (-1)*m_pImage->rows(); bmi.biPlanes = 1; bmi.biBitCount = 32;
 ...
,,BitBlt (...);
 DeleteObject(hMemDC);
}

我跟着dodisplayimage()跟随链接

ftp://ftp.mpe.mpg.de/pub/ImageMagick/ImageMagick-5.3.3/contrib/win32/MFC/NtMagick/NtMagickView.cpp

1 个答案:

答案 0 :(得分:2)

这里有泄漏:

Void CTestView::DodisplayImage()
{
    CDC *pDC = GetDC();
    pDC->FillSolidRect(rect, pDC->GetBkColor());
    ReleaseDC(pDC); //<= needs cleanup
}
必须在ReleaseDC之后调用

GetDC进行清理。另请参阅GetDC()

的文档

或者你可以避免这一切,因为MFC具有自动清理的类。将GetDC替换为CClientDC代码中的每个位置:

Void CTestView::DodisplayImage()
{
    CClientDC dc(this)
    dc.FillSolidRect(rect, dc.GetBkColor());
    //do stuff with HDC hdc = dc.GetSafeHdc(); ...
    //or CDC *pDC = &dc;
}