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

首先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();

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

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

最新文章

  1. css3几个新属性
  2. php 利用socket发送GET,POST请求
  3. hdu 4193 Non-negative Partial Sums
  4. 【第四篇】说说layer的iframe弹窗给里面的标签赋值的问题
  5. HashBiMap
  6. Turbo Sort Add problem to Todo list Problem code: TSORT
  7. hive优化之自己主动合并输出的小文件
  8. POJ 1015 Jury Compromise
  9. 用app.net Core搞点多国语言网站
  10. js 面向对象 继承
  11. 图论算法-最小费用最大流模板【EK;Dinic】
  12. Huginn实现自动通过slack推送豆瓣高分电影
  13. 吴恩达《机器学习》编程作业——machine-learning-ex1:线性回归
  14. vue全局组件-父子组件传值
  15. Linux常用基本命令:三剑客命令之-sed
  16. SpringMVC探究-----从HelloWorld开始
  17. 使用pickle进行存储变量
  18. Spring+Junit测试用例的使用
  19. 【转载记录】Accessing Device Drivers from C#
  20. 【python】matplotlib进阶

热门文章

  1. Android RecyclerView使用详解(一)
  2. loadrunner ---&lt;三&gt;循环输出关联数组
  3. 【转】PHP字符转义相关函数小结
  4. C# ComboBox自动完成功能的示例
  5. 黑马程序员——有关protocol的小结
  6. MFC学习20160718(GetModuleFileName&amp;amp;&amp;amp;GetAppDataPath)
  7. C++中string 的使用
  8. OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)
  9. Codeforces Educational Codeforces Round 15 D. Road to Post Office
  10. js 多物体运动