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

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:39:49

告别图标失真的烦恼
作者:




示例代码运行效果图

自从和认识之后我认识了不少朋友,有的象我一样走着苦苦探索的道路。其中有很多朋友问我在VC中如何保证256色以上的图标加载后不失真。根据这些提问我也曾经到各个站点上寻求答案,结果是大失所望,虽然有介绍如何实现256色以上的工具栏的文章,但是方法中大都采用加载一幅256色以上的工具栏位图的方法。这样的方法存在一个麻烦就是:有什么简便好用的制图工具来做这样的位图呢?我虽然没有尝试过去寻找这样的工具,但是我知道大家都希望有更直接的方法来使用256色以上的图标,并且保持最终的效果不失真!

所以针对以上问题我研究了MSDN,费了九牛二虎的劲最终才"修成正果",哈哈!不过有快乐得和大家一起分享,希望我的努力没有白费,好了,废话少说,咱们立刻揭开它神秘的面纱吧。

一. 建立一个单文档工程(多文档也可)。
二. 在主框架CMainFrame类的头中定义一个CImageList对象。
三. 在主框架CMainFrame类的OnCreate处理中创建CImageList对象并且向其中添加你想要的图标。

其中CImageList的创建是本工程最最关键的一步,如果写错,那你就回到原处,结果是空空如也。哈哈!

m_ilTB.Create(32, 32, TRUE | ILC_COLOR8, 4, 0); //设置ToolBar的图标列表
现在对这几个参数做个详细介绍如下:
1. 前两个参数指定图标的宽度和高度,即:图标的尺寸定义。
2. 第三个参数指定何如显示图标。ILC_ COLOR8说明以256色调色板来显示图标。而TRUE则指明了以透明方式来显示图标。那么两者进行"按位或"运算后的意义变为:以透明方式来显示256色图标。
3. 第四和第五个参数则分别为:初始图标个数和新增图标时对象自动申请内存空间的步长。如果在大批量操作图标,并且需要不断的增删图标时,设置第五个参数可以改变程序的性能,如果第五个参数设置的比较适中则可以避免程序反复的申请和释放内存空间。

四. 最后的一步就是加载和添加图标资源了。
HICON hIcon = NULL;
hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, 0);	
m_ilTB.Add(hIcon);
好了,一切就是这么简单,如果你还不清楚的话,那就打开工程看看吧,如你有什么问题也不要忘记来信告诉我哦!最后祝大家学习愉快,多多交流,多多进步,一切顺利!
--------------------next---------------------

可以试试看这个函数SetButtonInfo(),或许可以满足点上面的要求的. ( jimmy212 发表于 2006-6-19 16:38:00)
 
在按下图标后,如何执行新建,打开,保存等功能,也就是说:如何将新图标和原来的工具栏按钮执行的功能关联起来?


我个人的看法了,只是将这些位图覆盖在原来的位图上了,没有什么东西来实现.


啊,希望我回答对了.^_^ ( jimmy212 发表于 2006-6-19 16:37:00)
 
ckp:有个疑问:在按下图标后,如何执行新建,打开,保存等功能,也就是说:如何将新图标和原来的工具栏按钮执行的功能关联起来。是不是下面的语句:

m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB)实现的?高手指教啊!!!
(发表于2003-4-1 17:00:00)
_______________________________________________
偶也碰到同样的问题,请高手执教,如何讲图标单击跟不同的事件联系在一起啊,我的电子邮箱:yee1978@sina.com.cn ( yee1978 发表于 2004-9-16 10:06:00)
 
要是有分割符怎么办 ?? ( smartlife 发表于 2004-6-25 11:26:00)
 
谢谢呀~~我也正缺少这个呢~~:)~~~ ( Afxmessge 发表于 2004-6-6 14:26:00)
 
不知道你用没用过Xtreme Toolkit,我的工程是用它建的。但是用你的方法就无效了,不知道是为什么! ( clack234 发表于 2004-1-1 22:44:00)
 
以上的菜单没有动态效果谁能解决请发邮件给我哟(oushengfen@163.com) ( oushengfen 发表于 2003-4-14 13:43:00)
 
好是非常好,但我发现一个问题(BUG)就是菜单失去了动态的效果(如鼠标移动到按钮上时没有动态的效果) ( oushengfen 发表于 2003-4-14 13:41:00)
 
我发现,原来的工具栏按钮的大小正好和作者新创建的图标的大小一样大,如果不一样的话,结果怎样?
( ckp 发表于 2003-4-1 17:02:00)
 
有个疑问:在按下图标后,如何执行新建,打开,保存等功能,也就是说:如何将新图标和原来的工具栏按钮执行的功能关联起来。是不是下面的语句:

m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilTB)实现的?高手指教啊!!! ( ckp 发表于 2003-4-1 17:00:00)
 
.......................................................

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

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