首页 > MFC > MFC工具栏图标修改

MFC工具栏图标修改

2013年5月14日 发表评论 阅读评论

最近blog.com状态不太稳定,一会上得了一会上不了的,所以上周基本那个专题研究没更新。先留一留吧,反正迟早要弄了。

这次说的是MFC状态栏的图标修改问题,问题起源是,之前帮那个老师做的那个软件,他一个月前曾跟我说过,说功能算是实现了,但是作为一款要申请软件著作权的东西,希望我把它做的“像一款软件”,言下之意,美工。。。

作为不是专业做软件,搞算法的人来说,这个需求简直是喵了个咪的。。。。

没办法,只好搞咯,然后研究了一下现在软件的UI,比如说之前那篇tab的做法就是参考了ADS的界面,然后最近下漫画看到千寻漫画下载器的那个右上角的东西,觉得要不就删掉菜单栏,剩下很大的工具栏作为按钮吧,然后发现呢,虽然很容易把工具栏删掉(就在框架类OnCreate中加一句SetMenu(NULL)),然后把工具栏图标弄大更简单,就是在资源里面toolbar把图标拖大就可以了。

但是问题来了,首先是这样子图标我们要自己画,小图标就算了,现在我们还把图标拖大,那尼玛你真以为我是大触啊。但是这也有办法解决,就是找一幅图,转成bmp,然后添加到bitmap资源中,再把bitmap的图像复制出来,贴到工具栏中,真的这么做的话,那恭喜你,你会发现你不认识你贴过去的图了,因为工具栏编辑器里面的图只支持16色,你256色变成16色肯定你自己都不认得啦。

所以呢,什么是好办法,就是可以自己找图片,然后贴成高清的工具栏就可以了。

首先我们知道我们建立好工程后,在res路径下会有一个Toolbar.bmp的文件,就是我们的工具栏了图标了,各个图标无缝衔接在一起拼成一个完整的位图,如下图所示:zhuangtailan
假设你想要弄一个5个图标,每个图标48*48的工具栏,你就要先准备一个48×240的这种bmp图片。

我自个儿为了方便,还顺便写了一个matlab程序来生成这种图标,就是把1.bmp,2.bmp...变成一个XXX.bmp文件。QQ20130514135150

clc;
result = [ ];
for i = 1 : N
    file_name = [num2str(i) '.bmp'];
    img = imread(file_name);
    img = imresize(img,[48 48]);
    result = [result img];
end
imwrite(result,'my_Toolbar.bmp');

其中我们还要了解一个东西,就是所谓的背景色,就是说指定你的图标的背景颜色是什么,然后在现实的时候他就会把背景颜色变成透明,这样工具栏上显示出来的就是图标的主体了。一般常用的就是将程序图标外围的颜色全部变成黑色,或者系统默认的RGB=(192,192,192),如下所示:
QQ20130514135150
这是准备工作,然后呢,就在工程资源里面添加生成的长条bmp文件,假设ID是IDB_BITMAP1;

之后就简单了,在框架类中先添加一个变量:CImageList   m_ilToolBar;

然后在框架类OnCreate函数里面添加下面这段代码:

HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
        MAKEINTRESOURCE(IDB_BITMAP1),
        IMAGE_BITMAP,
        0,0,
        LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
CBitmap   bm;
bm.Attach(hbm);    
m_ilToolBar.Create(48, 48, ILC_COLOR8|ILC_MASK, 0, 0);
m_ilToolBar.Add(&bm,RGB(0, 0, 0));
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

上面代码中前五行加载了你的长条bmp文件,然后LR_LOADMAP3DCOLORS标志会让LoadImage将背景映射到系统实际的3D(GetSysColor(COLOR_3DFACE))颜色,默认是(192,192,192)。

6,7行创建位图与位图句柄绑定;

之后设定一个CImageList ,让它显示的是256色,每个图标横宽是48×48,其中ILC_COLOR8就是表示256色,而ILC_MASK大家可以自己试一试,一般情况下,它的作用是,如果不添加它,那么当工具栏某个按钮处于DISABLE的时候,他就是全部是灰色的,没有别的颜色。但是实际上他是作为一个掩膜使能来用的,如果不添加它,那么向我们上面所说的背景色如果设为黑色的话,那么图标黑色会被保留,然后图标不被使能的时候,他做了一个什么奇怪的AND运算,导致现实的结果不是我们想要的。下面就是用与不用ILC_MASK的区别了:


mask2

第九行函数第二项指定的是背景色是什么,我们是黑色所以填的是RGB=(0,0,0),最后通过SetImageList来设定m_wndToolBar是256色而不是之前的16色了。

这里还有一个东西值得注意,大家可以自己去试一下,如果m_ilToolBar是在OnCreate里面定义的一个变量,而不是属于框架类的永久变量,那么就会发现程序一启动一瞬间图标是正常的,然后瞬间变成每个图标像素是8×8了。

唉,说了blog.com真是不好,本来是昨晚写这一篇的,因为那边的资源服务器挂了,图片传不了,所以就今天把它写完了。。。


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: MFC 标签: