问题求救:我的程序运行一段时间,屏幕就花了,请高手帮帮忙!(解决问题给600分,参与有分)

Colorstone0823 2003-05-18 01:45:19
我自己做了一个提取程序中图标的程序,然后把这些图标给画出来,可是运行一段时间以后显示屏就花了,而用Bounder Checker检查内存时并没有报告内存泄漏,请问是怎么回事?另外我的程序中涉及非常频繁的GDI操作,因为计算机上的图标经常成千上万,我想是不是可能是这个原因??

解决问题给出600分,参与有分,谢谢!
...全文
45 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanglingfei 2003-05-21
  • 打赏
  • 举报
回复
学习中
xiaoshao_0_0 2003-05-19
  • 打赏
  • 举报
回复
CFont* pFntOld = (CFont *)dc.SelectObject(&m_fntSmall);
这句没有对应的释放语句呀
函数最后加上
dc.SelectObject(pFntOld);
pcitman 2003-05-19
  • 打赏
  • 举报
回复
上面的函数中,
brushWhite.DeleteObject();
其他的你自己再查一下有没有忘记DeleteObject的GDI资源
Colorstone0823 2003-05-19
  • 打赏
  • 举报
回复
我程序中最核心的两个绘图函数如下,大家帮我看看问题出在哪儿。
for (UINT n = 0 ; n < uSize ; n++)
{
rect = GetItemRect(n);
if (pDC->RectVisible(rect))
DrawFocusOnItem(n,FALSE);
}

for (n=0;n<m_uSelectedItemList.GetSize();n++)
{
rect = GetItemRect(n);
if (pDC->RectVisible(rect))
DrawFocusOnItem(m_uSelectedItemList.GetAt(n), TRUE);

}

void CIconListWnd::DrawFocusOnItem(UINT uItem, BOOL bDraw)
{
CClientDC dc(this);
CPen penBkgnd;
CBrush brushBkgnd, *pBrushOld ;
CRect rctFocus, rctSelect ;
int x, y ;

CScrollView::OnPrepareDC(&dc);
if ( (int)uItem != TPW_NONE)
{
x = uItem % m_uSectionsPerRow ;
y = uItem / m_uSectionsPerRow ;
rctFocus.SetRect(x * m_sizSection.cx, y * m_sizSection.cy,
(x + 1) * m_sizSection.cx, (y + 1) * m_sizSection.cy);
rctSelect = rctFocus;
rctSelect.DeflateRect(2,2,2,2);

if (bDraw)
{
dc.DrawFocusRect(&rctFocus);

COLORREF colorSelected = RGB(10, 36, 105);
CBrush brushBkgnd(colorSelected);
pBrushOld = (CBrush *)dc.SelectObject(&brushBkgnd);
dc.Rectangle(rctSelect);
dc.SelectObject(pBrushOld);

// 更新状态条
UpdateStatusBar(uItem);

}
else
{
CBrush br(RGB(255,255,255));
dc.FillRect(rctFocus, &br);
}

// 重新绘制该条目内容
DrawContentOnItem(uItem, bDraw);
}

}

