工具栏
1.基于对话框的工具栏:
效果图:
(1)首先在主对话框类中添加CToolBar类型的成员,属性设置为protected
class CToolBarDemoDlg : public CDialogEx { //省略 protected:CToolBar m_ToolBar; //省略 };
(2)在资源视图中添加一个工具栏资源
这里添加了4个工具栏按钮...,工具栏ID命名为了IDR_TOOLBAR1,工具栏中4个按钮我分别命名为了ID_BUTTON_RED,ID_BUTTON_PINK,ID_BUTTON_BLUE,ID_BUTTON_YELLOW.
在Resource.h的形式如下,可以看到值是连续的...
#define ID_BUTTON_RED 32771 #define ID_BUTTON_PINK 32772 #define ID_BUTTON_BLUE 32773 #define ID_BUTTON_YELLOW 32774
(3)在主对话框的初始化函数OnInitDialog创建工具栏对象,加载工具栏资源,显示工具栏
1 BOOL CToolBarDemoDlg::OnInitDialog() 2 { 3 //省略 4 //1.创建工具栏对象 5 //2.加载工具栏资源 6 if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 7 CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 8 !m_ToolBar.LoadToolBar(IDR_TOOLBAR1)) 9 { 10 TRACE0("Failed to create toolbar\n"); 11 return -1; 12 } 13 14 //显示工具栏 15 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 16 //省略 17 }
此时编译运行的效果如下:
可以看出效果并不美观,那么如何给工具栏中的按钮添加美观的位图呢?
(4)在网上找自己喜欢的位图资源,我一般在...
这里我找了4张英雄联盟的位图资源...,将这几张位图导入到资源视图中
在Resource.h的形式如下,可以看到值也是连续的...
1 #define IDI_ICON1 131 2 #define IDI_ICON2 132 3 #define IDI_ICON3 133 4 #define IDI_ICON4 134
(5)在主对话框中添加一个CImageList类型的成员,属性设置为protected
1 class CToolBarDemoDlg : public CDialogEx 2 { 3 //省略 4 protected: 5 CImageList m_ImageList; 6 //省略 7 };
(6)在主对话框的初始化函数OnInitDialog创建CImageList对象,并向其中添加位图资源,然后绑定到工具栏
1 BOOL CToolBarDemoDlg::OnInitDialog() 2 { 3 //省略 4 //创建图像列表对象,宽度,高度均为48,32位色,背景透明 5 m_ImageList.Create(48,48,ILC_COLOR32|ILC_MASK, 0,0); 6 7 //向图像列表中循环添加4张位图 8 for (int i=0; i<4;i++) 9 { 10 m_ImageList.Add(::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1+i))); 11 } 12 13 //创建工具栏对象,加载工具栏资源 14 if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 15 CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 16 !m_ToolBar.LoadToolBar(IDR_TOOLBAR1)) 17 { 18 TRACE0("Failed to create toolbar\n"); 19 return -1; 20 } 21 22 //定义一个数组,存放工具栏中按钮的ID 23 UINT nArray[4]; 24 for (int i=0;i<4;i++) 25 { 26 nArray[i]=ID_BUTTON_RED+i; 27 } 28 29 //给工具栏绑定按钮数组 30 m_ToolBar.SetButtons(nArray,4); 31 32 //设置按钮大小,按钮上显示的位图大小 33 m_ToolBar.SetSizes(CSize(55,55),CSize(48,48)); 34 35 //将图像列表绑定到工具栏 36 m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList); 37 38 //显示工具栏 39 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 40 //省略 41 }
编译运行的效果:
(7)给工具栏上面的按钮添加消息响应
首先在消息映射宏之间添加相应的项
1 BEGIN_MESSAGE_MAP(CToolBarDemoDlg, CDialogEx) 2 ON_COMMAND(ID_BUTTON_RED, &CToolBarDemoDlg::OnRed) 3 ON_COMMAND(ID_BUTTON_PINK, &CToolBarDemoDlg::OnPink) 4 ON_COMMAND(ID_BUTTON_BLUE, &CToolBarDemoDlg::OnBlue) 5 ON_COMMAND(ID_BUTTON_YELLOW, &CToolBarDemoDlg::OnYellow) 6 END_MESSAGE_MAP()
然后在主对话框类中添加消息响应函数的声明
1 class CToolBarDemoDlg : public CDialogEx 2 { 3 //省略 4 afx_msg void OnRed(); 5 afx_msg void OnPink(); 6 afx_msg void OnBlue(); 7 afx_msg void OnYellow(); 8 //省略 9 };
接着在主对话框类的实现文件中添加消息响应函数的实现代码
1 void CToolBarDemoDlg::OnRed() 2 { 3 AfxMessageBox(_T("单击了剑魔")); 4 } 5 6 void CToolBarDemoDlg::OnPink() 7 { 8 AfxMessageBox(_T("单击了狐狸")); 9 } 10 11 void CToolBarDemoDlg::OnBlue() 12 { 13 AfxMessageBox(_T("单击了刀妹")); 14 } 15 16 void CToolBarDemoDlg::OnYellow() 17 { 18 AfxMessageBox(_T("单击了女警")); 19 }
2.基于单文档或者多文档的工具栏:
其实基于单文档或多文档的工具栏的创建与基于对话框的大同小异
只不过基于单文档或多文档的工具栏可以悬浮显示
工具栏可悬浮的关键:
1 //工具栏可停靠 2 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 3 4 //主框架窗口可被停靠 5 EnableDocking(CBRS_ALIGN_ANY); 6 7 //停靠过去 8 DockControlBar(&m_wndToolBar);
3.工具栏的显示与隐藏:
效果图:
基于对话框的工具栏:
1 void CToolBarDemoDlg::OnBnClickedBtnCtb() 2 { 3 if (m_ToolBar.IsWindowVisible()) 4 { 5 m_ToolBar.ShowWindow(SW_HIDE); 6 } 7 else 8 { 9 m_ToolBar.ShowWindow(SW_SHOW); 10 } 11 }
基于单文档或多文档的工具栏:
if (m_ToolBar.IsWindowVisible()){m_ToolBar.ShowWindow(SW_HIDE);}else{m_ToolBar.ShowWindow(SW_SHOW);}//重新布局工具栏的位置RecalcLayout();
转载于:.html
工具栏
1.基于对话框的工具栏:
效果图:
(1)首先在主对话框类中添加CToolBar类型的成员,属性设置为protected
class CToolBarDemoDlg : public CDialogEx { //省略 protected:CToolBar m_ToolBar; //省略 };
(2)在资源视图中添加一个工具栏资源
这里添加了4个工具栏按钮...,工具栏ID命名为了IDR_TOOLBAR1,工具栏中4个按钮我分别命名为了ID_BUTTON_RED,ID_BUTTON_PINK,ID_BUTTON_BLUE,ID_BUTTON_YELLOW.
在Resource.h的形式如下,可以看到值是连续的...
#define ID_BUTTON_RED 32771 #define ID_BUTTON_PINK 32772 #define ID_BUTTON_BLUE 32773 #define ID_BUTTON_YELLOW 32774
(3)在主对话框的初始化函数OnInitDialog创建工具栏对象,加载工具栏资源,显示工具栏
1 BOOL CToolBarDemoDlg::OnInitDialog() 2 { 3 //省略 4 //1.创建工具栏对象 5 //2.加载工具栏资源 6 if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 7 CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 8 !m_ToolBar.LoadToolBar(IDR_TOOLBAR1)) 9 { 10 TRACE0("Failed to create toolbar\n"); 11 return -1; 12 } 13 14 //显示工具栏 15 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 16 //省略 17 }
此时编译运行的效果如下:
可以看出效果并不美观,那么如何给工具栏中的按钮添加美观的位图呢?
(4)在网上找自己喜欢的位图资源,我一般在...
这里我找了4张英雄联盟的位图资源...,将这几张位图导入到资源视图中
在Resource.h的形式如下,可以看到值也是连续的...
1 #define IDI_ICON1 131 2 #define IDI_ICON2 132 3 #define IDI_ICON3 133 4 #define IDI_ICON4 134
(5)在主对话框中添加一个CImageList类型的成员,属性设置为protected
1 class CToolBarDemoDlg : public CDialogEx 2 { 3 //省略 4 protected: 5 CImageList m_ImageList; 6 //省略 7 };
(6)在主对话框的初始化函数OnInitDialog创建CImageList对象,并向其中添加位图资源,然后绑定到工具栏
1 BOOL CToolBarDemoDlg::OnInitDialog() 2 { 3 //省略 4 //创建图像列表对象,宽度,高度均为48,32位色,背景透明 5 m_ImageList.Create(48,48,ILC_COLOR32|ILC_MASK, 0,0); 6 7 //向图像列表中循环添加4张位图 8 for (int i=0; i<4;i++) 9 { 10 m_ImageList.Add(::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1+i))); 11 } 12 13 //创建工具栏对象,加载工具栏资源 14 if (!m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | 15 CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 16 !m_ToolBar.LoadToolBar(IDR_TOOLBAR1)) 17 { 18 TRACE0("Failed to create toolbar\n"); 19 return -1; 20 } 21 22 //定义一个数组,存放工具栏中按钮的ID 23 UINT nArray[4]; 24 for (int i=0;i<4;i++) 25 { 26 nArray[i]=ID_BUTTON_RED+i; 27 } 28 29 //给工具栏绑定按钮数组 30 m_ToolBar.SetButtons(nArray,4); 31 32 //设置按钮大小,按钮上显示的位图大小 33 m_ToolBar.SetSizes(CSize(55,55),CSize(48,48)); 34 35 //将图像列表绑定到工具栏 36 m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList); 37 38 //显示工具栏 39 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 40 //省略 41 }
编译运行的效果:
(7)给工具栏上面的按钮添加消息响应
首先在消息映射宏之间添加相应的项
1 BEGIN_MESSAGE_MAP(CToolBarDemoDlg, CDialogEx) 2 ON_COMMAND(ID_BUTTON_RED, &CToolBarDemoDlg::OnRed) 3 ON_COMMAND(ID_BUTTON_PINK, &CToolBarDemoDlg::OnPink) 4 ON_COMMAND(ID_BUTTON_BLUE, &CToolBarDemoDlg::OnBlue) 5 ON_COMMAND(ID_BUTTON_YELLOW, &CToolBarDemoDlg::OnYellow) 6 END_MESSAGE_MAP()
然后在主对话框类中添加消息响应函数的声明
1 class CToolBarDemoDlg : public CDialogEx 2 { 3 //省略 4 afx_msg void OnRed(); 5 afx_msg void OnPink(); 6 afx_msg void OnBlue(); 7 afx_msg void OnYellow(); 8 //省略 9 };
接着在主对话框类的实现文件中添加消息响应函数的实现代码
1 void CToolBarDemoDlg::OnRed() 2 { 3 AfxMessageBox(_T("单击了剑魔")); 4 } 5 6 void CToolBarDemoDlg::OnPink() 7 { 8 AfxMessageBox(_T("单击了狐狸")); 9 } 10 11 void CToolBarDemoDlg::OnBlue() 12 { 13 AfxMessageBox(_T("单击了刀妹")); 14 } 15 16 void CToolBarDemoDlg::OnYellow() 17 { 18 AfxMessageBox(_T("单击了女警")); 19 }
2.基于单文档或者多文档的工具栏:
其实基于单文档或多文档的工具栏的创建与基于对话框的大同小异
只不过基于单文档或多文档的工具栏可以悬浮显示
工具栏可悬浮的关键:
1 //工具栏可停靠 2 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 3 4 //主框架窗口可被停靠 5 EnableDocking(CBRS_ALIGN_ANY); 6 7 //停靠过去 8 DockControlBar(&m_wndToolBar);
3.工具栏的显示与隐藏:
效果图:
基于对话框的工具栏:
1 void CToolBarDemoDlg::OnBnClickedBtnCtb() 2 { 3 if (m_ToolBar.IsWindowVisible()) 4 { 5 m_ToolBar.ShowWindow(SW_HIDE); 6 } 7 else 8 { 9 m_ToolBar.ShowWindow(SW_SHOW); 10 } 11 }
基于单文档或多文档的工具栏:
if (m_ToolBar.IsWindowVisible()){m_ToolBar.ShowWindow(SW_HIDE);}else{m_ToolBar.ShowWindow(SW_SHOW);}//重新布局工具栏的位置RecalcLayout();
转载于:.html