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

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:47:07

动态真彩工具栏
作者:



源代码执行效果图如下:


与VCKBASE接触良久,从来都是贪婪的从中掘取好用的东东,却没想过把自己的东西拿出来与人共享,很不好意思。
自从我的RangerChat点对点聊天工具在VCKBASE上发表以来收到众多朋友的来信。他们很多人都说一次性看这么多代码,还真不知如何从中提取自己想要的东西。现在奉上我做项目过程中的一些好的资源片段供大家评判。以后我会不间断的提供一些好的代码和大家分享。谢谢大家。
第一个:一个拥有动态真彩图标的工具栏,相信可以为大家的应用程序增色不少。

Step1:建一个单文档/多文档框架
Step2:在框架类CMainFrame中添加如下变量

CReBar m_wndReBar

Step3:添加BOOL型成员函数CreateExToolBar()
BOOL CMainFrame::CreateExToolBar()
{
	CImageList img;
	CString str;
	
	if(!m_wndReBar.Create(this))
	{
		return -1;
	}
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
	{
		return -1;      
	}
	
	//下面的代码是设置按钮的宽度和长度
	m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 80);
	//下面的代码是设置"热"的位图
	img.Create(22, 22, ILC_COLOR8|ILC_MASK,2,2);
	img.SetBkColor(::GetSysColor(COLOR_BTNFACE));
	img.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_GETBUTTON));//0收信

	.............	//省略其它按钮设置的代码,详见本文提供的源代码

	m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
	img.Detach();	
	
	//下面的代码是设置"冷"的位图
	img.Create(19, 19, ILC_COLOR8|ILC_MASK, 2,2);
	img.SetBkColor(::GetSysColor(COLOR_BTNFACE));
	img.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_GETBUTTON));//0收信
	img.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_WRITEMSGBTN));//1写信
	.............	//省略其它按钮设置的代码,详见本文提供的源代码
	m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
	img.Detach();
	
	//改变属性
	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT |CBRS_TOOLTIPS | TBSTYLE_TRANSPARENT|TBBS_CHECKBOX );
	m_wndToolBar.SetButtons(NULL,21);	
	// set up each toolbar button设置文字  
	
	m_wndToolBar.SetButtonInfo(0, IDC_WRITEMSG, TBSTYLE_BUTTON, 1);
	m_wndToolBar.SetButtonText(0, "写信");	
	
	............ //省略其它按钮设置的代码,详见本文提供的源代码
	
	CRect rectToolBar;
	//得到按钮的大小
	m_wndToolBar.GetItemRect(0, &rectToolBar);
	//设置按钮的大小
	m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(20,20));
	
	//在Rebar中加入ToolBar
	m_wndReBar.AddBar(&m_wndToolBar);
	
	//改变一些属性
	REBARBANDINFO rbbi;
	rbbi.cbSize = sizeof(rbbi);		//这个是必须填
	rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE|RBBIM_BACKGROUND;
	//工具条的宽度
	rbbi.cxMinChild = rectToolBar.Width();
	//高度
	rbbi.cyMinChild = rectToolBar.Height();
	//下面这行代码是为工具条加入背景位图,请注意上rbbi.fMask中RBBIM_BACKGROUND标志
	rbbi.hbmBack = LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_TOOLBARBKMAP));
	
	rbbi.cx = rbbi.cxIdeal = rectToolBar.Width() * 10;
	
	m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi);
	return TRUE;
}
Step4:打开OnCreate()成员函数添加如下代码
//创建扩展工具栏
If (!this->CreateExToolBar()) return -1;

并把原先关于ToolBar的一切操作(创建、浮动)删除。
至此真彩动态工具栏已创建成功!

下面做一些说明:
No1: 工具栏中的每个按钮都要自已手动创建(见源码)
No2: 每个按钮的ID和消息处理要手动添加(在此不详述过程)
OK了,大家还不快试试。


--------------------next---------------------

花了很长时间,终于仿照改好了,谢谢鸟 ( mwxkingboy 发表于 2007-9-5 12:58:00)
 
按你的方法做了一个工具栏,但是位图全是灰的,这是为什么啊?我是初学者,什么都不懂,还望你能
指教 ( bezire 发表于 2006-6-26 9:33:00)
 
No1: 工具栏中的每个按钮都要自已手动创建(见源码)
No2: 每个按钮的ID和消息处理要手动添加(在此不详述过程)
回答:
1,源码没有各个新的按钮哎!你也没有删除老的资源哎!2,不过你的方法还是挺好的 ,但是应该在文档里显著这个声明这个问题的! ( fengqing 发表于 2005-2-26 10:18:00)
 
在哪看答案 ( shinbo 发表于 2003-10-17 15:00:00)
 
为什么DEBUG下,不能运行EXE?调试的时候,img.Add(AfxGetApp()->LoadIcon(IDI_ICON_MSG_TELBOOK));//0电话本 类似的添加ICON的语句总提示"user breakpoint called from code at 0x77f9f9df"?但是添加IDR_MAINFRAME时却没有问题.请问如何解决这个问题啊?
( wangjingmei 发表于 2003-6-17 16:08:00)
 
总的来说还是非常不错的!但我还有一个问题,就是如何动态添加或删除其中的一些按钮?我试着在另一个函数里设置m_wndToolBar.SetButtons()里的参数,这样动态增加按钮一切都正常,但动态删除的时候工具栏就会变了样,请问如何这个问题呀? ( jermy 发表于 2003-5-31 0:36:00)
 
大家谁有更好的方法不用手动加资源和函数映射的来说一声呀.
( Ranger 发表于 2003-4-8 8:50:00)
 
我下载了,还不错。
( 发表于 2003-4-7 15:03:00)
 
不错,不过遗憾的一点是,资源符号,消息映射,函数映射都必须自己手动添加! ( nepdi 发表于 2003-4-5 12:07:00)
 
.......................................................

--------------------next---------------------

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