MFC对话框中的工具栏、状态栏设计小结
對網(wǎng)上的資料結(jié)合自己的實踐的總結(jié),由于大部分都是網(wǎng)上先輩們的經(jīng)驗,這里只是直接將內(nèi)容拿來,格式優(yōu)化一下更易讀而已。
對話框中建立工具欄的方法
工具欄中包含了一組用于執(zhí)行命令的按鈕,每個按鈕都用一個圖標(biāo)來表示。當(dāng)單擊某個按鈕時,會產(chǎn)生一個相應(yīng)的消息,對這個消息的處理就是按鈕的功能實現(xiàn)。將菜單中常用的功能放置在工具欄中,這樣可以方便用戶操作,省去了在級聯(lián)菜單中一層層查找菜單項的麻煩。
1、工具欄類CToolBar
在MFC類庫中,CToolBar類封裝了工具欄的基本功能,CToolBar類的主要方法如下:
(1)Create方法:該方法用于創(chuàng)建工具欄窗口。語法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );- 1
參數(shù)說明
pParentWnd:標(biāo)識父窗口
dwStyle:標(biāo)識工具欄風(fēng)格。可選值如下:
| CBRS_TOP | 工具欄位于框架窗口的頂部 |
| CBRS_BOTTOM | 工具欄位于框架窗口的底部 |
| CBRS_NOALIGN | 當(dāng)父窗口重新調(diào)整尺寸時不重新定位工具欄 |
| CBRS_TOOLTIPS | 工具欄顯示工具提示 |
| CBRS_SIZE_DYNAMIC | 工具欄是動態(tài)的 |
| CBRS_SIZE_FIXED | 工具欄是固定的 |
| CBRS_FLOATING | 工具欄是浮動的 |
| CBRS_FLYBY | 狀態(tài)欄顯示按鈕的信息 |
| CBRS_HIDE_INPLACE | 工具欄不顯示 |
nID:標(biāo)識工具欄ID。
(2)CreateEx方法:該方法與Create方法類似,用于創(chuàng)建工具欄窗口,只是該方法支持?jǐn)U展風(fēng)格。語法如下:
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
參數(shù)說明
pParentWnd:標(biāo)識父窗口。
dwCtrlStyle:標(biāo)識工具欄擴展風(fēng)格。
dwStyle:標(biāo)識工具欄風(fēng)格。
rcBorders:標(biāo)識工具欄邊框的寬度。
nID:標(biāo)識工具欄ID。
(3)SetSizes方法:該方法用于設(shè)置按鈕和位圖的大小。語法如下:
void SetSizes( SIZE sizeButton, SIZE sizeImage );- 1
參數(shù)說明
sizeButton:標(biāo)識按鈕的大小。
sizeImage:標(biāo)識位圖的大小。
(4)SetHeight方法:該方法用于設(shè)置工具欄的高度。語法如下:
void SetHeight( int cyHeight );- 1
參數(shù)說明
cyHeight:以像素為單位標(biāo)識工具欄的高度。
(5)LoadToolBar方法:該方法用于加載工具欄資源。語法如下:
BOOL LoadToolBar( LPCTSTR lpszResourceName );- 1
- 1
參數(shù)說明
lpszResourceName:標(biāo)識資源名稱。
nIDResource:標(biāo)識資源ID。
返回值:如果函數(shù)執(zhí)行成功,返回值是非零,否則為零。
(6)LoadBitmap方法:該方法用于加載一個位圖資源,位圖中包含了每個工具欄按鈕的圖像。語法如下:
BOOL LoadBitmap( LPCTSTR lpszResourceName );- 1
- 1
參數(shù)說明
lpszResourceName:標(biāo)識資源名稱。
nIDResource:標(biāo)識資源ID。
返回值:執(zhí)行成功,返回值是非零,否則為零。
(7)SetBitmap方法:該方法用于設(shè)置工具欄按鈕位圖。語法如下:
BOOL SetBitmap( HBITMAP hbmImageWell );- 1
參數(shù)說明
hbmImageWell:工具欄位圖資源按鈕。
(8)SetButtons方法:該方法用于向工具欄中添加按鈕,并設(shè)置按鈕的ID和圖像索引。語法如下:
BOOL SetButtons( const UINT* lpIDArray, int nIDCount );- 1
參數(shù)說明
lpIDArray:標(biāo)識一個無符號整型數(shù)組,其中包含了按鈕ID,如果數(shù)組中的某個元素值為ID_SEPARATOR,對應(yīng)的按鈕將是一個分隔條。
nIDCount:標(biāo)識數(shù)組中的元素數(shù)量。
(9)CommandToIndex方法:該方法根據(jù)工具欄按鈕ID返回按鈕索引。語法如下:
int CommandToIndex( UINT nIDFind );- 1
參數(shù)說明
nIDFind:標(biāo)識按鈕ID。
返回值:返回按鈕ID對應(yīng)的按鈕索引,如果按鈕ID沒有對應(yīng)的按鈕,返回值為-1。
(10)GetItemID方法:該方法根據(jù)按鈕索引返回按鈕ID。語法如下:
UINT GetItemID( int nIndex ) const;- 1
參數(shù)說明
nIndex:標(biāo)識按鈕索引。
返回值:返回按鈕的ID,如果nIndex標(biāo)識的按鈕是一個分隔條,返回值是ID_SEPARATOR。
(11)GetItemRect方法:該方法根據(jù)按鈕索引獲取工具欄按鈕的顯示區(qū)域。語法如下:
virtual void GetItemRect( int nIndex, LPRECT lpRect );- 1
參數(shù)說明
nIndex:標(biāo)識按鈕ID。
lpRect:用于接收按鈕區(qū)域。
(12)GetButtonStyle方法:該方法用于獲得按鈕的風(fēng)格。語法如下:
UINT GetButtonStyle( int nIndex ) const;- 1
參數(shù)如下
nIndex:工具欄中按鈕的索引,最小為0,從左到右依次增大。
(13)SetButtonStyle方法:該方法用于設(shè)置某個按鈕的風(fēng)格。語法如下:
void SetButtonStyle( int nIndex, UINT nStyle );- 1
參數(shù)說明
nIndex:標(biāo)識按鈕索引。
nStyle:標(biāo)識按鈕風(fēng)格。可選值如下。
TBBS_BUTTON:標(biāo)準(zhǔn)按鈕。
TBBS_SEPARATOR:分隔線。
TBBS_CHECKBOX:復(fù)選風(fēng)格。
TBBS_GROUP:按鈕組。
TBBS_CHECKGROUP:復(fù)選按鈕組。
(14)GetButtonInfo方法:該方法用于獲取按鈕信息。語法如下:
void GetButtonInfo( int nIndex, UINT& nID, UINT& nStyle, int& iImage ) const;- 1
參數(shù)說明
nIndex:標(biāo)識按鈕索引。
nID:用于接收返回的按鈕ID。
nStyle:接收按鈕風(fēng)格。
iImage:用于接收按鈕的圖像索引。
(15)SetButtonInfo方法:該方法用于設(shè)置按鈕的信息。語法如下:
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );- 1
參數(shù)說明
nIndex:要設(shè)置信息的按鈕索引。
nID:要設(shè)置按鈕的ID。
nStyle:要設(shè)置按鈕的風(fēng)格。
iImage:要設(shè)置的位圖資源索引。
(16)GetButtonText方法:該方法用于獲取工具欄按鈕文本。語法如下:
CString GetButtonText( int nIndex ) const;- 1
- 1
參數(shù)說明
nIndex:標(biāo)識按鈕索引。
rString:用于接收按鈕文本。
(17)SetButtonText方法:該方法用于設(shè)置按鈕文本。語法如下:
BOOL SetButtonText( int nIndex, LPCTSTR lpszText );- 1
參數(shù)說明
nIndex:標(biāo)識按鈕ID。
lpszText:標(biāo)識按鈕文本。
(18)GetToolBarCtrl方法:該方法用于訪問底層的工具欄按鈕通用控件。語法如下:
CToolBarCtrl& GetToolBarCtrl( ) const;- 1
2、工具欄資源設(shè)計
在開發(fā)文檔視圖結(jié)構(gòu)的應(yīng)用程序時,系統(tǒng)會自動創(chuàng)建工具欄。但是如果開發(fā)基于對話框的應(yīng)用程序,就需要用戶自己創(chuàng)建工具欄了。在創(chuàng)建基于對話框的應(yīng)用程序時,默認(rèn)情況下,是不會創(chuàng)建工具欄資源的。如果用戶想要設(shè)計工具欄,可以通過工作區(qū)的ResourceView來創(chuàng)建工具欄資源。
(1)在工作區(qū)的ResourceView中鼠標(biāo)右鍵單擊某個節(jié)點,在彈出的快捷菜單中選擇“Insert”菜單項,打開“Insert Resource”對話框
(2)選擇“Toolbar”選項,單擊“New”按鈕創(chuàng)建工具欄資源
(3)在工具欄資源中繪制工具欄按鈕。當(dāng)用戶在按鈕上繪制圖像后,工具欄窗口會自動創(chuàng)建一個新的工具欄按鈕
說明:如果要為工具欄按鈕添加分隔線,可以選中要加入分隔線位置的按鈕,將這個按鈕向右拖動一點距離,就會在兩個按鈕之間留下一點空隙,運行程序后,這點空隙就會顯示成分隔線了。
(4)如果用戶想要刪除工具欄資源中的某個按鈕,可以先選中該按鈕,然后按住鼠標(biāo)左鍵,將其拖出工具欄。
(5)在設(shè)計完工具欄按鈕后,需要為工具欄按鈕設(shè)置命令I(lǐng)D,如果不指定ID,系統(tǒng)會為每個工具欄按鈕設(shè)置一個默認(rèn)的ID。雙擊工具欄按鈕或者選中工具欄按鈕后按Enter鍵打開“Toolbar Button Properties”窗口,通過“Toolbar Button Properties”窗口可以設(shè)置工具欄按鈕命令I(lǐng)D、大小和提示
說明:如果為一個工具欄按鈕設(shè)置了大小,那么所有的工具欄按鈕的大小都會改變?yōu)楫?dāng)前設(shè)置的大小。
3、工具欄的命令處理
同菜單一樣,每一個工具欄按鈕都有一個命令I(lǐng)D,通過命令I(lǐng)D,可以編寫命令消息處理函數(shù)。當(dāng)單擊工具欄按鈕時,會執(zhí)行消息處理函數(shù)。下面介紹如何編寫消息處理函數(shù)。
(1)打開類向?qū)?#xff0c;選擇“Message Maps”選項卡,在“Class name”列表框選擇創(chuàng)建了工具欄的對話框類,在“Object Ids”列表中選擇工具欄按鈕ID,在“Messages”列表中選擇“COMMAND”項
(2)單擊“Add Function…”按鈕,彈出“Add Member Function”對話框,并給出默認(rèn)時的命令處理函數(shù)名
(3)單擊“OK”按鈕,就添加了工具欄按鈕的命令處理函數(shù)。
4、動態(tài)創(chuàng)建工具欄
工具欄的創(chuàng)建大體有3種方法。
- 第1種方法是先設(shè)計一個位圖,其中包含了工具欄中的所有按鈕圖像,每個按鈕圖像具有相同的大小,然后調(diào)用LoadBitmap方法加載位圖,最后調(diào)用SetButtons方法添加按鈕,設(shè)置按鈕ID和圖像索引;
- 第2種方法是定義一個圖像列表CImageList對象,向該對象中添加圖像,然后將圖像列表關(guān)聯(lián)到工具欄中;
- 第3種方法是創(chuàng)建一個工具欄資源,然后調(diào)用LoadToolBar方法加載工具欄資源。下面分別介紹這3種方法的應(yīng)用。
1.第1種方法
(1)創(chuàng)建一個基于對話框的應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并向工程中導(dǎo)入一個位圖。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,代碼如下:
CToolBar m_ToolBar;- 1
(4)處理“創(chuàng)建”按鈕的單擊事件,加載位圖,創(chuàng)建工具欄,代碼如下:
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)); //設(shè)置按鈕和按鈕位圖大小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)創(chuàng)建一個基于對話框應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并向工程中導(dǎo)入9個圖標(biāo)。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar和一個圖像列表對象m_ImageList,代碼如下:
CToolBar m_ToolBar;CImageList m_ImageList;- 1
- 2
- 3
(4)處理“創(chuàng)建”按鈕的單擊事件,加載圖標(biāo),關(guān)聯(lián)圖像列表,創(chuàng)建工具欄,代碼如下:
void CDynamicTool2Dlg::OnButton1() {//創(chuàng)建圖像列表m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//向圖像列表中添加圖標(biāo)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);//關(guān)聯(lián)圖像列表m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //設(shè)置按鈕和圖標(biāo)的大小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)創(chuàng)建一個基于對話框的應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并創(chuàng)建一個工具欄資源。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,代碼如下:
CToolBar m_ToolBar;- 1
(4)處理“創(chuàng)建”按鈕的單擊事件,創(chuàng)建工具欄,加載工具欄資源,代碼如下:
void CDynamicTool3Dlg::OnButton1() {//創(chuàng)建工具欄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); //加載工具欄資源//設(shè)置圖像和按鈕的大小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、工具欄按鈕的熱點效果
將工具欄設(shè)置成具有熱點效果可以美化程序界面。
實現(xiàn)步驟如下。
(1)創(chuàng)建一個基于對話框的應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并向程序中導(dǎo)入16個圖標(biāo)。
(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函數(shù)中加載圖標(biāo),關(guān)聯(lián)圖像列表,創(chuàng)建工具欄,代碼如下:
BOOL CHotToolDlg::OnInitDialog() {//……// TODO: Add extra initialization herem_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1); //創(chuàng)建圖像列表m_HotImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1); //創(chuàng)建熱點圖像列表//向圖像列表中添加圖標(biāo)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); //創(chuàng)建工具欄窗口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,"復(fù)制");m_ToolBar.SetButtonText(6,"粘貼");m_ToolBar.SetButtonText(8,"打印");m_ToolBar.SetButtonText(9,"幫助");//關(guān)聯(lián)圖像列表m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);//關(guān)聯(lián)熱點圖像列表m_ToolBar.GetToolBarCtrl().SetHotImageList(&m_HotImageList);m_ToolBar.SetSizes(CSize(40,40),CSize(32,32)); //設(shè)置按鈕和圖標(biāo)的大小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
在創(chuàng)建具有熱點效果的工具欄時,需要使用CreateEx創(chuàng)建工具欄窗口,只有創(chuàng)建的工具欄窗口具有TBSTYLE_FLAT屬性時,工具欄按鈕才具有熱點效果。然后要使用工具欄控制類的SetHotImageList方法關(guān)聯(lián)熱點圖像列表。
6、具有提示功能的工具欄
系統(tǒng)中的工具欄是沒有文本顯示的,為了使用戶能清楚地知道每個工具欄按鈕的用途,除了形象的圖像外,還應(yīng)該具有提示功能,下面就來看一下工具欄的提示功能是如何實現(xiàn)的。
(1)創(chuàng)建一個基于對話框的應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并向工程中導(dǎo)入一個位圖。
(3)在主窗口頭文件中聲明一個CToolBar類對象m_ToolBar,并聲明一個CString的變量str來保存工具欄按鈕文本,代碼如下:
CToolBar m_ToolBar;CString str;- 1
- 2
- 3
(4)在OnInitDialog函數(shù)中加載位圖,創(chuàng)建工具欄,代碼如下:
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,"復(fù)制");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)); //設(shè)置按鈕和按鈕位圖大小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函數(shù)的聲明,代碼如下:
afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );- 1
(7)添加消息處理函數(shù)OnToolTipNotify的實現(xiàn)部分,代碼如下:
BOOL CToolTipDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //獲取工具欄按鈕IDif(nID){nID = m_ToolBar.CommandToIndex(nID); //根據(jù)ID獲取按鈕索引if(nID != -1){m_ToolBar.GetButtonText(nID,str); //獲取工具欄文本pTTT->lpszText = str.GetBuffer(str.GetLength()); //設(shè)置提示信息文本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消息的函數(shù),其中參數(shù)id是發(fā)送消息的控件ID;參數(shù)pNMHDR是一個NMHDR結(jié)構(gòu)指針,該結(jié)構(gòu)記錄了發(fā)送消息的控件ID、句柄等信息;參數(shù)pResult表示結(jié)果代碼指針,TTN_NEEDTEXT消息可以忽略該參數(shù)。
7、帶下拉按鈕的工具欄
在工具欄按鈕的旁邊添加一個呈倒三角形的下拉按鈕可以擴展工具欄按鈕的選擇功能。下拉按鈕在按下后會彈出一個下拉菜單,下拉菜單中的選項就是對按鈕增強的功能。下面來介紹一下如何為工具欄添加下拉按鈕。
(1)創(chuàng)建一個基于單文檔的應(yīng)用程序。
(2)新建一個菜單資源。
(3)修改工具欄資源,為工具欄添加一個修改字體按鈕。
(4)在框架頭文件中修改工具欄風(fēng)格,使“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類的方法,該方法用于設(shè)置工具欄控件的擴展風(fēng)格,語法如下:
DWORD SetExtendedStyle( DWORD dwExStyle ) const;- 1
參數(shù)說明
dwExStyle:系統(tǒng)定義的工具欄控件風(fēng)格,取值TBSTYLE_EX_DRAWDDARROWS,可以為某一個按鈕添加下拉按鈕。
(5)在框架源文件消息映射宏中添加如下代碼:
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)- 1
(6)在框架的頭文件中添加消息響應(yīng)函數(shù)的聲明,代碼如下:
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);- 1
(7)OnToolbarDropDown函數(shù)的實現(xiàn)代碼如下:
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;}//加載相應(yīng)的顯示菜單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方法用于將客戶坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo),TrackPopupMenu方法用于彈出菜單。
(8)在視圖頭文件中聲明一個CFont類型變量Font,并在構(gòu)造函數(shù)中初始化變量Font。重載OnDraw函數(shù),設(shè)置視圖中的顯示文本。
(9)通過類向?qū)樾聞?chuàng)建的菜單和工具欄按鈕添加消息處理函數(shù),代碼如下:
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 | 創(chuàng)建工具欄并將它與一個CToolBarCtrl類對象連接 |
| IsButtonEnabled | 指示工具欄中的指定按鈕是否有效 |
| IsButtonChecked | 指示工具欄中的指定按鈕是否被選中 |
| IsButtonPressed | 指示工具欄中的指定按鈕是否被按下 |
| IsButtonHidden | 指示工具欄中的指定按鈕是否隱藏 |
| IsButtonIndeterminate | 指示工具欄中的指定按鈕的狀態(tài)是否不可用[g1] |
| SetState | 設(shè)置工具欄中的指定按鈕的狀態(tài) |
| GetState | 獲取工具欄中的指定按鈕的狀態(tài) |
| GetButton | 獲取工具欄中的指定按鈕 |
| GetButtonCount | 獲取工具欄按鈕的數(shù)目 |
| GetItemRect | 獲取工具欄按鈕的邊界矩形 |
| GetRect | 獲取一個指定工具欄按鈕的邊界矩形 |
| SetButtonStructSize | 指定TBBUTTON結(jié)構(gòu)的大小 |
| GetButtonSize | 獲取當(dāng)前工具欄按鈕的大小 |
| SetButtonSize | 設(shè)置當(dāng)前工具欄按鈕的大小 |
| SetBitmapSize | 設(shè)置工具欄按鈕的圖像大小 |
| GetToolTips | 獲取與此工具欄相關(guān)聯(lián)的工具欄提示的句柄 |
| SetToolTips | 將工具欄提示與工具欄進行關(guān)聯(lián) |
| SetOwner | 設(shè)置接收工具欄通知消息的按鈕 |
| SetRows | 設(shè)置工具欄按鈕的行數(shù) |
| GetRows | 獲取工具欄按鈕的行數(shù) |
| SetCmdID | 設(shè)置當(dāng)按鈕被按下時要發(fā)送到主窗口的命令I(lǐng)D |
| GetBitmapFlags | 獲取與工具欄位圖相關(guān)聯(lián)的標(biāo)志 |
| GetDisabledImageList | 獲取工具欄用來顯示無效按鈕的圖像列表 |
| GetHotImageList | 獲取工具欄用來顯示熱點按鈕的圖像列表 |
| GetImageList | 獲取工具欄默認(rèn)時的圖像列表 |
| GetStyle | 獲取工具欄當(dāng)前的風(fēng)格 |
| GetMaxTextRows | 獲取工具欄按鈕的顯示文本的最大行數(shù) |
| IsButtonHighlighted | 檢查工具欄按鈕的加亮狀態(tài) |
| SetButtonWidth | 設(shè)置工具欄按鈕寬度的最大值和最小值 |
| SetDisabledImageList | 設(shè)置工具欄用來顯示無效按鈕的圖像列表 |
| SetHotImageList | 設(shè)置工具欄用來顯示熱點按鈕的圖像列表 |
| SetImageList | 設(shè)置工具欄默認(rèn)時的圖像列表 |
| GetDropTarget | 設(shè)置工具欄的IDropTarget接口 |
| SetIndent | 設(shè)置工具欄中第一個按鈕的縮進 |
| SetMaxTextRows | 設(shè)置工具欄按鈕的顯示文本的最大行數(shù) |
| SetStyle | 設(shè)置工具欄當(dāng)前的風(fēng)格 |
| GetAnchorHighlight | 獲取工具欄的加亮設(shè)置 |
| SetAnchorHighlight | 對工具欄進行加亮設(shè)置 |
| GetHotItem | 獲取工具欄熱點項索引 |
| SetHotItem | 設(shè)置工具欄熱點項索引 |
| GetInsertMark | 獲取工具欄的當(dāng)前插入標(biāo)記 |
| SetInsertMark | 設(shè)置工具欄的當(dāng)前插入標(biāo)記 |
| GetMaxSize | 獲取工具欄可視按鈕和分隔條的總大小 |
| InsertMarkHitTest | 獲取工具欄中指定點的插入信息 |
| GetExtendedStyle | 獲取工具欄的擴展風(fēng)格 |
| SetExtendedStyle | 設(shè)置工具欄的擴展風(fēng)格 |
| GetInsertMarkColor | 獲取工具欄插入標(biāo)記的顏色 |
| SetInsertMarkColor | 設(shè)置工具欄插入標(biāo)記的顏色 |
| MapAccelerator | 將一個加速鍵映射到一個工具欄按鈕 |
| MoveButton | 將一個工具欄按鈕從一個索引移動到另一個索引 |
| HitTest | 確定一個點位于工具欄的具體位置 |
| EnableButton | 設(shè)置工具欄按鈕是否有效 |
| CheckButton | 是否選中工具欄中的指定按鈕 |
| PressButton | 是否按下工具欄中的指定按鈕 |
| GetButtonInfo | 獲取工具欄指定按鈕的信息 |
| SetButtonInfo | 設(shè)置工具欄指定按鈕的信息 |
| SetDrawTextFlags | 設(shè)置Win32中DrawText功能標(biāo)志 |
| HideButton | 隱藏或顯示工具欄中的指定按鈕 |
| Indeterminate | 設(shè)置工具欄中指定按鈕是否灰色狀態(tài) |
| AddBitmap | 將位圖圖像添加到工具欄可用的圖像列表中 |
| AddButtons | 將按鈕添加到工具欄中 |
| InsertButton | 在工具欄中插入按鈕 |
| DeleteButton | 從工具欄中刪除按鈕 |
| CommandToIndex | 獲取與指定命令I(lǐng)D相關(guān)聯(lián)的索引 |
| RestoreState | 恢復(fù)工具欄狀態(tài) |
| MarkButton | 設(shè)置工具欄的高亮顯示狀態(tài) |
| LoadImages | 將位圖裝載到工具欄的圖像列表中 |
| SaveState | 保存工具欄狀態(tài) |
| Customize | 顯示CustomizeToolBar對話框 |
| AddString | 將作為資源ID傳遞的一個字符串添加到工具欄的內(nèi)部字符串列表中 |
| AddStrings | 將多個字符串添加到工具欄的內(nèi)部字符串列表中 |
| AutoSize | 調(diào)整工具欄的大小 |
下面使用CToolBarCtrl類創(chuàng)建一個工具欄。
步驟如下。
(1)創(chuàng)建一個基于對話框的應(yīng)用程序。
(2)向?qū)υ捒蛑刑砑右粋€按鈕控件,并向工程中導(dǎo)入8個圖標(biāo)。
(3)在主窗口頭文件中聲明一個CToolBarCtrl類對象m_ToolBar和一個圖像列表對象m_ImageList,代碼如下:
CToolBarCtrl m_ToolBar;CImageList m_ImageList;- 1
- 2
- 3
(4)在工作區(qū)窗口中選擇ResourceView,展開String Table節(jié)點,雙擊abc String Table節(jié)點,打開字符串編輯器,在字符串編輯器中設(shè)置工具欄按鈕的顯示文本。
(5)在OnInitDialog函數(shù)中加載圖標(biāo),關(guān)聯(lián)圖像列表,創(chuàng)建工具欄,代碼如下:
BOOL CToolCtrlDlg::OnInitDialog() {……TBBUTTON button[10];CString string;TCHAR * pString;int num;//創(chuàng)建一個圖像列表m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);//向圖像列表中添加圖標(biāo)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
對話框中建立狀態(tài)欄的方法
狀態(tài)欄(CStatusBar 類的一個窗口對象)包含幾個“窗格”。每個窗格都是狀態(tài)欄中可用來顯示信息的矩形區(qū)域。
例如,很多應(yīng)用程序在最右邊的窗格顯示CAPSLOCK、NUMLOCK和其他鍵的狀態(tài)。
應(yīng)用程序還經(jīng)常在最左邊的窗格(窗格0)顯示信息文本,此窗格有時稱為“消息窗格”。 例如,默認(rèn) MFC
狀態(tài)欄使用消息窗格顯示一個字符串,來解釋當(dāng)前選定的菜單項或工具欄按鈕。
新建窗格
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
接下來進行狀態(tài)欄的創(chuàng)建和顯示,在OnInitDialog()中:
//獲得系統(tǒng)當(dāng)前時間 CTime time; time=time.GetCurrentTime(); CString stime; stime.Format("%s",time.Format("%y-%m-%d %H:%M:%S")); //創(chuàng)建狀態(tài)欄 UINT array[2]={12301,12302}; //注:這里是ID號,應(yīng)保證不與resource.h中的其他ID號重復(fù) m_Statusbar.Create(this); m_Statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT));//顯示狀態(tài)欄 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,"小鬼當(dāng)家博客: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,接受默認(rèn)值。關(guān)閉“資源符號”對話框。 2.定義窗格中要顯示的默認(rèn)字符串。 打開“資源視圖”后,在為應(yīng)用程序列出資源類型的窗口中雙擊“String Table”。 打開“字符串表”編輯器后,從“插入”菜單中選擇“新建字符串”。 在“字符串屬性”窗口中,選擇窗格的命令 ID(例如:ID_INDICATOR_PAGE)并鍵入默認(rèn)字符串值, 如“Page ”。關(guān)閉字符串編輯器。(需要一個默認(rèn)字符串以避免編譯器錯誤。) 3.在文件 MAINFRM.CPP 中定位 indicators 數(shù)組。 該數(shù)組按從左向右的順序為狀態(tài)欄的所有指示器列出了命令 ID。 在數(shù)組中的適當(dāng)位置,輸入窗格的命令 ID。 */static UINT BASED_CODE indicators[] = { ID_SEPARATOR, //分隔符(系統(tǒng)自帶,可不寫) ID_INDICATOR_CAPS, //大小寫指示符(系統(tǒng)自帶,可不寫)ID_INDICATOR_NUM, //NumLoak指示符(系統(tǒng)自帶,可不寫)ID_INDICATOR_SCRL, //Scroll指示符(系統(tǒng)自帶,可不寫)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()過程寫上以下代碼即可:
//設(shè)置狀態(tài)欄HWND hDlg=GetSafeHwnd();HWND hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER,TEXT("就緒"),//顯示在狀態(tài)欄上的信息hDlg, //父窗口句柄IDS_STATUS); //預(yù)定義的資源ID,相當(dāng)于狀態(tài)欄的ID號:GetDlgItem(IDS_STATUS)int pint[4]={100,200,350,-1};//狀態(tài)欄第一個方格右邊界離窗口客戶區(qū)左邊界的距離為100//第二個方格右邊界離窗口客戶區(qū)左邊界的距離為200//...以此類推//-1表示該方格的右邊界為為窗口客戶區(qū)的右邊界::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
效果截圖如下:
預(yù)定義資源ID截圖,在【資源視圖】里面的String Table進行添加即可:
參考資料
MFC工具欄設(shè)計
MFC基于對話框中添加狀態(tài)欄
MFC狀態(tài)欄創(chuàng)建和設(shè)計
給MFC對話框設(shè)置狀態(tài)欄
總結(jié)
以上是生活随笔為你收集整理的MFC对话框中的工具栏、状态栏设计小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为鸿蒙热水器,美的华为跨界联合!搭载鸿
- 下一篇: php4 apache 配置,[开发环境