目錄
(本章節中例子都是用 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; } ....
運行結果: