当前位置: 首页 > 图文教程 > 开发语言 > VC++ > CGfxOutBarCtrl之BUG篇

VC++
如何有效地使用对话框
一个定制CFileDialog对话框的实例
XP风格复活节彩蛋的实现
程序界面多模式显示的实现
改变视图单调的背景
使窗体拥有透明效果的API
《电子尺》V1.02程序开发实例
美化你的应用程序的外观界面
个人考勤软件开发实例
使用VC6.0实现窗口的任意分割
如何让一个打开的文档成为活动文档
创建非矩形窗口的简单方法
轻松实现类VC界面
视图的缩放的完整论述
如何获得另一个应用程序窗口中的文本
如何发送命令到文档对象
动画窗口的实现-VC++实例一则
如何在其他程序的窗口上创建按钮并使之能响应
如何在基于对话框的程序中动态设置鼠标指针
扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

VC++ 中的 CGfxOutBarCtrl之BUG篇


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 43 ::
收藏到网摘: n/a

CGfxOutBarCtrl之BUG篇
作者: 李晓飞

下载本文源代码

我是一位VC++的初学者,算起来时间还不到四个月,但是我几乎每天都会光临VC知识库网站,我是位界面发烧友,对网站上的新控件都是一一不舍的感觉。VC知识库网站近日刊登的一个仿OutLook的界面类CGfxOutBarCtrl我下载后发现了一些问题,觉得这些小问题有点影响界面整体的美观,大方,所以我想贡献出改进后的CGfxOutBarCtrl全部代码。

一、问题的提出

现在先让我们列出CGfxOutBarCtrl存在的所有问题,然后我们再一一解决:
1. 如果删除某个非TreeBar目录后会出现如下图所示的情况:


2. 删除TreeBar目录会出现如下图所示的情况:


3. 另外CgfxOutBarCtrl为我们提供的右键菜单是“鸟语”,我们必须进行“汉化”工作。
那么接下来就让我们来一一解决这些问题吧。

二、问题的解决

1. 出现问题1的情况是因为在移除了目录(Folder)之后CgfxOutBarCtrl视图区域没有被刷新的原因,查看文件GfxOutBarCtrl.cpp中的RemoveFolder函数才知道它在删除完目录后没有进行主动刷新操作,而是被动的等待Windows的刷新通知。那么就让我们来主动发通知消息来让视图区域进行刷新(重画)操作吧!本人刚开始用SendMessage给CgfxOutBarCtrl发送WM_SIZE消息来让视图区刷新,但是后来我运行了N多次突然又发现了原来的情况又出现了,所以我又研究了CgfxOutBarCtrl类的结构,发现当用户变换了当前目录(Folder)后,CgfxOutBarCtrl类都会主动的去刷新重绘视图区,既然如此我们就无须再写多余的代码只须主动的去调用函数:SetSelFolder()即可。

2. 出现问题2的情况是因为CgfxOutBarCtrl类在RemoveFolder函数中仅仅删除了CBarFolder类成员对象,而没有删除掉CBarFolder类中的CTreeCtrl类指针所指向的CTreeCtrl类成员对象。所以才会造成目录被删除了但实际的CtreeCtrl类对象还存在的情况。那么我们只须在RemoveFolder函数中加入释放CTreeCtrl对象的代码即可。
那么修改后的RemoveFolder函数代码如下:(加黑部分为本人添加的代码)
void CGfxOutBarCtrl::RemoveFolder(const int index){	ASSERT(index >= 0 && index < GetFolderCount());	CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);	//Modified By Blue Sky WorkRoom	//Author:LiXiaoFei Date:2003Y-01M-14D::11:15	//原程序未释放Folder中的子窗体空间造成显示混乱.	if(pbf->pChild)	{	::SendMessage(pbf->pChild->m_hWnd, WM_CLOSE, 0, 0);	//等价于:pbf->pChild->DestroyWindow();	}	delete pbf;	arFolder.RemoveAt(index);	if (iSelFolder >= index) iSelFolder = index - 1;	if (iSelFolder < 0 && GetFolderCount() > 0) iSelFolder = 0;	//Modified By Blue Sky WorkRoom	//Author:LiXiaoFei Date:2003Y-01M-14D::11:35	//原程序在删除子窗体后没有更新视图区,造成目录显示混乱.	//解决办法:	// 手工设置当前页面:SetSelFolder(iSelFolder);	SetSelFolder(iSelFolder);	Invalidate();}
3. CGfxOutBarCtrl右键菜单的汉化问题其实只需要修改GfxOutBarCtrl.cpp文件中的几个#define即可。修改如下:
//汉化工作#define _ID_GFX_SMALLICON	"小图标风格"#define _ID_GFX_LARGEICON	"大图标风格"//#define _ID_GFX_REMOVEITEM	"删除子项"#define _ID_GFX_RENAMEITEM	"子项重命名"
好了,关于CGfxOutBarCtrl类中存在的问题我就先说到这里吧,如果大家在以后的使用过程中也发现了CGfxOutBarCtrl的BUG,可以写信到[email protected]告诉我,感谢了!再次谢谢VC知识库为我们提供的交流机会。