void CIconListWnd::DrawContentOnItem(UINT uItem, BOOL bFocus)
{
CClientDC dc(this);
CPen penBkgnd ;
CBrush brushBkgnd ;
CRect rctFocus;
int x, y ;
int xIcon, yIcon;
CSize sizBmp, sizFont;

HICON hIcon;
CString strTitle1, strTitle2;
UINT uPaintWidth, uPaintHeight;

CScrollView::OnPrepareDC(&dc);
if ( (int)uItem != TPW_NONE)
{
x = uItem % m_uSectionsPerRow ;
y = uItem / m_uSectionsPerRow ;
rctFocus.SetRect(x * m_sizSection.cx, y * m_sizSection.cy,
(x + 1) * m_sizSection.cx, (y + 1) * m_sizSection.cy);

CRect rectFrame = rctFocus ; // 图标的边框大小
rectFrame.DeflateRect(16,6,16,30);

// Get Icon handle
hIcon = (HICON)m_aryDwBitmaps.GetAt(uItem);

strTitle1 = m_aryStrTitles1.GetAt(uItem);
strTitle2 = m_aryStrTitles2.GetAt(uItem);

uPaintWidth = m_aryWidth.GetAt(uItem); // 图标宽度
uPaintHeight = m_aryHeight.GetAt(uItem); // 图标高度
(uPaintWidth>64)?64:uPaintWidth;
(uPaintHeight>64)?64:uPaintHeight;

sizBmp.cx = uPaintWidth;
sizBmp.cy = uPaintHeight;

sizFont = GetFontSize();
UINT uTextHeight = (nTextLineNum * sizFont.cy);

xIcon = uItem % m_uSectionsPerRow ;
yIcon = uItem / m_uSectionsPerRow ;

xIcon = (xIcon * m_sizSection.cx) +
( (m_sizSection.cx - sizBmp.cx) / 2) +
m_uSpacingx ;
yIcon = (yIcon * m_sizSection.cy) +
( (m_sizSection.cy - sizBmp.cy - uTextHeight) / 2) +
m_uSpacingy - 12;

// 画一个立体的边框
dc.DrawEdge(&rectFrame, BDR_RAISEDOUTER , BF_RECT);
rectFrame.DeflateRect(2,2,2,2);

CBrush brushWhite(RGB(255, 255, 255));
dc.FillRect(rectFrame, &brushWhite);

// 绘制图标数据
::DrawIconEx(dc.m_hDC, xIcon, yIcon, hIcon, uPaintWidth, uPaintHeight, 0, NULL, DI_NORMAL );

// 绘制文字
CFont* pFntOld = (CFont *)dc.SelectObject(&m_fntSmall);
if (bFocus)
{
dc.SetTextColor(RGB(255,255,255));
}
else
{
dc.SetTextColor(RGB(0,0,0));
}
dc.SetBkMode(TRANSPARENT);
CRect rectText1, rectText2;
rectText1.SetRect(rectFrame.left, rectFrame.bottom,
rectFrame.left+rectFrame.Width()+20, rectFrame.bottom+14);
rectText2.SetRect(rectFrame.left, rectText1.bottom,
rectFrame.left+rectFrame.Width()+20, rectText1.bottom+14);

dc.DrawText(strTitle1, rectText1, DT_SINGLELINE );
dc.DrawText(strTitle2, rectText2, DT_SINGLELINE );
dc.SelectObject(pFntOld);
}

}


OnDraw函数中的调用代码如下:
UINT uSize = GetSize();
for (UINT n = 0 ; n < uSize ; n++)
{
DrawFocusOnItem(n,FALSE);
}

for (n=0;n<m_uSelectedItemList.GetSize();n++)
{
DrawFocusOnItem(m_uSelectedItemList.GetAt(n), TRUE);
}
shilong 2003-05-19
  • 打赏
  • 举报
回复
程序发给我,我替你改shilong2002@163.com
binjuny 2003-05-19
  • 打赏
  • 举报
回复
许多资料用了没有释放,,导致泄漏
hwndhwnd 2003-05-19
  • 打赏
  • 举报
回复
六个是以前吧。
现在应该多了。
楼主那个市gdi泄漏的典型症状。
syl08341 2003-05-19
  • 打赏
  • 举报
回复
gdi资源有使用限制,最多同时使用六个。
如果使用后没有释放资源的话。可能造成图像显示方面的问题
zjp899 2003-05-19
  • 打赏
  • 举报
回复
我也碰倒过,一直都没有解决,现在帮你up一下
vataii 2003-05-19
  • 打赏
  • 举报
回复

up
shilong 2003-05-18
  • 打赏
  • 举报
回复
你这属于资源泄漏
所有的SelectObject都要把原来的保存下来
用完后再SelectObject原来的对象


Carapee 2003-05-18
  • 打赏
  • 举报
回复
你是用了过多的系统GDI资源,导致资源枯竭,屏幕就花了。
我原来的机器配置低,运行软件过多(尤其是lotus notes),就会花屏。

你看看程序,是不是有GDI资源没有释放?如果没有资源泄漏,那你就的考虑考虑设计了。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