工具栏,状态栏(VC_MFC)
目录
(本章节中例子都是用 VS2005 编译调试的)
工具栏
相关类: CToolBar , CToolBarCtrl
对话框
相关函数:
- 创建工具栏: Create
- 加载工具栏: LoadToolBar
- 移动窗口: MoveWindow
- 获得客服区/窗口区域: GetClientRect / GetWindowRect
- 调整和重置窗口客户区的控制栏(工具栏/状态栏)位置: RepositionBars
- 获得请求的窗口对象: GetWindow
- 获得在窗口管理链表中的下个窗口: GetNextWindow
- 设置工具栏按钮和按钮上图像大小: SetSizes
- 设置对话框按钮: SetButtons
- 获得 CToolBarCtrl 对象: GetToolBarCtrl
- 设置图标: SetImageList
操作步骤:
菜单索引:
代码示例:
[加载工具栏][加载自定义位图的工具栏]
在对话框中添加工具栏,首先添加一个工具栏资源(资源 ID 为 IDR_TOOLBAR1),工具栏资源和对话框资源,资源视图如下:
然后为对话框添加一个 CToolBar 对象变量名为 m_tbar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,代码如下:
//创建 ToolBar 和加载资源 if(m_tbar.Create(this) && m_tbar.LoadToolBar(IDR_TOOLBAR1)) { /* 前期准备工作 *************************************************************************/ CRect rcClientOld; CRect rcClientNew; // 用 rcClientOld 获取客户区间 GetClientRect(rcClientOld); // 用 rcClientNew 获得除了 ToolBar 区的对话框客户区 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew); //获得在加入 ToolBar 后控件应该移动的偏移偏移量 CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top); /* 重新设置对话框的窗体区间 *************************************************************/ //得到对话框窗体区间 CRect rcWindow; GetWindowRect(rcWindow); //修改对话框宽度和高度,即让对话框添加上 ToolBar 的高度和适应 ToolBar 的高度 rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height(); //移动对话框 MoveWindow(rcWindow,FALSE); /* 调整控件位置 *************************************************************************/ CRect rcChild; //获得窗口控件 CWnd* pwndChild = GetWindow(GW_CHILD); //遍历控件 while(pwndChild) { //获得控件区间 pwndChild->GetWindowRect(rcChild); //将屏幕坐标转换为客户区坐标 ScreenToClient(rcChild); //将控件移动相对位置 rcChild.OffsetRect(ptOffset); //移动控件 pwndChild->MoveWindow(rcChild,FALSE); //获得下个控件句柄 pwndChild = pwndChild->GetNextWindow(); } //显示 ToolBar RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); }
运行结果:
在对话框中添加工具栏,首先添加一个位图资源(资源 ID 为 IDB_BITMAP1),位图资源和对话框资源,资源视图如下:
然后为对话框添加一个 CToolBar 对象变量名为 m_tbar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,(具体代码和添加工具栏中的相似)代码如下:
//创建工具栏 if(m_tbar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_SIZE_FIXED|CBRS_TOP|CBRS_TOOLTIPS)) { /* 创建自定义位图的工具栏初始化工作 ***************************************************/ //定义工具栏上的按钮的所对应的标识 static UINT BASED_CODE DockTool[]={IDOK,IDCANCEL}; //加载工具栏要用的位图 CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP1); //建立工具栏中的图片列表 static CImageList m_ilToolBar; m_ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以宽 100,长 100 像素来切割图片 m_ilToolBar.Add(&bitmap,(CBitmap*)NULL); //设置工具栏按钮图片 m_tbar.GetToolBarCtrl().SetImageList(&m_ilToolBar); //设置工具栏的按钮大小,和按钮中位图大小(注意: 按钮大小必须大于按钮中位图大小) SIZE sbutton,sImage; sbutton.cx= 110; sbutton.cy=110; sImage.cx=100; sImage.cy=100; m_tbar.SetSizes(sbutton,sImage); //设置工具栏上按钮的所对应的标识,和按钮个数 m_tbar.SetButtons(DockTool,(UINT)2); /* 前期准备工作 *************************************************************************/ CRect rcClientOld; CRect rcClientNew; // 用 rcClientOld 获取客户区间 GetClientRect(rcClientOld); // 用 rcClientNew 获得除了 ToolBar 区的对话框客户区 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew); //获得在加入 ToolBar 后控件应该移动的偏移偏移量 CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top); /* 重新设置对话框的窗体区间 *************************************************************/ //得到对话框窗体区间 CRect rcWindow; GetWindowRect(rcWindow); //修改对话框宽度和高度,即让对话框添加上 ToolBar 的高度和适应 ToolBar 的高度 rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height(); //移动对话框 MoveWindow(rcWindow,FALSE); /* 调整控件位置 *************************************************************************/ CRect rcChild; //获得窗口控件 CWnd* pwndChild = GetWindow(GW_CHILD); //遍历控件 while(pwndChild) { //获得控件区间 pwndChild->GetWindowRect(rcChild); //将屏幕坐标转换为客户区坐标 ScreenToClient(rcChild); //将控件移动相对位置 rcChild.OffsetRect(ptOffset); //移动控件 pwndChild->MoveWindow(rcChild,FALSE); //获得下个控件句柄 pwndChild = pwndChild->GetNextWindow(); } //显示 ToolBar RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); }
运行结果:
单/多文档
相关函数:
- 创建工具栏: Create
- 加载工具栏: LoadToolBar
- 设置工具栏按钮和按钮上图像大小: SetSizes
- 设置对话框按钮: SetButtons
- 获得 CToolBarCtrl 对象: GetToolBarCtrl
- 设置图标: SetImageList
- 设置工具栏可以停靠位置: EnableDocking
- 设置框架窗口被工具栏停靠: DockControlBar
- 设置框架可以让工具栏停靠位置: EnableDocking
- 判断窗口是否可见: IsWindowVisible
- 隐藏/显示工具栏: ShowControlBar
操作步骤:
菜单索引:
代码示例:
[加载工具栏][加载带自定义位图工具栏][显示/隐藏工具栏]
在文档中添加工具栏,这个功能只能在框架类中完成(即 CFrameWnd 类),由于一生成 单文档/多文档 工程时候,会为程序添加一个默认的工具栏(资源 ID 为).这里用的是单文档工程这个工具栏的资源视图如下:
这个工具栏的添加在框架类的初始化(即 OnCreate 函数)中,具体代码如下(省略了无关代码):
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //创建一个工具栏 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } ... //使工具栏可以停靠 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); ... }
运行结果:
在文档中添加工具栏,这个功能只能在框架类中完成(即 CFrameWnd 类),这里生成的是单文档工程,然后为文档添加一个位图资源,资源视图如下:
然后为框架类添加一个 CToolBar 对象变量名为 m_Mytbar,在框架类的初始化(即 OnCreate 函数)中,添加相关的实现代码,具体代码如下:
//创建自定义工具栏 if (m_Mytbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)) { //定义工具栏上的按钮的所对应的标识 static UINT BASED_CODE DockTool[]={ID_FILE_NEW,ID_FILE_OPEN}; //加载工具栏要用的位图 CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP1); //建立工具栏中的图片列表 static CImageList ilToolBar; ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以宽 100,长 100 像素来切割图片 ilToolBar.Add(&bitmap,(CBitmap*)NULL); //设置工具栏按钮图片 m_Mytbar.GetToolBarCtrl().SetImageList(&ilToolBar); //设置工具栏的按钮大小,和按钮中位图大小(注意: 按钮大小必须大于按钮中位图大小) SIZE sbutton,sImage; sbutton.cx= 110; sbutton.cy=110; sImage.cx=100; sImage.cy=100; m_Mytbar.SetSizes(sbutton,sImage); //设置工具栏上按钮的所对应的标识,和按钮个数 m_Mytbar.SetButtons(DockTool,(UINT)2); //设置工具栏使其可以停靠在框架窗口上 m_Mytbar.EnableDocking(CBRS_ALIGN_ANY); //把工具栏停靠在框架窗口上 DockControlBar(&m_Mytbar); }
运行结果:
接着上个代码示例,为文档程序在主菜单栏上添加个 显示/隐藏工具栏 的菜单项,完成 显示/隐藏工具栏 的这个功能.菜单资源(菜单资源 ID 为 IDR_MAINFRAME,菜单项 ID 为 ID_TB)视图如下:
为菜单项 显示/隐藏工具栏 在框架类中添加事件响应函数,后在事件响应函数中添加相关操作,具体代码如下:
if(m_Mytbar.IsWindowVisible()) ShowControlBar(&m_Mytbar,false,false); else ShowControlBar(&m_Mytbar,true,false);
运行结果:
状态栏
相关类: CStatusBar , CStatusBarCtrl
对话框
相关函数:
- 移动窗口: MoveWindow
- 获得客服区/窗口区域: GetClientRect / GetWindowRect
- 调整和重置窗口客户区的控制栏(工具栏/状态栏)位置: RepositionBars
- 创建状态栏: Create
- 设置状态栏指示器(用于添加或减少状态栏上窗格): SetIndicators
- 获得 / 设置状态栏上窗格的显示的字符串: GetPaneText / SetPaneText
- 用标识获得窗格索引: CommandToIndex
- 获得 / 设置窗格属性(ID,样式,宽度): GetPaneInfo / SetPaneInfo
- 获得索引窗口格的矩形大小: GetItemRect
- 获得索引窗口格的 ID: GetItemID
- 获得 / 设置索引窗口格的风格: GetPaneStyle / SetPaneStyle
- 设置工具宽度: SetMinHeight
- 设置所有窗口格的图标: SetIcon
具体步骤:
代码示例:
在对话框中添加状态栏,首先添加两个图标资源(资源 ID 为 IDI_ICON1,IDI_ICON2),图标资源和对话框资源,资源视图如下:
然后为对话框添加一个 CStatusBar 对象变量名为 m_StatBar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,具体代码如下:
//创建状态栏 if(m_StatBar.Create(this)) { // 状态行指示器对应 ID static UINT indicators[] = { ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // 设置状态栏指示器 ID 和指示器个数 m_StatBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); // 设置状态栏指示器文本 m_StatBar.SetPaneText(0,L"指示器1",0); m_StatBar.SetPaneText(1,L"指示器2",0); m_StatBar.SetPaneText(2,L"指示器3",0); m_StatBar.SetPaneText(3,L"指示器4",0); // 设置状态栏指示器属性 m_StatBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL ,100); m_StatBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL ,100); m_StatBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL ,100); m_StatBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL ,100); //为状态栏指示器添加图标 HICON icon[2]; icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1); icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2); m_StatBar.GetStatusBarCtrl().SetIcon(0,icon[0]); m_StatBar.GetStatusBarCtrl().SetIcon(1,icon[1]); m_StatBar.GetStatusBarCtrl().SetIcon(2,icon[0]); m_StatBar.GetStatusBarCtrl().SetIcon(3,icon[1]); //设置状态栏高度 m_StatBar.GetStatusBarCtrl().SetMinHeight(50); /* 前期准备工作 *************************************************************************/ CRect rcClientOld; CRect rcClientNew; // 用 rcClientOld 获取客户区间 GetClientRect(rcClientOld); // 用 rcClientNew 获得除了 CStatusBar 区的对话框客户区 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew); /* 这里要注意下如果你在对话框中添加了工具栏和状态栏,那么这里获得的是这些控制栏的矩形区,即高度是控制栏(工具栏加状态栏)的总和,宽度是控制栏中最宽的那个..********/ /* 重新设置对话框的窗体区间 *************************************************************/ // 得到对话框窗体区间 CRect rcWindow; GetWindowRect(rcWindow); // 修改对话框宽度和高度,即让对话框添加上 CStatusBar 的高度和适应 CStatusBar 的宽度 rcWindow.right += rcClientOld.Width() - rcClientNew.Width(); rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height(); // 移动对话框 MoveWindow(rcWindow,FALSE); // 显示状态栏 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); }
运行结果:
单/多文档
相关函数:
- 创建状态栏: Create
- 设置状态栏指示器(用于添加或减少状态栏上窗格): SetIndicators
- 获得 / 设置状态栏上窗格的显示的字符串: GetPaneText / SetPaneText
- 用标识获得窗格索引: CommandToIndex
- 获得 / 设置窗格属性(ID,样式,宽度): GetPaneInfo / SetPaneInfo
- 获得索引窗口格的矩形大小: GetItemRect
- 获得索引窗口格的 ID: GetItemID
- 获得 / 设置索引窗口格的风格: GetPaneStyle / SetPaneStyle
- 设置工具宽度: SetMinHeight
- 设置所有窗口格的图标: SetIcon
代码示例:
在文档中添加状态栏,这个功能只能在框架类中完成(即 CFrameWnd 类),由于一生成 单文档/多文档 工程时候,会为程序添加一个默认的状态栏.为了希望在这个默认的状态栏上添加资源图标(资源 ID 为 IDI_ICON1,IDI_ICON2),定义的两个图标资源视图如下:
这个状态栏的添加在框架类的初始化(即 OnCreate 函数)中,而窗格的索引值在框架类的实现文件头出定义,具体代码如下(省略了无关代码):
... // 状态行指示器对应 ID static UINT indicators[] = { ID_SEPARATOR, // 状态行指示器 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ... int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ... if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } /* 以下是我为状态栏添加图标的实现代码 *****************/ //为状态栏指示器添加图标 HICON icon[2]; icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1); icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2); m_wndStatusBar.GetStatusBarCtrl().SetIcon(0,icon[0]); m_wndStatusBar.GetStatusBarCtrl().SetIcon(1,icon[1]); m_wndStatusBar.GetStatusBarCtrl().SetIcon(2,icon[0]); m_wndStatusBar.GetStatusBarCtrl().SetIcon(3,icon[1]); //设置状态栏高度 m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(50); // 设置状态栏指示器属性 m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL ,100); m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL ,100); m_wndStatusBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL ,100); m_wndStatusBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL ,100); return 0; } ....
运行结果: