奇怪问题,请教高手!
本人做了一个程序,用到好些自定义的控件类。程序编译时没有出错,可执行文件启动之后也运行正常,但长时间运行之后(使用或者不使用都是这样)会出现整个界面变白的情况,而且不响应消失。更奇怪的是,不是每次都会出现这种问题。请各位帮忙分析一下!谢谢 问题点数:100、回复次数:17Top
1 楼meiyululu(璐璐)回复于 2005-02-01 22:39:48 得分 5
可能你没正确处理好WM_PAINT ,WM_ERASEBK 消息。Top
2 楼sufon(是网不是站)回复于 2005-02-01 23:12:45 得分 0
能详细点吗?Top
3 楼fengbaotiaorulei(风暴跳如雷)回复于 2005-02-02 03:12:14 得分 0
有源代码吗?Top
4 楼saliors(正在学习中)回复于 2005-02-02 07:41:36 得分 0
嗯,关注一下Top
5 楼holyeagle(一杯清茶)回复于 2005-02-02 07:47:32 得分 10
有一种可能就是不断使用了大量的GDI对象但没有释放,造成资源溢出,检查是否有申请过大的CBitmap,CDC及其相关资源是否释放Top
6 楼coolaka(Snow)回复于 2005-02-02 08:39:03 得分 10
你的资源用了之后没有释放
一个系统 的资源是有限的
所以会出现你上面的问题
用了DC你要release用了pen,bitmap之类的都要记住恢复以前的
把现在的释放掉Top
7 楼LongLongAgoImBoy(ThereIsAMe)回复于 2005-02-02 08:41:26 得分 5
楼主看看你界面变白以后,系统资源情况,估计是内存泄漏。Top
8 楼LongLongAgoImBoy(ThereIsAMe)回复于 2005-02-02 08:42:43 得分 0
奇怪的是,不是每次都会出现这种问题
==================================
那很可能是因为时间还没有到,我想只要时间长一点,界面都会变白的。Top
9 楼Practise_Think(时代“过客”)回复于 2005-02-02 09:25:21 得分 10
你的程序有GDI资源泄漏,我以前也遇过这样的问题,如果你在2k用任务管理器可以看到GDI会随着时间不断增加,不过有时在9X泄漏,而在2K或XP就不存在这种情况了.检查你有关GDI方面的代码,Top
10 楼kwiner(ak.net)回复于 2005-02-02 11:43:38 得分 5
检查内存泄漏Top
11 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2005-02-02 12:33:54 得分 0
关注Top
12 楼legendhui(秋天的叶子)回复于 2005-02-02 12:40:10 得分 0
upTop
13 楼sufon(是网不是站)回复于 2005-02-02 18:41:18 得分 0
谢谢,大家,继续讨论!Top
14 楼sufon(是网不是站)回复于 2005-02-02 18:46:45 得分 0
经过测试发现这个程序有问题,
HBRUSH CSFormView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
switch (pWnd->GetDlgCtrlID())
{
case IDC_STATIC:
case IDC_DRINKPRICEV:
case IDC_DRINKPRICEN:
case IDC_DRINKAMOUNTV:
case IDC_DRINKAMOUNTN:
case IDC_DEVEPRICEV:
case IDC_DEVEPRICEN:
case IDC_DEVEAMOUNTV:
case IDC_DEVEAMOUNTN:
case IDC_RAWMATPRICEN:
case IDC_RAWMATAMOUNTV:
case IDC_RAWMATAMOUNTN:
case IDC_OTHERPRICEV:
case IDC_OTHERPRICEN:
case IDC_OTHERAMOUNTV:
case IDC_OTHERAMOUNTN:
case IDC_TOTALPRICESV:
case IDC_TOTALPRICESN:
pDC->SetBkMode(TRANSPARENT);
return CreateSolidBrush(RGB(239,239,252));
break;
default:
break;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if (nCtlColor==CTLCOLOR_DLG) return (HBRUSH) m_brush.GetSafeHandle() ;
//HBRUSH SPB = CreateSolidBrush(RGB(255,182,227));
return hbr;
}
而且只要把return CreateSolidBrush(RGB(239,239,252));删除就不会出现以上问题,问各位怎么修改这段程序?Top
15 楼Imagist()回复于 2005-02-02 19:37:17 得分 20
return CreateSolidBrush(RGB(239,239,252));
HBRUSH SPB = CreateSolidBrush(RGB(255,182,227));
你创建了刷子(2处),但你一直没有释放占有的资源。
Top
16 楼Imagist()回复于 2005-02-02 19:40:46 得分 20
解决办法,声明2个HBRUSH对象,在构造函数中创建,在析构函数中释放资源
DeleteObject(...);Top
17 楼JerryGR(紫咖啡)回复于 2005-02-02 21:39:17 得分 15
你创建的Brush没有释放掉,会造成GDI资源的浪费,建议改成成员变量m_brXXX;先创建m_brXXX,然后直接返回它的句柄即可
该结贴了:)
Top




