(2005-06-30 17:39:35)   [无法显示](26604898)
哪位对图像编程有研究,在下有个问题请教。我们的一个程序中使用了皮肤,共有十几个部分,各个部分大概的代码如下:
void CExpTabCtrl::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here CRect rectWnd;
GetClientRect(rectWnd);
CDC memDC;
CBitmap memBitmap;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, rectWnd.Width(), rectWnd.Height());
CBitmap* pOld = memDC.SelectObject(&memBitmap);
memDC.BitBlt(0, 0, rectWnd.Width(), rectWnd.Height(), &dc, 0, 0, SRCCOPY); CRect rectClient;
GetClientRect(rectClient);
CRect rect = rectClient;
this->AdjustRect(FALSE, rect);
if (pImageTitle1 && pImageExplorerBkgnd)
{
pImageExplorerBkgnd->Draw(&memDC, CSize(rectClient.Width(), rectClient.Height())); // left
}
else
{
CBrush br(::GetSysColor(COLOR_3DFACE));
memDC.FillRect(rectClient, &br);
} if (m_pImageBkgnd[GetCurSel() % 6])
{
CRect rectBorder;
rectBorder.SetRect(0, rect.top - 4, rectClient.Width(), rect.top + 2); // top
m_pImageBkgnd[GetCurSel() % 6]->Draw(&memDC, CSize(rectBorder.Width(), rectBorder.Height()), rectBorder.left, rectBorder.top);
} int nCount = this->GetItemCount();
for (int i = 0; i < nCount; i++)
{
if (i != GetCurSel())
{
DrawItemImage(&memDC, i);
}
}
DrawItemImage(&memDC, GetCurSel()); dc.BitBlt(0, 0, rectWnd.Width(), rectWnd.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
ReleaseDC(&dc); // Do not call CTabCtrl::OnPaint() for painting messages
}
程序在2000下基本没问题,98下却不能刷新,好像是系统资源占的太多了,请问有什么方法解决。

解决方案 »

  1.   

    资源泄漏在98下是一个经常出现的问题,主要是现在大家都 在2000下开发,而2000这方面做得很好,所以容易被忽视。
    强烈推荐安装BoundsChecker,建议安装6.1版本,7.0版本占用资源太多,而且一些无关紧要的问题也总是出来干扰我们的判断(有的也很可能是误报),有了它,一旦你的程序有什么地方做得不规范就会通告你在哪一行,还有正确使用的示例代码。
    vckbase上有下载
      

  2.   

    粗略看了一下,至少两个GDI资源没删除:
    memBitmap要用DeleteObject删掉;
    memDC要用DeleteDC删除,而不是ReleaseDC (GetDC才用ReleaseDC);
    可能你的DrawItemImage里面还有问题