Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536803
  • 博文数量: 576
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 15:08:33

flyhigh:good!but there are too much memory leak!
(发表于2004-4-1 10:42:00)

hengai:呵呵,我也发现有很多内存泄漏,正在改正中。不过代码很有把参考价值^_^
(发表于2004-4-1 16:36:00)

cuick:
呵呵,我当时还记得修改,后来太匆忙给忘了。
很简单,在销毁FrameWnd时delete就可以了。
(发表于2004-4-1 21:23:00)

hengai:不仅仅是在FrameWnd里面。看看代码,使用EnableDocking就要循环4次,就有4次的new。我认为这里的4次应该使用一个宏(或 const)来表示,要不然用户创建多余4个还得改这里^_^。我使用的是一个链表到最后消除的 CList m_lsAutoHideBar,不过使用 CPtrList 也可以,但是要注意最后删除的时候需要强制转换一次再使用delete。还有,每加入一个AddPage时就有一个new,我看到代码直接使用RemoveAll(一个 CPtrList)。在拖放出去时也会产生。具体的还没有仔细看,昨天开会,没时间修改^_^不过还是很有价值的
(发表于2004-4-2 8:44:00)

cuick:^_^
好的,你修改完了再发一份给我。谢谢
还有什么不托的地方请指教!!
对了,那四次是因为窗口只有四个边呀^_^,我是模仿MFC中CFrameWnd对CDockBar的处理方法实现的。

(发表于2004-4-2 10:18:00)

wjhj:在VC7.0中编译能通过,但不能执行,提示调用CStringT
的Left函数时,传递的参数nCount是-2,请作者看看是什么地方出错。
CString sText = m_sText;
int l = sText.GetLength();
int i;

for(i=0;i<10 && pDC->GetTextExtent(sText).cx > rect.Width();i++,l-=2)
sText = sText.Left(l-2);
按提示,似乎变量l的值是0.
如果找到错误,还望告知wjhjlove@tom.com
(发表于2004-4-2 10:43:00)

cuick:关于内存泄漏
1、创建的四个CAutoHideBar
autohidebar.h添加afx_msg void OnDestroy();
autohidebar.cpp的消息映射里加ON_WM_DESTROY()然后添加如下代码:
void CAutoHideFrame::OnDestroy()
{
for (int i = 0; i < 4; i++)
{
CAutoHideBar* pAutoHide = (CAutoHideBar*)GetControlBar(dwHideBarMap[i][0]);
if (pAutoHide != NULL)
{
pAutoHide->DestroyWindow();
delete pAutoHide;
}
}
CFrameWnd::OnDestroy();
}

2、CDockPageBar中拖出拖入等操作导致的内存泄漏
修改DockPageBar的AddPage(CPageItem *pPageItem)如下:
BOOL CDockPageBar::AddPage(CPageItem *pPageItem)
{

pPageItem->m_pWnd->SetParent (this);
m_PageList.AddTail(pPageItem);
UpdateWindow();

return TRUE;
}

同1处理OnDestroy
void CDockPageBar::OnDestroy()
{
POSITION pos;
CPageItem* pItem;
for(pos=m_PageList.GetHeadPosition();pos!=NULL;)
{
pItem=(CPageItem*)m_PageList.GetNext(pos);
if(pItem)
{
delete pItem;
pItem=NULL;
}
}
m_PageList.RemoveAll();

}

以上可以解决CAutoHide和CPageItem引起的内存泄漏
(发表于2004-4-2 15:59:00)

cuick:to:wjhj 
我是在win2000+VC6下做的,没有vc7,原因不清楚。
不好意思。

(发表于2004-4-2 16:01:00)

wjhj:解决在vc7.0中编译通过,但不能执行的问题:
将程序中三处
for(i=0;i<10 && pDC->GetTextExtent(sText).cx > rect.Width();i++,l-=2)
改为
for(i=0;i<10 && pDC->GetTextExtent(sText).cx > rect.Width();i++)
程序能执行,但由于还没能完全阅读代码,还不清楚这样
修改会有什么问题,还有待测试,但这样改后程序能运行
起来。



(发表于2004-4-2 21:02:00)

hengai:请问 Cuick 有修改后的代码么?今天下午我从15:00开始到现在,还是没有解决那个拖出去的内存泄漏问题。还有,按照你的解决方法有一些问题,内存泄漏还没有解决。现在我除了拖放出去那个漏洞没有解决(暂时也不知道怎么解决)其它都解决了。本来昨天中午抽时间出来看看的,但是中午出去了,下午又接着开会,烦人啊。希望哪位解决后在这里发个帖子^_^
(发表于2004-4-3 17:04:00)

