用户那边发现的问题,他打开这个程序的同时会同时打开其他几个软件,比如命令行窗口,bc31等
运行一段时间后就会出现奇怪的问题
比如:
下拉菜单显示黑色,看不见字,鼠标放到上面那一栏才显示出来
domodal的对话框关闭之后,界面有残留
还有比如组合框上的那个小箭头竟然变成了数字"6"
还有些莫名奇妙的错误,反正都和界面有关会不会是和那个软件冲突,或者那个软件狂吃资源,中毒,还是我软件有什么没有释放的东西
运行一段时间后就会出现奇怪的问题
比如:
下拉菜单显示黑色,看不见字,鼠标放到上面那一栏才显示出来
domodal的对话框关闭之后,界面有残留
还有比如组合框上的那个小箭头竟然变成了数字"6"
还有些莫名奇妙的错误,反正都和界面有关会不会是和那个软件冲突,或者那个软件狂吃资源,中毒,还是我软件有什么没有释放的东西
其他的不好说!
似乎没用到GDI资源,时间隔得比较久,有点忘了
有个功能用到多线程,但是并没有启用这个功能比较简单的东西
无非是listctrl显示表中的数据,插入删除修改什么的,只是用户的要求有些怪,但和界面有关系的就是重绘listctrl,改变当前行颜色,还有当前单元格颜色(文本框)
另外,也有可能是你自绘界面有bug,在特定环境下才体现出来。
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdrawList )
而且
只有运行一段时间才出错我在我的电脑商打开n个窗口,来回切换的很长时间也没错
真郁闷
gdi数量是不断增加吗.这和内存泄露有关系吗.
我看QQ的程序就是在不断增加的
我遇到过在循环中改变画线的颜色,不断的GetObject(),和releaseobject(),最后会出现类似于你的情况,
我想可能还是某一类的资源没完全释放掉。
可以在程序里监控一下内存资源。
据说插入删除操作近100次会出现这种现象...access有点问题,就是删除的东西并没有物理删除,以至于表会越变越大
100次之后可能就有几百兆了
如果上G,难道就会出现这种问题?(当然access有上限,好像是2G)超过2G是报错而不是这种现象啊理论上
void CEditListCtrl::OnCustomdrawList( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = 0;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
int nItem=(int)(pLVCD->nmcd.dwItemSpec);
if(nItem==m_nItem){
// pLVCD->clrText = RGB(255,155,255);
pLVCD->clrTextBk = RGB(255,0,0); }
*pResult = CDRF_DODEFAULT;
}
}
我看了下GDI对象,9999个
1、响应WM_CTLCOLOR消息时,先调用了基类函数,最后返回的不是基类函数的返回值;
2、DeleteObject前,没有用SelectObject把对象从DC中换出。另外,你把自绘的代码分别去掉再测试看看,确定一下与哪段代码有关。
所以,就是GDI资源泄漏,我在7楼就已经指出,还是“仔细检查自己的代码吧”!
1、一个是因为你的在获取GDI对象后,最后没有释放,比如,你在绘图时调用了CDC *pDC = GetDC();而在用完后没有调用ReleaseDC(pDC),这样反复调用的次数多了以后肯定会出现你说的那种情况。
2、再一个问题你不是你的系统很消耗内存资源呀。
让他一直不开BC31运行你的程序,观察一段时间,看是否还会出现这种现象。
使用局部的类对象,是不是不用调用DeleteObject();
如:
CBitmap bmp;
bmp.CreateCompatibleBitmap(..);CDC dc;
dc.CreateCompatibleDC(..); 不用执行
bmp.DeleteObject();
dc.DeleteObject();
吧