我在调整(通过拖动)对话框的大小时存在内存资源使用率过高的问题。

我在对话框上进行了查看,并在 View 中显示了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

最佳答案

这里有一个泄漏:

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;
}

10-01 08:41
查看更多