原文:http://blog.csdn.net/touzani/archive/2007/05/18/1614244.aspx
工具條/欄(tool bar)和狀態條/欄(status bar)是構建友好GUI程序的通用標準,但它們並不是Windows API 的標準部件,而是由應用程序框架(MFC)增加 的一類控件。
CObject → CCmdTarget → CWnd → CControlBar → CToolBar / CStatusBar
BUTTON ID_FILE_NEW
BUTTON ID_FILE_OPEN
BUTTON ID_FILE_SAVE
BUTTON ID_EDIT_CUT
BUTTON ID_EDIT_COPY
BUTTON ID_EDIT_PASTE
BUTTON ID_FILE_PRINT
BUTTON ID_APP_ABOUT
l 在VC項目工作區的資源視圖頁中展開 “Student/Student.rc”中的“Toolbar”資源列表,雙擊IDR_MAINFRAME打開工具欄編輯器(見下圖)
l 選擇當前按鈕:單擊位於VS窗口中部的 工具條編輯窗口上部工具條欄中的所需按鈕;
l 修改位圖:對當前按鈕,可以利用“圖 像”菜單、圖像編輯器工具條和(位於屬性窗口上部的)顏色窗口,在中部的圖像編輯器窗口中繪製和修改當前按鈕的位圖;
l 修改屬性:在屬性窗口中可以
n 選擇該按鈕所對應的(菜單項)ID
n 修改該按鈕位圖的寬和高
n 鍵入/修改該按鈕所對應的提示文本 (/n後的爲按鈕的浮動提示文本)
l 刪除按鈕:將按鈕拖離工具條即可
l 添加按鈕:
n 將工具條最右邊的空白按鈕拖到你想加入 按鈕的位置
n 用“圖像”菜單、圖像編輯器工具條和顏 色窗口來繪製按鈕的位圖(在空白按鈕上繪圖後,VS會自動在其右邊添加一個新的空白按鈕)
n 在屬性窗口中選擇該按鈕所對應的(菜單 項)ID
n 還可以修改該按鈕位圖的寬和高、鍵入/ 修改該按鈕所對應的提示文本
l 分組:左/右拖動按鈕半個按鈕寬度,可 將其
n 與右邊/左邊的按鈕分開成不同的組
n 與左邊/右邊的按鈕合併成同一個組
① 在使用應用程序嚮導創建程序時,在“MFC 應用程序嚮導”對話框的“用戶界面功能”頁的“工具欄”選項中,沒有選“標準停靠”單選鈕,則需要自己加入工具條;
② 或者原有的工具條不夠用,需要加入第2個工具 條;
③ 或者在程序運行當中需要在多個工具條中切換;
l 在項目工作區的“資源視圖”頁中的 Toolbar資源表項上單擊鼠標右鍵,在彈出的浮動菜單中選“插入Toolbar”菜單項,VS會自動創建一個ID爲IDR_TOOLBAR1的空工具 條
l 可在該工具條中加入若干圖形按鈕(如 Z、L、W)
l 在屬性窗口中修改工具條的ID(如 IDR_MYTB),選擇按鈕對應的ID(如ID_NAME_ZS、ID_NAME_LS、ID_NAME_WW)
l 創建新工具條資源
l 打開頭文件MainFrm.h,在 CMainFrame類中加入工具條類CToolBar的對象m_ToolBar作爲公共數據成員:(缺省的工具條對象爲CToolBar m_wndToolBar; )
l 在CMainFrame類中 WM_CREATE消息響應函數OnCreate(若無該函數則創建它)中的return 0;語句之前加入下列代碼:
CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |
if (!m_ToolBar.Create(this)) {// 創建工具條
return -1; // 創建失敗
if (!m_ToolBar.LoadToolBar(IDR_MYTB)) { // 裝入工具條
return -1; // 裝入失敗
m_ToolBar.SetBarStyle(m_ToolBar.GetBarStyle() | CBRS_GRIPPER | CBRS_TOOLTIPS |
② 在框架窗口中加入多個工具條:
l 創建新工具條資源
l 打開頭文件MainFrm.h,在 CMainFrame類中加入工具條類CToolBar的對象m_ToolBar作爲公共數據成員:
l 在原有的OnCreate函數內加入似 ①的創建與裝入工具條的代碼,但要注意代碼的順序,且不需重複語句EnableDocking(CBRS_ALIGN_ANY); 參見下面代碼的紅色部分(其餘部分爲自動生成的缺省代碼):
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) ||
return -1; // 未能創建
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
return -1; // 未能創建
if (!m_wndStatusBar.Create(this) ||
return -1; // 未能創建
// TODO: 如果不需要工具欄可停靠,則刪除這三行
return 0;
③ 顯示/隱藏/切換工具條:
l 似②創建若干工具條資源
l 在OnCreate函數內加入相應代 碼,來創建與裝入工具條
l 在這些代碼後面,加上隱藏暫不顯示的工 具條的代碼,如
ShowControlBar(&m_ToolBar, FALSE, FALSE);
void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
l 在菜單資源中添加顯示/隱 藏/ 切換工具條的菜單項(如“視圖/切換工具欄”ID_CHANGE_TOOL_BAR),在某一窗口派生類(如視圖類 CStudentView)中創建該菜單項的消息響應函數(如OnChangeToolBar),在該函數中隱藏/顯示/切換工具條,例如:
CMainFrame *pFrmWnd = (CMainFrame*)GetTopLevelFrame();
pFrmWnd->ShowControlBar(&pFrmWnd->m_wndToolBar, FALSE, FALSE);
pFrmWnd->ShowControlBar(&pFrmWnd->m_ToolBar, TRUE, FALSE);
pFrmWnd->ShowControlBar(&pFrmWnd->m_ToolBar, FALSE, FALSE);
pFrmWnd->ShowControlBar(&pFrmWnd->m_wndToolBar, TRUE, FALSE);
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );
l 可在CStudenView類中設置一 個整數型數據成員m_iAddNum (int m_iAddNum;)
l 在類的構造函數中將該變量初始化爲0 (m_iAddNum = 0;)
l 在消息響應函數OnAdd中,將該變量 加一 (m_iAddNum++;)
l 在消息響應函數OnDel中,將該變量 減一 (m_iAddNum--;)
l 在“刪除”菜單項的UI更新響應函數 OnUpdateDel中,根據m_iAddNum的值設置“刪除”按鈕(和菜單項)的禁止與激活狀態:
l 在“添加”菜單項的UI更新響應函數 OnUpdateAdd中,根據m_iAddNum的值設置“添加”按鈕(和菜單項)的禁止與激活狀態:
l 可在CStudenView類中設置一 個布爾型數據成員zs (bool zs;)
l 在類的構造函數中將該變量初始化爲假 (zs = false;)
l 在消息響應函數OnNameZs中,切 換該變量的真假 (zs = !zs;)
l 在Z按鈕(ID_NAME_ZS)UI 更新響應函數OnUpdateNameZs中,根據zs的值來設置按鈕是否按下:
缺省狀態條在CMainFrame類中對應於保護型數據成員 CStatusBar m_wndStatusBar; 在MainFrm.cpp 文件的前面部分中有數組:
m_wndStatusBar.SetPaneText(0, L"Message line for first pane");
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );
l 將CMainFrame類中的保護數據 成員m_wndStatusBar改爲公共的
l 在頭文件MainFrm.h中加入窗格 ID的枚舉變量。如
enum SBID {prompt, xName, xVal, yName, yVal};
l 去掉原indicators數組中的三 個狀態指示窗格的ID,加入若干(n個)消息行窗格ID (ID_SEPARATOR),其中第1個(nIndex = 0)用於顯示提示信息,其餘的(n個)用作應用程序的數據顯示。如
ID_SEPARATOR, // 提示 nIndex = 0
ID_SEPARATOR, // "x:" nIndex = 1
ID_SEPARATOR, // "y:" nIndex = 3
l 在創建狀態條的代碼後(如在 CMainFrame::OnCreate函數的尾部),用狀態條的成員函數SetPaneInfo來設置每個窗格的ID、風格和寬度(單位似對話框,爲 1/4英文字母),其函數原型爲
void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );
n SBPS_NOBORDERS 窗格周圍無三維邊框
n SBPS_POPOUT 窗格突出顯示
n SBPS_DISABLED 不畫文本
n SBPS_STRETCH 伸縮窗格以填滿空間(每個狀態條中只能有一個窗格可以被設置成伸縮的)
n SBPS_NORMAL 不伸縮、無邊框、不凸顯
l 在應用程序中用函數 SetPaneText動態修改窗格中的文本串。如
CMainFrame *pFrmWnd = (CMainFrame*)GetTopLevelFrame();
_itow_s(point.x, buf, 20, 10);
pFrmWnd->m_wndStatusBar.SetPaneText(pFrmWnd->xVal, buf);
_itow_s(point.y, buf, 20, 10);
pFrmWnd->m_wndStatusBar.SetPaneText(pFrmWnd->yVal, buf);
CView::OnMouseMove(nFlags, point);