hengai:^_^,昨天晚上突然想到了怎么解决,刚刚特意来到公司,在电脑上试了一下,发现解决了内存泄漏问题,顺便重新改写了CAutoHideFrame,并且新增两个类,这样可以适用于单/多文档(参考http://www.vckbase.com/document/viewdoc.asp?id=411中XP风格框架部分)。以前我是学习C++ Builder的,最近因为工作需要才学起了 VC++,有不足的地方请提意见,我不会小气的^_^。顺便说一句,这个网站很好。
(发表于2004-4-4 10:59:00)

cuick:to:hengai
标签页拖出的内存泄漏你怎么改的?
给我发一份修改后的。
唉!!搞了这么多泄漏,失败。
(发表于2004-4-5 10:56:00)

VC70新手:继续修改,有人关心是好事,有人留言更是难道(比较VCKBASE的不少帖子而言)
(发表于2004-4-5 10:59:00)

hengai:to:cuick
已经发送给你邮箱,请查收。
另外:在隐藏后,如果没有再次按钉子按钮恢复不隐藏状态(就是在隐藏状态下退出程序),则会抛出大量内存漏洞。这个问题是我今天才发现的,还没有解决,如果你解决了,请转发一份修改后的源代码给我,谢谢了!
(发表于2004-4-6 8:22:00)

cuick:收到。
隐藏状态下退出内存泄漏的修改:
1、HideItem
void CHideItem::Dock()
{
((CHidePageItem*)m_arrPags[m_nActivePage])->m_pWnd->SetParent (m_pDockPageBar);

RemoveAll();

m_wndFloat.DestroyWindow();
m_pDockPageBar->ShowWindow (SW_SHOW);
m_pDockPageBar->UpdateSize();
((CAutoHideBar*)m_pAutoHideBar)->UpdateBar();
}
下面是新加的
/////////////////////////////////////////////////////////////////////////////
// remove all item 
void CHideItem::RemoveAll()
{
CHidePageItem* pHidePageItem;
int count = m_arrPags.GetSize();

for(int i =0; i< count; i++)
{
pHidePageItem = (CHidePageItem*)m_arrPags[0];
delete pHidePageItem;
pHidePageItem = NULL;
m_arrPags.RemoveAt(0);
}
}


(发表于2004-4-6 9:11:00)

cuick:一次写不下,继续:
2、CAutoHideBar
CAutoHideBar::~CAutoHideBar()
{
POSITION pos;
CHideItem* pHideItem;

for(pos=m_listBars.GetHeadPosition();pos!=NULL;)
{
pHideItem = (CHideItem*)m_listBars.GetNext(pos);
if(NULL != pHideItem)
{
pHideItem->RemoveAll ();
delete pHideItem;
pHideItem = NULL;
}
}
m_listBars.RemoveAll ();
}

(发表于2004-4-6 9:11:00)

hengai:to cuick:
已解决,谢谢!
(发表于2004-4-7 8:17:00)

zihua:to cuick:

还是有泄漏,但是不稳定有时出现有时不出现,建议再检查一下程序,然后将修改后的程序再发表一下。
(发表于2004-4-7 10:44:00)

cuick:^_^
终于找到原因了!!最后的泄漏……
修改CDockPageBarContext::FreeAll()添加m_pDPBar.RemoveAll ();

代码如下:
//hengai
void CDockPageBarContext::FreeAll()
{
for(POSITION pos = m_pDPBar.GetHeadPosition(); pos;)
{
CDockPageBar* pBar = (CDockPageBar*)m_pDPBar.GetNext(pos);
ASSERT(pBar != NULL);
delete pBar->m_pDockBar; pBar->m_pDockBar = NULL;
delete pBar; pBar = NULL;
}

m_pDPBar.RemoveAll (); // cuick 2004/04/08
}
(发表于2004-4-8 10:06:00)

zihua:to cuick:
为什么不把你修改的好好整理一下呢,你说的这个freeall如何来添加?
(发表于2004-4-8 14:51:00)

cuick:to:zihua
我还以为你是VCKBASE呢。
我把修改好的程序发给webmaster@chinafsdu.net了,过几天会替换掉以前的源码吧。等换了新的后再重新下载一次吧。

(发表于2004-4-8 15:57:00)

hangwire:代码更新:内存泄露问题已经解决!
(发表于2004-4-11 22:22:00)

rbird5118:欢迎加盟中国微型软件开发中心,网站正建设中。。。
为你量身定做各种小型软件,

联系方式:
email:ldh5118@sohu.com
qq   : 36201365
(发表于2004-4-14 15:56:00)

rbird5118:欢迎加盟中国微型软件开发中心,网站正建设中。。。
为你量身定做各种小型软件,

联系方式:
email:ldh5118@sohu.com
qq   : 36201365
(发表于2004-4-14 15:57:00)

rivershan:cuick老兄:下面的ListCtrl为什么加不进去东西?
那个对话框初始化的时候可以加进去,但是我动态加的时候就是加不进去~
InsertItem。。。。。。
我的数据都没错哦~
(发表于2004-4-20 7:52:00)

judy2004:解决在vc7.0中编译通过,不能够删除"l-=2",将程序中三处:
for(i=0;i<10 && (pDC->GetTextExtent(sText).cx > rect.Width());i++,l-=2)
改为
for(i=0;i<10 && pDC->GetTextExtent(sText).cx > rect.Width() && l>=2 ;i++)

这样修改之后我在VC7中测试了一下,好像没有什么问题。
(发表于2004-6-7 22:05:00)

yyzqyrs:问题,release版本下出错! 有没有人知道原因
(发表于2004-7-16 8:17:00)

yyzqyrs:我试用了一下,发现如果设置为静态,而不是共享式的发布,在DEBUG和RELEASE环境下均会出错,不知为何
(发表于2004-7-22 9:36:00)

03736:点击浮动窗体的标题栏,浮动窗体会有轻微的闪烁、颤动,,,请问该怎么解决?
(发表于2004-8-26 16:14:00)

pinel:发现做安装包后在没有装vc的机器上运行出错,用dependency看没有未包含的dll,为什么?
(发表于2004-9-17 16:15:00)

hcn5460:很好很好!只是程序在运行时,如果下面的不隐藏,左边的隐藏后自动出现时会覆盖下面的frame,有点不爽,能不能修改?希望作者修改后发表上来!!
(发表于2004-12-7 9:03:00)

xjlhw:你好
   谢谢你的源码.我在使用中想将停靠中的关闭X去掉,但是我是做不到,不知作者能不能想办法.望有时间给于回答.xjlhw@163.com
(发表于2006-11-26 8:01:00)

xxxxxlllll:工具栏如果可停靠,则CAutoHideBar会创建到工具栏区域
LRESULT CAutoHideBar::OnSizeParent(WPARAM wParam, LPARAM lParam)中

else if (dwStyle & CBRS_ORIENT_VERT)
{//使用保存的矩形中的top信息可以避免CAutoHideBar创建到顶端的工具栏中
if(pHideItem != NULL)
rect.top = pHideItem->m_oldWndRect.top;

(发表于2007-6-15 14:37:00)

flyling:to:xxxxxlllll:
你说的没错,这样是可以避免CAutoHideBar创建到顶端的工具栏中,但是你发现工具栏还是会向右移动一个距离。
我感觉好像是lParam参数的问题, 不知道怎么解决。
(发表于2007-7-19 12:00:00)

larusoft:为什么加入这个仿MSDN界面之后,工具条和菜单的风格都发生变化了啊
(发表于2007-7-24 14:30:00)

larusoft:为什么加入这个仿MSDN界面之后,工具条和菜单的风格都发生变化了啊?没有朋友发现这个问题吗?
(发表于2007-7-26 22:46:00)

zhouzhonghao:解决静态链接出错的办法:
将DockPageBar.cpp中五处_AfxAdjustRectangle改为自定义的函数名
(发表于2007-10-31 7:15:00)

runforu:你好,
  对于很多控件源代码的隐藏功能是正常的,但是对于从CEditView继承的view,自动隐藏功能有个问题,当从隐藏状态下点击鼠标或移动鼠标到tab上,界面显示错误,怀疑是由于CEditView和dockbar共同绘图有关。我已经把一个整理好的例子程序发到你的信箱tony__cb@hotmail.com 里了。我不知道怎么解决这个问题,请感兴趣的人向我索要用CEditView的例子程序。大家共同解决这个问题。
(发表于2008-6-18 14:44:00)

runforu:你好,
  这个代码对CEditView也是好用的,不过必须指定CEditView的属性为WS_CLIPSIBLINGS
(发表于2008-6-18 15:00:00)

..........................................................................
--------------------next---------------------

阅读(565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~