---恢复内容开始---

首先CToolBarCtrl类内部维护了三个重要的数据结构:一个图像列表,一个字符串列表,一个TBBUTTON结构体的列表。

知道了这一点,下面的理解起来就轻松了。慢慢来:

用CToolBarCtrl类为对话框创建工具栏的一般步骤:

1、准备一张工具栏的位图(有两种方法加载位图,一种是为工具栏中每一个按钮关联一张位图,第二种是加载一整张位图,这张位图中有所有工具栏按钮的图像,然后设定每个按钮图像的大小,这样系统就可以把一整张位图按像素分成多张位图,本文采用第二种方法)

2、在资源视图中的String Table中加入工具栏中每个按钮对应的字符串,如:

3、添加一个MFC类,命名为CStandardBar,基类为CToolBarCtrl类。

4、在CStandardBar类中添加成员变量:

int         m_nButtonCount;   //工具栏按钮的数量
TBBUTTON    *m_pTBButtons;   //工具栏按钮

5、在CStandardBar类中重载基类CToolBarCtrl类中的Create函数,如下:(先给出代码然后再解释)

 BOOL CStandardBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
// TODO: 在此添加专用代码和/或调用基类 BOOL bRect=CToolBarCtrl::Create(dwStyle, rect, pParentWnd, nID);//一定要先掉用create函数用于
//Creates a toolbar control and attaches it to a CToolBarCtrl object. m_nButtonCount = IDSTR_OUT - IDSTR_XSDJ + ; //计算得到工具栏按钮的个数 //CToolBarCtrl::SetBitmapSize(CSize(32,32));
SetBitmapSize( CSize(,) ); //设置工具栏中位图的大小,会根据这个大小分割导入的位图 VERIFY(AddBitmap(m_nButtonCount,IDR_STANDARDBAR) != -);//添加位图 m_pTBButtons = new TBBUTTON[m_nButtonCount]; //创建工具栏的按钮 for (int nIndex = ; nIndex < m_nButtonCount; nIndex++)
{
CString string;
string.LoadString(nIndex + IDSTR_XSDJ); //从字符串表中加载字符 // Add second '\0' //向工具条的字符串列表添加字符串
int nStringLength = string.GetLength() + ;
TCHAR * pString = string.GetBufferSetLength(nStringLength); //The last string must be terminated with two null characters.
pString[nStringLength-] = ;
pString[nStringLength-] = ; VERIFY((m_pTBButtons[nIndex].iString = AddStrings(pString)) != -);//向工具条的字符串列表添加字符串 string.ReleaseBuffer(); m_pTBButtons[nIndex].fsState =TBSTATE_ENABLED;
m_pTBButtons[nIndex].fsStyle =TBSTYLE_FLAT;
m_pTBButtons[nIndex].dwData = ;
m_pTBButtons[nIndex].iBitmap = nIndex;
m_pTBButtons[nIndex].iString =nIndex;
m_pTBButtons[nIndex].idCommand = nIndex + IDSTR_XSDJ;
} m_pTBButtons[m_nButtonCount-].idCommand=IDCANCEL; //添加按钮 //分隔按钮
TBBUTTON sepButton;
sepButton.idCommand = ;
sepButton.fsStyle = TBSTYLE_SEP;
sepButton.fsState = TBSTATE_ENABLED;
sepButton.iString = ;
sepButton.iBitmap = ;
sepButton.dwData = ; for (int nIndex = ; nIndex < m_nButtonCount; nIndex++)
{
//添加按钮
VERIFY(AddButtons(,&m_pTBButtons[nIndex]));
if (!((nIndex +) % ))
{
VERIFY(AddButtons(,&sepButton));//添加分隔按钮
}
}
//this->SetStyle(TBSTYLE_FLAT|CCS_TOP); return bRect;
}

在重写的函数中:

(1)要调用基类CToolBarCtrl类的Create函数,用于创建一个CToolBarCtrl类的对象并且绑定工具栏。

(2)计算出工具栏中按钮的数量m_nButtonCount,在以后的代码中要使用它。

(3)设置每个按钮对应的位图的大小:SetBitmapSize( CSize(32,32) ); 然后加载整张位图:

    AddBitmap(m_nButtonCount,IDR_STANDARDBAR)。之所以要设置每个按钮对应的位图的大小是因为只有这样,MFC的底层才知道怎样去分割那一整张位图,我的那个位图的长势288像素,工具栏中有9个按钮,288/9=32,所以设置为(32,32).

(4)创建TBBUTTON数组,在循环中给每个元素赋值。这里仔细说一下:

  TBBUTTON的定义:

