关于256色工具条的简单问题。(初手)---50分

xeeo 2002-09-26 12:11:16
在网上下载了一份源代码。想进行一些简单修改:
把它的工具条上的256色图标(如“后退” “停止”等)换成自己的图标,另外还要在原来的基础上多加一个图标,我只知道大概是在MainFrame 的OnCreate上修改,但不知道具体怎么做,望告之详细完整步骤,包括最基本的部分,(如加入自己的图标,修改OnCraete 代码等)。 虽然我认为步骤较通用,但我决定提供其代码,不知有没有必要。


===
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
VERIFY(CFrameWnd::OnCreate(lpCreateStruct)==0);

// Create and load toolbar
//
VERIFY(m_wndToolBar.CreateEx(this));
VERIFY(m_wndToolBar.LoadToolBar(IDR_MAINFRAME));

// Load tollbar bitmap -- must use ::LoadImage to map colors
// This will map (192,192,192) to COLOR_3DFACE.
//
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_BITMAP,
0,0, // cx,cy
LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );
CBitmap bm;
bm.Attach(hbm);

// Create image list and set in toolbar.
// Must use ILC_COLOR8 for 256-color images!
//
m_ilToolBar.Create(20,20, ILC_COLOR8, 4, 4);
m_ilToolBar.Add(&bm,(CBitmap*)NULL);
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

VERIFY(m_wndStatusBar.Create(this));
VERIFY(m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)));

VERIFY(m_wndView.Create(_T("Press a button, any button."),
WS_VISIBLE|WS_CHILD|SS_CENTERIMAGE|SS_CENTER,
CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST));

return 0;
}

====
望告之详细完整步骤

谢谢
...全文
37 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
心念不空过 2002-09-26
  • 打赏
  • 举报
回复
通常应用程序的工具按钮都是16色的,但是实际上也可以根据需要使用256种色(8位色),甚至是24位的颜色。尺寸也不一定是16x15,也可以是任意大的尺寸。

实现方法就是利用CImageList类装载24位颜色或256色的位图(共需三个位图),然后分别调用CToolbar类的成员函数SetImageList()、SetDisabledImageList()和SetHotImageList()。

制作位图
需要为工具条上的每个按钮准备三个位图,分别表示三种状态:正常、加亮(hot)和变灰(disabled),其中后两个也可省略不要。加亮就是当鼠标指针指向该按钮时的状态,变灰就是当该按钮被禁止时的状态。现在假设主窗口有两个工具条,按钮图形尺寸是24x23。

首先可以制作表示正常状态的位图:

分别为每个按钮制作一个24x23的图形;
将制作好的按钮图形左右排列,相邻地组合在一块,形成一个位图;
将位图以24位颜色的格式保存为bmp文件,比如toolbarimg0.bmp和toolbarimg.bmp文件。
制作时需要注意的是,按钮图形在位图中的排列顺序,一定要与该工具栏资源模板中的按钮顺序完全相同,一一对应。这里的资源模板仍然是需要的,因为这样我们就不必自己编写构造按钮的具体代码,而由主框架(Framework)去完成。

下一步就是制作加亮和变灰的位图:

将上面制作的正常状态的位图,经过纹理化处理(比如用照片编辑器),然后以256色的格式另存为另外一个bmp文件,比如toolbardisabledimg0.bmp和toolbardisabledimg.bmp文件,作为禁止状态的位图,没有必要为其保存24位格式;
同样,将上面制作的正常状态的位图,经过加亮处理,然后以256色的格式另存为另外一个bmp文件,比如toolbarhotimg0.bmp和toolbarhotimg.bmp文件,作为加亮状态的位图。
将上述制作的六个位图,全部import到工程中来,分别分配它们的资源ID为:
IDB_IMG0
IDB_DISABLED_IMG0
IDB_HOT_IMG0
IDB_IMG
IDB_DISABLED_IMG
IDB_HOT_IMG
注意:对于24位位图,在import时会出现一个警告对话框,可以不必理会它。
添加实现代码
在CMainFrame类内添加如下六个变量(可以设为protected):
CImageList m_img1;
CImageList m_img2;
CImageList m_disabledimg1;
CImageList m_disabledimg2;
CImageList m_hotimg1;
CImageList m_hotimg2;



在CMainFrame类的OnCreate()函数末尾的return 0;语句之前插入如下代码:
//Load imagelists for toolbar1:
CBitmap bm;
bm.LoadBitmap(IDB_IMG0);
m_img1.Create(24,23,ILC_COLOR24,4,0);
m_img1.Add(&bm,RGB(0,0,0));
bm.DeleteObject();
bm.LoadBitmap(IDB_DISABLED_IMG0);
m_disabledimg1.Create(24,23,ILC_COLOR8,4,0);
m_disabledimg1.Add(&bm,RGB(0,0,0));
bm.DeleteObject();
bm.LoadBitmap(IDB_HOT_IMG0);
m_hotimg1.Create(24,23,ILC_COLOR8,4,0);
m_hotimg1.Add(&bm,RGB(0,0,0));

//Set imagelists for toolbar1:
CToolBarCtrl& ctl1=m_wndToolBar.GetToolBarCtrl();
ctl1.SetImageList(&m_img1);
ctl1.SetDisabledImageList(&m_disabledimg1);
ctl1.SetHotImageList(&m_hotimg1);

//Load imagelists for toolbar2:
bm.DeleteObject();
bm.LoadBitmap(IDB_IMG);
m_img2.Create(24,23,ILC_COLOR24,4,0);
m_img2.Add(&bm,RGB(0,0,0));
bm.DeleteObject();
bm.LoadBitmap(IDB_DISABLED_IMG);
m_disabledimg2.Create(24,23,ILC_COLOR8,4,0);
m_disabledimg2.Add(&bm,RGB(0,0,0));
bm.DeleteObject();
bm.LoadBitmap(IDB_HOT_IMG);
m_hotimg2.Create(24,23,ILC_COLOR8,4,0);
m_hotimg2.Add(&bm,RGB(0,0,0));

//Set imagelists for toolbar2:
CToolBarCtrl& ctl2=m_wndMyToolBar.GetToolBarCtrl();
ctl2.SetImageList(&m_img2);
ctl2.SetDisabledImageList(&m_disabledimg2);
ctl2.SetHotImageList(&m_hotimg2);



这里所采用的关键技术就是在调用CImageList类的Create()函数时,将其第二个参数指定为ILC_COLOR24或ILC_COLOR8,我们即可把24位或8位的位图加载进来。这种方法在显示TreeView和ListView中的图标时同样适用。
ZHENG017 2002-09-26
  • 打赏
  • 举报
回复
在resource view里->toolbar->IDR_MAINFRAME,修改增加一个按钮
wuxuan 2002-09-26
  • 打赏
  • 举报
回复
see this:
http://www.codeproject.com/docking/chevrons.asp
http://www.codeproject.com/docking/TrueColorToolBar.asp

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