MFC对话框中的工具栏、状态栏设计小结
對網上的資料結合自己的實踐的總結,由于大部分都是網上先輩們的經驗,這里只是直接將內容拿來,格式優化一下更易讀而已。
對話框中建立工具欄的方法
工具欄中包含了一組用于執行命令的按鈕,每個按鈕都用一個圖標來表示。當單擊某個按鈕時,會產生一個相應的消息,對這個消息的處理就是按鈕的功能實現。將菜單中常用的功能放置在工具欄中,這樣可以方便用戶操作,省去了在級聯菜單中一層層查找菜單項的麻煩。
1、工具欄類CToolBar
在MFC類庫中,CToolBar類封裝了工具欄的基本功能,CToolBar類的主要方法如下:
(1)Create方法:該方法用于創建工具欄窗口。語法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );- 1
參數說明
pParentWnd:標識父窗口
dwStyle:標識工具欄風格。可選值如下:
| CBRS_TOP | 工具欄位于框架窗口的頂部 |
| CBRS_BOTTOM | 工具欄位于框架窗口的底部 |
| CBRS_NOALIGN | 當父窗口重新調整尺寸時不重新定位工具欄 |
| CBRS_TOOLTIPS | 工具欄顯示工具提示 |
| CBRS_SIZE_DYNAMIC | 工具欄是動態的 |
| CBRS_SIZE_FIXED | 工具欄是固定的 |
| CBRS_FLOATING | 工具欄是浮動的 |
| CBRS_FLYBY | 狀態欄顯示按鈕的信息 |
| CBRS_HIDE_INPLACE | 工具欄不顯示 |
nID:標識工具欄ID。
(2)CreateEx方法:該方法與Create方法類似,用于創建工具欄窗口,只是該方法支持擴展風格。語法如下:
BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);- 1
參數說明
pParentWnd:標識父窗口。
dwCtrlStyle:標識工具欄擴展風格。
dwStyle:標識工具欄風格。
rcBorders:標識工具欄邊框的寬度。
nID:標識工具欄ID。
(3)SetSizes方法:該方法用于設置按鈕和位圖的大小。語法如下:
void SetSizes( SIZE sizeButton, SIZE sizeImage );- 1
參數說明
sizeButton:標識按鈕的大小。
sizeImage:標識位圖的大小。
(4)SetHeight方法:該方法用于設置工具欄的高度。語法如下:
void SetHeight( int cyHeight );- 1
參數說明
cyHeight:以像素為單位標識工具欄的高度。
(5)LoadToolBar方法:該方法用于加載工具欄資源。語法如下:
BOOL LoadToolBar( LPCTSTR lpszResourceName );- 1
- 1
參數說明
lpszResourceName:標識資源名稱。
nIDResource:標識資源ID。
返回值:如果函數執行成功,返回值是非零,否則為零。
(6)LoadBitmap方法:該方法用于加載一個位圖資源,位圖中包含了每個工具欄按鈕的圖像。語法如下:
BOOL LoadBitmap( LPCTSTR lpszResourceName );- 1
- 1
參數說明
lpszResourceName:標識資源名稱。
nIDResource:標識資源ID。
返回值:執行成功,返回值是非零,否則為零。
(7)SetBitmap方法:該方法用于設置工具欄按鈕位圖。語法如下:
BOOL SetBitmap( HBITMAP hbmImageWell );- 1
參數說明
hbmImageWell:工具欄位圖資源按鈕。
(8)SetButtons方法:該方法用于向工具欄中添加按鈕,并設置按鈕的ID和圖像索引。語法如下:
BOOL SetButtons( const UINT* lpIDArray, int nIDCount );- 1
參數說明
lpIDArray:標識一個無符號整型數組,其中包含了按鈕ID,如果數組中的某個元素值為ID_SEPARATOR,對應的按鈕將是一個分隔條。
nIDCount:標識數組中的元素數量。
(9)CommandToIndex方法:該方法根據工具欄按鈕ID返回按鈕索引。語法如下:
int CommandToIndex( UINT nIDFind );- 1
參數說明
nIDFind:標識按鈕ID。
返回值:返回按鈕ID對應的按鈕索引,如果按鈕ID沒有對應的按鈕,返回值為-1。
(10)GetItemID方法:該方法根據按鈕索引返回按鈕ID。語法如下:
UINT GetItemID( int nIndex ) const;- 1
參數說明
nIndex:標識按鈕索引。
返回值:返回按鈕的ID,如果nIndex標識的按鈕是一個分隔條,返回值是ID_SEPARATOR。
(11)GetItemRect方法:該方法根據按鈕索引獲取工具欄按鈕的顯示區域。語法如下:
virtual void GetItemRect( int nIndex, LPRECT lpRect );- 1
參數說明
nIndex:標識按鈕ID。
lpRect:用于接收按鈕區域。
(12)GetButtonStyle方法:該方法用于獲得按鈕的風格。語法如下:
UINT GetButtonStyle( int nIndex ) const;- 1
參數如下
nIndex:工具欄中按鈕的索引,最小為0,從左到右依次增大。
(13)SetButtonStyle方法:該方法用于設置某個按鈕的風格。語法如下:
void SetButtonStyle( int nIndex, UINT nStyle );- 1
參數說明
nIndex:標識按鈕索引。
nStyle:標識按鈕風格。可選值如下。
TBBS_BUTTON:標準按鈕。
TBBS_SEPARATOR:分隔線。
TBBS_CHECKBOX:復選風格。
TBBS_GROUP:按鈕組。
TBBS_CHECKGROUP:復選按鈕組。
(14)GetButtonInfo方法:該方法用于獲取按鈕信息。語法如下:
void GetButtonInfo( int nIndex, UINT& nID, UINT& nStyle, int& iImage ) const;- 1
參數說明
nIndex:標識按鈕索引。
nID:用于接收返回的按鈕ID。
nStyle:接收按鈕風格。
iImage:用于接收按鈕的圖像索引。
(15)SetButtonInfo方法:該方法用于設置按鈕的信息。語法如下:
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );- 1
參數說明
nIndex:要設置信息的按鈕索引。
nID:要設置按鈕的ID。
nStyle:要設置按鈕的風格。
iImage:要設置的位圖資源索引。
(16)GetButtonText方法:該方法用于獲取工具欄按鈕文本。語法如下:
CString GetButtonText( int nIndex ) const;- 1
- 1
參數說明
nIndex:標識按鈕索引。
rString:用于接收按鈕文本。
(17)SetButtonText方法:該方法用于設置按鈕文本。語法如下:
BOOL SetButtonText( int nIndex, LPCTSTR lpszText );- 1
參數說明
nIndex:標識按鈕ID。
lpszText:標識按鈕文本。
(18)GetToolBarCtrl方法:該方法用于訪問底層的工具欄按鈕通用控件。語法如下:
CToolBarCtrl& GetToolBarCtrl( ) const;- 1
2、工具欄資源設計
在開發文檔視圖結構的應用程序時,系統會自動創建工具欄。但是如果開發基于對話框的應用程序,就需要用戶自己創建工具欄了。在創建基于對話框的應用程序時,默認情況下,是不會創建工具欄資源的。如果用戶想要設計工具欄,可以通過工作區的ResourceView來創建工具欄資源。
(1)在工作區的ResourceView中鼠標右鍵單擊某個節點,在彈出的快捷菜單中選擇“Insert”菜單項,打開“Insert Resource”對話框
(2)選擇“Toolbar”選項,單擊“New”按鈕創建工具欄資源
(3)在工具欄資源中繪制工具欄按鈕。當用戶在按鈕上繪制圖像后,工具欄窗口會自動創建一個新的工具欄按鈕
說明:如果要為工具欄按鈕添加分隔線,可以選中要加入分隔線位置的按鈕,將這個按鈕向右拖動一點距離,就會在兩個按鈕之間留下一點空隙,運行程序后,這點空隙就會顯示成分隔線了。
(4)如果用戶想要刪除工具欄資源中的某個按鈕,可以先選中該按鈕,然后按住鼠標左鍵,將其拖出工具欄。
(5)在設計完工具欄按鈕后,需要為工具欄按鈕設置命令ID,如果不指定ID,系統會為每個工具欄按鈕設置一個默認的ID。雙擊工具欄按鈕或者選中工具欄按鈕后按Enter鍵打開“Toolbar Button Properties”窗口,通過“Toolbar Button Properties”窗口可以設置工具欄按鈕命令ID、大小和提示
說明:如果為一個工具欄按鈕設置了大小,那么所有的工具欄按鈕的大小都會改變為當前設置的大小。
3、工具欄的命令處理
同菜單一樣,每一個工具欄按鈕都有一個命令ID,通過命令ID,可以編寫命令消息處理函數。當單擊工具欄按鈕時,會執行消息處理函數。下面介紹如何編寫消息處理函數。
(1)打開類向導,選擇“Message Maps”選項卡,在“Class name”列表框選擇創建了工具欄的對話框類,在“Object Ids”列表中選擇工具欄按鈕ID,在“Messages”列表中選擇“COMMAND”項
(2)單擊“Add Function…”按鈕,彈出“Add Member Function”對話框,并給出默認時的命令處理函數名
(3)單擊“OK”按鈕,就添加了工具欄按鈕的命令處理函數。
4、動態創建工具欄
工具欄的創建大體有3種方法。
- 第1種方法是先設計一個位圖,其中包含了工具欄中的所有按鈕圖像,每個按鈕圖像具有相同的大小,然后調用LoadBitmap方法加載位圖,最后調用SetButtons方法添加按鈕,設置按鈕ID和圖像索引;
- 第2種方法是定義一個圖像列表CImageList對象,向該對象中添加圖像,然后將圖像列表關聯到工具欄中;
- 第3種方法是創建一個工具欄資源,然后調用LoadToolBar方法加載工具欄資源。下面分別介紹這3種方法的應用。
1.第1種方法
(1)創建一個基于對話框的應用程序。
(2)向對話框中添加一個按鈕控件,并向工程中導入一個位圖。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,代碼如下:
CToolBar m_ToolBar;- 1
(4)處理“創建”按鈕的單擊事件,加載位圖,創建工具欄,代碼如下:
void CDynamicTool1Dlg::OnButton1() {UINT array[11];for(int i=0;i<10;i++){if(i= =3 || i= =7)array[i] = ID_SEPARATOR; //第4、第8個按鈕為分隔條elsearray[i] = i+1001;}m_ToolBar.Create(this);m_ToolBar.SetButtons(array,11);m_ToolBar.LoadBitmap(IDB_BITMAP1); //加載位圖m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //設置按鈕和按鈕位圖大小RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //顯示工具欄 }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.第2種方法
(1)創建一個基于對話框應用程序。
(2)向對話框中添加一個按鈕控件,并向工程中導入9個圖標。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar和一個圖像列表對象m_ImageList,代碼如下:
CToolBar m_ToolBar;CImageList m_ImageList;- 1
- 2
- 3
(4)處理“創建”按鈕的單擊事件,加載圖標,關聯圖像列表,創建工具欄,代碼如下:
void CDynamicTool2Dlg::OnButton1() {//創建圖像列表m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//向圖像列表中添加圖標m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON7));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON8));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON9));UINT array[11];for(int i=0;i<10;i++){if(i= =3 || i= =7)array[i] = ID_SEPARATOR; //第4、第8個按鈕為分隔條elsearray[i] = i+1001;}m_ToolBar.Create(this);m_ToolBar.SetButtons(array,11);//關聯圖像列表m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //設置按鈕和圖標的大小RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
3.第3種方法
(1)創建一個基于對話框的應用程序。
(2)向對話框中添加一個按鈕控件,并創建一個工具欄資源。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,代碼如下:
CToolBar m_ToolBar;- 1
(4)處理“創建”按鈕的單擊事件,創建工具欄,加載工具欄資源,代碼如下:
void CDynamicTool3Dlg::OnButton1() {//創建工具欄m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP );m_ToolBar.LoadToolBar(IDR_TOOLBAR1); //加載工具欄資源//設置圖像和按鈕的大小m_ToolBar.GetToolBarCtrl().SetBitmapSize(CSize(16,16));m_ToolBar.GetToolBarCtrl().SetButtonSize(CSize(22,22));RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
5、工具欄按鈕的熱點效果
將工具欄設置成具有熱點效果可以美化程序界面。
實現步驟如下。
(1)創建一個基于對話框的應用程序。
(2)向對話框中添加一個按鈕控件,并向程序中導入16個圖標。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar和兩個圖像列表對象m_ImageList、m_HotImageList,代碼如下:
CToolBar m_ToolBar;CImageList m_ImageList;CImageList m_HotImageList;- 1
- 2
- 3
- 4
- 5
其中,m_ImageList是工具欄按鈕的圖像列表對象,m_HotImageList是工具欄按鈕的熱點圖像列表對象。
(4)在OnInitDialog函數中加載圖標,關聯圖像列表,創建工具欄,代碼如下:
BOOL CHotToolDlg::OnInitDialog() {//……// TODO: Add extra initialization herem_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1); //創建圖像列表m_HotImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1); //創建熱點圖像列表//向圖像列表中添加圖標m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON7));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON8));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON9));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON10));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON11));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON12));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON13));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON14));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON15));m_HotImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON16));UINT array[10];for(int i=0;i<9;i++){if(i= =3 || i= =7)array[i] = ID_SEPARATOR; //第4、第8個按鈕為分隔條elsearray[i] = i+1001;}m_ToolBar.CreateEx(this,TBSTYLE_FLAT); //創建工具欄窗口m_ToolBar.SetButtons(array,10);m_ToolBar.SetButtonText(0,"新建");m_ToolBar.SetButtonText(1,"打開");m_ToolBar.SetButtonText(2,"保存");m_ToolBar.SetButtonText(4,"剪切");m_ToolBar.SetButtonText(5,"復制");m_ToolBar.SetButtonText(6,"粘貼");m_ToolBar.SetButtonText(8,"打印");m_ToolBar.SetButtonText(9,"幫助");//關聯圖像列表m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);//關聯熱點圖像列表m_ToolBar.GetToolBarCtrl().SetHotImageList(&m_HotImageList);m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //設置按鈕和圖標的大小RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //顯示工具欄return TRUE; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
在創建具有熱點效果的工具欄時,需要使用CreateEx創建工具欄窗口,只有創建的工具欄窗口具有TBSTYLE_FLAT屬性時,工具欄按鈕才具有熱點效果。然后要使用工具欄控制類的SetHotImageList方法關聯熱點圖像列表。
6、具有提示功能的工具欄
系統中的工具欄是沒有文本顯示的,為了使用戶能清楚地知道每個工具欄按鈕的用途,除了形象的圖像外,還應該具有提示功能,下面就來看一下工具欄的提示功能是如何實現的。
(1)創建一個基于對話框的應用程序。
(2)向對話框中添加一個按鈕控件,并向工程中導入一個位圖。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,并聲明一個CString的變量str來保存工具欄按鈕文本,代碼如下:
CToolBar m_ToolBar;CString str;- 1
- 2
- 3
(4)在OnInitDialog函數中加載位圖,創建工具欄,代碼如下:
BOOL CToolTipDlg::OnInitDialog() {……UINT array[10];for(int i=0;i<10;i++){if(i= =3 || i= =7)array[i] = ID_SEPARATOR; //第4、第8個按鈕為分隔條elsearray[i] = i+1001;}m_ToolBar.Create(this);m_ToolBar.SetButtons(array,10);m_ToolBar.SetButtonText(0,"新建");m_ToolBar.SetButtonText(1,"打開");m_ToolBar.SetButtonText(2,"保存");m_ToolBar.SetButtonText(4,"剪切");m_ToolBar.SetButtonText(5,"復制");m_ToolBar.SetButtonText(6,"粘貼");m_ToolBar.SetButtonText(8,"打印");m_ToolBar.SetButtonText(9,"幫助");m_ToolBar.LoadBitmap(IDB_BITMAP1); //加載位圖m_ToolBar.SetSizes(CSize(36,36),CSize(16,16)); //設置按鈕和按鈕位圖大小m_ToolBar.EnableToolTips(TRUE);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //顯示工具欄return TRUE;}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
EnableToolTips方法用于激活工具欄的提示功能。
(5)在主窗口的消息映射部分添加ON_NOTIFY_EX映射宏,代碼如下:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)- 1
(6)在主窗口的頭文件中添加對OnToolTipNotify函數的聲明,代碼如下:
afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );- 1
(7)添加消息處理函數OnToolTipNotify的實現部分,代碼如下:
BOOL CToolTipDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //獲取工具欄按鈕IDif(nID){nID = m_ToolBar.CommandToIndex(nID); //根據ID獲取按鈕索引if(nID != -1){m_ToolBar.GetButtonText(nID,str); //獲取工具欄文本pTTT->lpszText = str.GetBuffer(str.GetLength()); //設置提示信息文本pTTT->hinst = AfxGetResourceHandle();return(TRUE);}}return(FALSE); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
OnToolTipNotify是處理TTN_NEEDTEXT消息的函數,其中參數id是發送消息的控件ID;參數pNMHDR是一個NMHDR結構指針,該結構記錄了發送消息的控件ID、句柄等信息;參數pResult表示結果代碼指針,TTN_NEEDTEXT消息可以忽略該參數。
7、帶下拉按鈕的工具欄
在工具欄按鈕的旁邊添加一個呈倒三角形的下拉按鈕可以擴展工具欄按鈕的選擇功能。下拉按鈕在按下后會彈出一個下拉菜單,下拉菜單中的選項就是對按鈕增強的功能。下面來介紹一下如何為工具欄添加下拉按鈕。
(1)創建一個基于單文檔的應用程序。
(2)新建一個菜單資源。
(3)修改工具欄資源,為工具欄添加一個修改字體按鈕。
(4)在框架頭文件中修改工具欄風格,使“A”按鈕具有下拉按鈕,代碼如下:
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("Failed to create toolbarn");return -1;}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status barn");return -1;}m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);DWORD dwStyle=m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FONT));dwStyle|=TBSTYLE_DROPDOWN;m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FONT),dwStyle);return 0; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
SetExtendedStyle是CToolBarCtrl類的方法,該方法用于設置工具欄控件的擴展風格,語法如下:
DWORD SetExtendedStyle( DWORD dwExStyle ) const;- 1
參數說明
dwExStyle:系統定義的工具欄控件風格,取值TBSTYLE_EX_DRAWDDARROWS,可以為某一個按鈕添加下拉按鈕。
(5)在框架源文件消息映射宏中添加如下代碼:
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)- 1
(6)在框架的頭文件中添加消息響應函數的聲明,代碼如下:
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);- 1
(7)OnToolbarDropDown函數的實現代碼如下:
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr) {CWnd *pWnd;UINT nID;switch (pnmtb->iItem){case ID_FONT:pWnd = &m_wndToolBar;nID = IDR_MENU1;break;default:return;}//加載相應的顯示菜單CMenu menu;menu.LoadMenu(nID);CMenu* pPopup = menu.GetSubMenu(0);ASSERT(pPopup);CRect rc;pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);pWnd->ClientToScreen(&rc);pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,rc.left, rc.bottom, this, &rc); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
CWnd類的ClientToScreen方法用于將客戶坐標轉換成屏幕坐標,TrackPopupMenu方法用于彈出菜單。
(8)在視圖頭文件中聲明一個CFont類型變量Font,并在構造函數中初始化變量Font。重載OnDraw函數,設置視圖中的顯示文本。
(9)通過類向導為新創建的菜單和工具欄按鈕添加消息處理函數,代碼如下:
void CDropToolBarView::OnFont() {OnMenu100();}- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
8、工具欄控制類CToolBarCtrl
CToolBarCtrl類提供了Windows通用工具欄控制功能,是一個矩形子窗口,包含一個或多個按鈕,這些按鈕可以顯示位圖圖像、字符文本或兩者都有。
CToolBarCtrl類的主要方法如下表所示:
CToolBarCtrl類主要方法表
| Create | 創建工具欄并將它與一個CToolBarCtrl類對象連接 |
| IsButtonEnabled | 指示工具欄中的指定按鈕是否有效 |
| IsButtonChecked | 指示工具欄中的指定按鈕是否被選中 |
| IsButtonPressed | 指示工具欄中的指定按鈕是否被按下 |
| IsButtonHidden | 指示工具欄中的指定按鈕是否隱藏 |
| IsButtonIndeterminate | 指示工具欄中的指定按鈕的狀態是否不可用[g1] |
| SetState | 設置工具欄中的指定按鈕的狀態 |
| GetState | 獲取工具欄中的指定按鈕的狀態 |
| GetButton | 獲取工具欄中的指定按鈕 |
| GetButtonCount | 獲取工具欄按鈕的數目 |
| GetItemRect | 獲取工具欄按鈕的邊界矩形 |
| GetRect | 獲取一個指定工具欄按鈕的邊界矩形 |
| SetButtonStructSize | 指定TBBUTTON結構的大小 |
| GetButtonSize | 獲取當前工具欄按鈕的大小 |
| SetButtonSize | 設置當前工具欄按鈕的大小 |
| SetBitmapSize | 設置工具欄按鈕的圖像大小 |
| GetToolTips | 獲取與此工具欄相關聯的工具欄提示的句柄 |
| SetToolTips | 將工具欄提示與工具欄進行關聯 |
| SetOwner | 設置接收工具欄通知消息的按鈕 |
| SetRows | 設置工具欄按鈕的行數 |
| GetRows | 獲取工具欄按鈕的行數 |
| SetCmdID | 設置當按鈕被按下時要發送到主窗口的命令ID |
| GetBitmapFlags | 獲取與工具欄位圖相關聯的標志 |
| GetDisabledImageList | 獲取工具欄用來顯示無效按鈕的圖像列表 |
| GetHotImageList | 獲取工具欄用來顯示熱點按鈕的圖像列表 |
| GetImageList | 獲取工具欄默認時的圖像列表 |
| GetStyle | 獲取工具欄當前的風格 |
| GetMaxTextRows | 獲取工具欄按鈕的顯示文本的最大行數 |
| IsButtonHighlighted | 檢查工具欄按鈕的加亮狀態 |
| SetButtonWidth | 設置工具欄按鈕寬度的最大值和最小值 |
| SetDisabledImageList | 設置工具欄用來顯示無效按鈕的圖像列表 |
| SetHotImageList | 設置工具欄用來顯示熱點按鈕的圖像列表 |
| SetImageList | 設置工具欄默認時的圖像列表 |
| GetDropTarget | 設置工具欄的IDropTarget接口 |
| SetIndent | 設置工具欄中第一個按鈕的縮進 |
| SetMaxTextRows | 設置工具欄按鈕的顯示文本的最大行數 |
| SetStyle | 設置工具欄當前的風格 |
| GetAnchorHighlight | 獲取工具欄的加亮設置 |
| SetAnchorHighlight | 對工具欄進行加亮設置 |
| GetHotItem | 獲取工具欄熱點項索引 |
| SetHotItem | 設置工具欄熱點項索引 |
| GetInsertMark | 獲取工具欄的當前插入標記 |
| SetInsertMark | 設置工具欄的當前插入標記 |
| GetMaxSize | 獲取工具欄可視按鈕和分隔條的總大小 |
| InsertMarkHitTest | 獲取工具欄中指定點的插入信息 |
| GetExtendedStyle | 獲取工具欄的擴展風格 |
| SetExtendedStyle | 設置工具欄的擴展風格 |
| GetInsertMarkColor | 獲取工具欄插入標記的顏色 |
| SetInsertMarkColor | 設置工具欄插入標記的顏色 |
| MapAccelerator | 將一個加速鍵映射到一個工具欄按鈕 |
| MoveButton | 將一個工具欄按鈕從一個索引移動到另一個索引 |
| HitTest | 確定一個點位于工具欄的具體位置 |
| EnableButton | 設置工具欄按鈕是否有效 |
| CheckButton | 是否選中工具欄中的指定按鈕 |
| PressButton | 是否按下工具欄中的指定按鈕 |
| GetButtonInfo | 獲取工具欄指定按鈕的信息 |
| SetButtonInfo | 設置工具欄指定按鈕的信息 |
| SetDrawTextFlags | 設置Win32中DrawText功能標志 |
| HideButton | 隱藏或顯示工具欄中的指定按鈕 |
| Indeterminate | 設置工具欄中指定按鈕是否灰色狀態 |
| AddBitmap | 將位圖圖像添加到工具欄可用的圖像列表中 |
| AddButtons | 將按鈕添加到工具欄中 |
| InsertButton | 在工具欄中插入按鈕 |
| DeleteButton | 從工具欄中刪除按鈕 |
| CommandToIndex | 獲取與指定命令ID相關聯的索引 |
| RestoreState | 恢復工具欄狀態 |
| MarkButton | 設置工具欄的高亮顯示狀態 |
| LoadImages | 將位圖裝載到工具欄的圖像列表中 |
| SaveState | 保存工具欄狀態 |
| Customize | 顯示CustomizeToolBar對話框 |
| AddString | 將作為資源ID傳遞的一個字符串添加到工具欄的內部字符串列表中 |
| AddStrings | 將多個字符串添加到工具欄的內部字符串列表中 |
| AutoSize | 調整工具欄的大小 |
下面使用CToolBarCtrl類創建一個工具欄。
步驟如下。
(1)創建一個基于對話框的應用程序。
(2)向對話框中添加一個按鈕控件,并向工程中導入8個圖標。
(3)在主窗口頭文件中聲明一個CToolBarCtrl類對象m_ToolBar和一個圖像列表對象m_ImageList,代碼如下:
CToolBarCtrl m_ToolBar;CImageList m_ImageList;- 1
- 2
- 3
(4)在工作區窗口中選擇ResourceView,展開String Table節點,雙擊abc String Table節點,打開字符串編輯器,在字符串編輯器中設置工具欄按鈕的顯示文本。
(5)在OnInitDialog函數中加載圖標,關聯圖像列表,創建工具欄,代碼如下:
BOOL CToolCtrlDlg::OnInitDialog() {……TBBUTTON button[10];CString string;TCHAR * pString;int num;//創建一個圖像列表m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);//向圖像列表中添加圖標m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON7));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON8));m_ToolBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1100);m_ToolBar.SetImageList(&m_ImageList);for(int i=0;i<10;i++){button[i].dwData = 0;button[i].fsState = TBSTATE_ENABLED;if(i= =3 ||i= =7)button[i].fsStyle = TBSTYLE_SEP;elsebutton[i].fsStyle = TBSTYLE_BUTTON;button[i].iBitmap = i;string.LoadString(i + IDS_STRING1);//裝載字符串資源//為每一個字符串再加一個'',用于向工具欄里加字符串num = string.GetLength() + 1;pString = string.GetBufferSetLength(num);//返回剛加的字符串的編號button[i].iString = m_ToolBar.AddStrings(pString);string.ReleaseBuffer();}m_ToolBar.AddButtons(10,button);m_ToolBar.AutoSize();m_ToolBar.SetStyle(TBSTYLE_FLAT|CCS_TOP);return TRUE; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
對話框中建立狀態欄的方法
狀態欄(CStatusBar 類的一個窗口對象)包含幾個“窗格”。每個窗格都是狀態欄中可用來顯示信息的矩形區域。
例如,很多應用程序在最右邊的窗格顯示CAPSLOCK、NUMLOCK和其他鍵的狀態。
應用程序還經常在最左邊的窗格(窗格0)顯示信息文本,此窗格有時稱為“消息窗格”。 例如,默認 MFC
狀態欄使用消息窗格顯示一個字符串,來解釋當前選定的菜單項或工具欄按鈕。
新建窗格
To create a status bar, follow these steps:
1.Construct the CStatusBar object.
2.Call the Create (or CreateEx) function to create the status-bar window and attach it to the CStatusBar object.
3.Call SetIndicators to associate a string ID with each indicator.
方法一:
首先要在類成員中添加變量聲明:
CStatusBar m_Statusbar;- 1
接下來進行狀態欄的創建和顯示,在OnInitDialog()中:
//獲得系統當前時間 CTime time; time=time.GetCurrentTime(); CString stime; stime.Format("%s",time.Format("%y-%m-%d %H:%M:%S")); //創建狀態欄 UINT array[2]={12301,12302}; //注:這里是ID號,應保證不與resource.h中的其他ID號重復 m_Statusbar.Create(this); m_Statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT));//顯示狀態欄 CRect rect; GetWindowRect(rect); m_Statusbar.SetPaneInfo(0,array[0],0,rect.Width()/3); m_Statusbar.SetPaneInfo(1,array[1],0,rect.Width()/3*2); m_Statusbar.SetPaneText(0,stime); m_Statusbar.SetPaneText(1,"小鬼當家博客:blog.sina.com.cn/u/1628556937"); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
效果圖如下圖所示:
【注】
上述的
- 1
也可以使用一下方法寫成更明確的方式:
/* 1.定義窗格的命令 ID。 在“視圖”菜單上單擊“資源視圖”。右擊項目資源并單擊“資源符號”。在“資源符號”對話框中,單擊“新建”。 鍵入一個命令 ID 名稱:例如,ID_INDICATOR_PAGE。為 ID 指定值,或接受“資源符號”對話框建議的值。 例如,對于 ID_INDICATOR_PAGE,接受默認值。關閉“資源符號”對話框。 2.定義窗格中要顯示的默認字符串。 打開“資源視圖”后,在為應用程序列出資源類型的窗口中雙擊“String Table”。 打開“字符串表”編輯器后,從“插入”菜單中選擇“新建字符串”。 在“字符串屬性”窗口中,選擇窗格的命令 ID(例如:ID_INDICATOR_PAGE)并鍵入默認字符串值, 如“Page ”。關閉字符串編輯器。(需要一個默認字符串以避免編譯器錯誤。) 3.在文件 MAINFRM.CPP 中定位 indicators 數組。 該數組按從左向右的順序為狀態欄的所有指示器列出了命令 ID。 在數組中的適當位置,輸入窗格的命令 ID。 */static UINT BASED_CODE indicators[] = { ID_SEPARATOR, //分隔符(系統自帶,可不寫) ID_INDICATOR_CAPS, //大小寫指示符(系統自帶,可不寫)ID_INDICATOR_NUM, //NumLoak指示符(系統自帶,可不寫)ID_INDICATOR_SCRL, //Scroll指示符(系統自帶,可不寫)ID_INDICATOR_PAGE, //用戶自定義 };- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
方法二:
在對話框窗口的OnInitDialog()過程寫上以下代碼即可:
//設置狀態欄HWND hDlg=GetSafeHwnd();HWND hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER,TEXT("就緒"),//顯示在狀態欄上的信息hDlg, //父窗口句柄IDS_STATUS); //預定義的資源ID,相當于狀態欄的ID號:GetDlgItem(IDS_STATUS)int pint[4]={100,200,350,-1};//狀態欄第一個方格右邊界離窗口客戶區左邊界的距離為100//第二個方格右邊界離窗口客戶區左邊界的距離為200//...以此類推//-1表示該方格的右邊界為為窗口客戶區的右邊界::SendMessage(hStatusWindow,SB_SETPARTS,4,(LPARAM)pint);::SendMessage(hStatusWindow,SB_SETTEXT,1,(LPARAM)TEXT("信息1"));::SendMessage(hStatusWindow,SB_SETTEXT,2,(LPARAM)TEXT("信息2"));::SendMessage(hStatusWindow,SB_SETTEXT,3,(LPARAM)TEXT("信息3"));- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
效果截圖如下:
預定義資源ID截圖,在【資源視圖】里面的String Table進行添加即可:
參考資料
MFC工具欄設計
MFC基于對話框中添加狀態欄
MFC狀態欄創建和設計
給MFC對話框設置狀態欄
總結
以上是生活随笔為你收集整理的MFC对话框中的工具栏、状态栏设计小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为鸿蒙热水器,美的华为跨界联合!搭载鸿
- 下一篇: php4 apache 配置,[开发环境