其中那些以字符i开头的iBitmap,iString都是一个序号,什么序号(索引)呢?一开始我们就说过,CToolBarCtrl类中维护了三个重要的数据结构,而iBitmap和iString就是图像列表和字符串列表中元素的索引。这个索引怎么产生的能?我们每调用一次AddBitmap(AddStrings)函数,对应的索引就会加一。正是因为这种机制,按钮和字符串以及位图才会关联对应起来。idCommand是按钮对应的ID.

(5)用AddButtons往工具栏中添加按钮。(代码中还添加了分割条)

6、在对话框类中添加CStandardBar类的对象:

CStandardBar    m_StandardBar;

7、在OnCreate或者OninitDialog函数中调用重写的Create函数和调整大小的函数。如:

m_StandardBar.Create( WS_VISIBLE | WS_CHILD |WS_BORDER|TBSTYLE_WRAPABLE  | CCS_TOP,CRect(,,,),this, IDR_STANDARDBAR);
m_StandardBar.AutoSize();

这样对话框中的工具栏就建立了,最后给一张效果图;

---恢复内容结束---

用CToolBarCtrl类为对话框创建工具栏的更多相关文章

  1. wxpython 创建工具栏和菜单栏

    下面看一下关于创建工具栏,状态栏和菜单的方法,看下面一个例子: import wx class ToolBarFrame(wx.Frame): def __init__(self,parent,id) ...

  2. 实现MFC扩展DLL中导出类和对话框

    如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对 ...

  3. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  4. Cookie操作类、 包括创建、读取、修改、获取、销毁cookie

    Cookie操作类. 包括创建.读取.修改.获取.销毁cookie import java.util.Hashtable; import java.util.Iterator; import java ...

  5. 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问

    1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...

  6. NX二次开发-UFUN按类选择对话框UF_UI_select_with_class_dialog

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //按类选择对话框 char sCue[] = "按类选择对话 ...

  7. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(7)之扩展基类和区域创建以及文本编辑配置

    一.扩展基类和区域创建 (1)在应用之前,我们先在表现层创建一个公共的系统扩展文件来(SystemExtension)存放我们需要延伸和扩展的方法类. 在常规的项目系统操作中,我们都需要用到增删查改的 ...

  8. python用类的方式创建线程---自创建类

    用类的方式创建线程---自创建类 import threadingimport time class MyThread(threading.Thread):#自建MyThread类继承threadin ...

  9. 编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容

    题目1:编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容--"chen","wang",&q ...

随机推荐

  1. Java核心技术II读书笔记(一)

    Char2 XML 解析器:读入一个文件,确认其具有正确的格式,然后将其分解成各种元素,使程序员能够访问这些元素. java库提供了两种XML解析器:DOM和SAX,即文档对象模型和流机制解析器. D ...

  2. dynamic_cast

    作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别.除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转 ...

  3. 实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...

    1.布局xml文件 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...

  4. Android 注解的一些应用以及原理

    在这边文章之前你首先需要对java 的注解部分有一个基本的了解(不需要太过的深入). 简单来说,注解这个东西就是用于辅助我们开发java代码的,注解本身无法干扰java源代码的执行. 在android ...

  5. Oracle数据库备份手册

    1         故障类型 l  实例故障 由ORACLE内部异常.操作系统故障或其它相关软件引起,导致ORACLE实例中的进程或内存区出现故障或数据库无法正常关闭,这种故障称为实例故障.实例故障没 ...

  6. 嵌入式 十个最值得阅读学习的C开源项目代码

    开源世界有许多优秀的开源项目,我选取其中十个最优秀的.最轻量级的C语言的项目,希望可以为C语言开发人员提供参考. 十个最值得阅读学习的C开源项目代码 1. Webbench 2. Tinyhttpd ...

  7. DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现

    在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中,笔者阐述了一个防御状态机,它可用来抵御来自应用层的DDoS攻击,但是该状态机依赖一个能应对大量条目快速增删的ip黑白 ...

  8. 给编译好的DLL增加签名

    两个步骤,记录如下,主要用在silverlight中引用的dll要签名时: "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm ...

  9. Objective-C开发图书推荐

    日本Objective-C圣经级教材:Objective-C编程全解(第3版) 作      者 [日] 荻原刚志 著:唐璐,翟俊杰 译 出 版 社 人民邮电出版社 出版时间 2015-01-01 版 ...

  10. linux nginx安装(转载)

    1.linux 下面安装 1.下载 pcre-8.10.tar.gz  nginx-1.1.1.tar.gz 2.安装 pcre 让nginx支持rewrite pcre-8.10.tar.gz  上 ...