VCMFC中使用工具欄控件詳解_第1頁
VCMFC中使用工具欄控件詳解_第2頁
VCMFC中使用工具欄控件詳解_第3頁
VCMFC中使用工具欄控件詳解_第4頁
VCMFC中使用工具欄控件詳解_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VC MFC工具欄(CToolBar)控件工具欄工具欄控件在控件面板里沒有對(duì)應(yīng)的選項(xiàng)(圖標(biāo)),但有一個(gè)工具欄控件類CToolBar,所以我們?nèi)绻獎(jiǎng)?chuàng)建一個(gè)工具欄控件并顯示在窗口里的話,只能用代碼來完成,事實(shí)上任何一種控件,都可以用代碼創(chuàng)建,如CButton按鈕類,現(xiàn)舉一個(gè)用代碼創(chuàng)建按鈕控件并顯示在窗口里的例子。CButton類的Create成員函數(shù)可以創(chuàng)建一個(gè)按鈕控件,這個(gè)函數(shù)的格式如下:BOOL CButton:Create(LPCTSTR lpszCaption,/按鈕顯示的文本DWORD dwStyle,/按鈕樣式const RECT& rect,/按鈕控件顯示的區(qū)域(大?。┫鄬?duì)

2、于父窗口CWnd* pParentWnd,/按鈕的父窗口(按鈕屬于哪個(gè)窗口)UINT nID/指明按鈕控件ID號(hào));這個(gè)函數(shù)的第二個(gè)參數(shù)dwStyle是按鈕控件的樣式,也就是在可視化添加按鈕控件時(shí),右擊按鈕控件,選擇屬性,之后會(huì)彈出一個(gè)對(duì)話框,這個(gè)對(duì)話框有一個(gè)樣式的選項(xiàng),該參數(shù)即對(duì)應(yīng)這個(gè)樣式。好了,了解了上面這些我們就來動(dòng)態(tài)創(chuàng)建一個(gè)按鈕吧,首先在對(duì)應(yīng)話類里添加一個(gè)按鈕類成員變量CButton m_Button;然后在對(duì)話框編輯區(qū)里給對(duì)話框添加一個(gè)按鈕控件(單擊這個(gè)按鈕創(chuàng)建按鈕控件),然后添加這個(gè)按鈕控件單擊消息處理函數(shù),并在函數(shù)添加以下語句:RECT ButtonRect;/按鈕控件顯示的區(qū)域

3、(大小)相對(duì)于父窗口ButtonRect.left=10;ButtonRect.top=10;ButtonRect.right=80;ButtonRect.bottom=30;m_Button.Create("動(dòng)態(tài)創(chuàng)建",WS_CHILD,ButtonRect,this,1115);m_Button.ShowWindow(SW_SHOW);/顯示按鈕控件知道了怎樣動(dòng)態(tài)創(chuàng)建按鈕控件,我們就來創(chuàng)建工具欄控件。首先在對(duì)話類中添加一個(gè)CToolBar類成員變量CToolBar m_Toolbar;然后在對(duì)話類文件中定義工具欄命令I(lǐng)D#define ID_BUTTON1 501#de

4、fine ID_BUTTON2 502#define ID_BUTTON3 503接著我們就要?jiǎng)?chuàng)建工具欄資源了,用于工具欄按鈕的顯示圖片方法是進(jìn)入ResourceView(資源視圖選項(xiàng)卡),再隨便選中一個(gè)選項(xiàng),右擊選擇插入,在彈出的對(duì)話框里選中Toolbar,點(diǎn)新建。接著創(chuàng)建三個(gè)按鈕。如下圖所示:第 1 頁 共 9 頁好了,下面把三個(gè)按鈕ID號(hào),改成上面宏定義的ID號(hào),如果要改變“天”字按鈕,選中該按鈕,然后回車鍵,就會(huì)彈出一個(gè)對(duì)話框,在ID項(xiàng)填入ID_BUTTON1,就可以了。接著依次把兩個(gè)ID號(hào)改為ID_BUTTON2,ID_BUTOON3。在這個(gè)對(duì)話框里也可以改變工具欄按鈕的大小。接下來

5、我們樣在對(duì)話框類的OnInitDialog函數(shù)里的所有代碼之后,return TRUE;之間添加以下語句: m_Toolbar.Create(this);/創(chuàng)建工具欄控件m_Toolbar.LoadToolBar(IDR_TOOLBAR1);/裝載工具欄資源CRect rect(100,100,200,200);/m_Toolbar.MoveWindow(rect);/移動(dòng)工具欄在父窗口的位置m_Toolbar.ShowWindow(SW_SHOW);/顯示工具欄但這樣顯示工具欄不是很方便,特別是當(dāng)窗口大小改變后,還要計(jì)算工具欄在窗口中的位置,有沒有什么方法,可以根據(jù)窗口大小自動(dòng)調(diào)整工具欄到合

6、適的位置呢?答案是肯定的,RepositionBars函數(shù)可以做到。實(shí)現(xiàn)方法如下,把上面的語句換成下面的:m_Toolbar.Create(this);/創(chuàng)建工具欄控件m_Toolbar.LoadToolBar(IDR_TOOLBAR1);/裝載工具欄資源/該函數(shù)用于顯示工具欄,并根據(jù)窗口大小自動(dòng)調(diào)整工具欄的位置RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);而響應(yīng)工具欄按鈕單擊消息,跟前面介紹的添加按鈕單擊消息差不多,進(jìn)入類向?qū)?,找到要添加的工具欄按鈕ID,添加COMMAND消息響應(yīng)函數(shù),如下圖:第 2 頁

7、 共 9 頁工具欄按鈕上顯示真彩位圖上面的例子有一個(gè)缺陷,那就是工具欄按鈕顯示的圖形,不能超過256色,如果我想在工具欄按鈕顯示真彩位圖,上面的方法顯示是無法實(shí)現(xiàn)的,那這個(gè)功能是如何實(shí)現(xiàn)呢?SetImageList函數(shù)可以做到,既然要顯示真彩位圖,那就不能使用上面的工具欄資源(256色),所以一切都得到用代碼實(shí)現(xiàn)首先向工程引入六張位圖(用于工具欄按鈕顯示的圖片),假設(shè)ID號(hào)分別為IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6,大小為50X38第一步:在對(duì)話框里添加兩個(gè)成員變量分別是:CToolBar

8、 m_Toolbar;CImageList m_ImageList;第二步:在對(duì)話類文件添加以下宏定義:#define ID_BUTTON1 501#define ID_BUTTON2 502#define ID_BUTTON3 503#define ID_BUTTON4 504#define ID_BUTTON5 505#define ID_BUTTON6 506接下來在對(duì)話框初始化函數(shù)OnInitDialog后面添加如下語句:m_ImageList.Create(50,38,ILC_COLOR24|ILC_MASK,1,1);/圖片大小必須一致CBitmap bmp;for(int i=0

9、;i<6;i+)bmp.LoadBitmap(IDB_BITMAP1+i);m_ImageList.Add(&bmp,RGB(255,255,255);bmp.DeleteObject();UINT nArray6;for(i=0;i<6;i+)nArrayi=ID_BUTTON1+i;m_Toolbar.CreateEx(this);/創(chuàng)建工具欄控件,CreateEx函數(shù)創(chuàng)建的工具欄,默認(rèn)有浮動(dòng)按鈕屬性m_Toolbar.SetButtons(nArray,6);/創(chuàng)建六個(gè)工具按鈕,并依次設(shè)置ID號(hào),對(duì)應(yīng)nArray數(shù)組的元素m_Toolbar.SetSizes(CSiz

10、e(60,56),CSize(50,38);/函數(shù)第一個(gè)是按鈕大小,第二個(gè)是圖像大小,按鈕必須比圖像要大,具體是按鈕的要/比圖像的寬大7或者以上,高6m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);/設(shè)置圖像RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);第 3 頁 共 9 頁運(yùn)行效果如下圖:如果要響應(yīng)工具欄按鈕單擊消息的話,必須手動(dòng)添加消息映射:如ON_COMMAND(ID_BUTTON1,Button1) /button1為消息處理函數(shù)如

11、果要設(shè)置按鈕顯示文本的話,就是CToolBar類的 SetButtonText函數(shù)。設(shè)置工具欄背景位圖用CReBar類可以實(shí)現(xiàn)在工具欄背景里顯示位圖,可以把工具欄設(shè)置成CReBar類對(duì)應(yīng)的子窗口,以上面的工程為例子,再在對(duì)話類里添加一個(gè)成員變量: CReBar m_Rebar;接著導(dǎo)入一張位圖,用做工具欄的背景,ID號(hào)為ID_TOOLBACK,然后在OnInitDialog函數(shù)的RepositionBar(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);語句前面添加如下語句: m_Rebar.Create(this);/創(chuàng)建窗口(控件)m

12、_Rebar.AddBar(&m_Toolbar);/添加m_Toolbar為子窗口m_Rebar.RedrawWindow();/重畫窗口REBARBANDINFO info;info.cbSize=sizeof(info);info.fMask=RBBIM_BACKGROUND;m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);/設(shè)置工具欄背景色透明info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK);/加載位圖 m_Rebar.GetReBa

13、rCtrl().SetBandInfo(0,&info);編譯,運(yùn)行效果如下:為工具欄按鈕添加鼠標(biāo)停留提示信息以上面的工程為例子,在對(duì)話類里添加一個(gè)成員變量CString str;接著在m_Toolbar調(diào)用CreateEx函數(shù)后,調(diào)用這個(gè)語句: m_Toolbar.EnableToolTips();/激活信息提示功能 然后在對(duì)話類里添加一個(gè)成員函數(shù)(用于TTN_NEEDTEXT消息處理函數(shù)),格式如下:BOOL OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)然后添加TTN_NEEDTEXT消息映射宏ON_NOTIFY_EX(TT

14、N_NEEDTEXT,0,OnDisplay)第 4 頁 共 9 頁OnDisplay函數(shù)代碼如下:TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;UINT nID=pNMHDR->idFrom;/獲取工具欄按鈕IDUINT nIndex=m_Toolbar.CommandToIndex(nID);/根據(jù)按鈕ID獲取索引str.Format("工具欄按鈕%d",nIndex);pTTT->lpszText=str.GetBuffer(str.GetLength();/設(shè)置按鈕提示信息pTTT->hinst=AfxGetRes

15、ourceHandle();return TRUE;工具欄按鈕上顯示圖標(biāo)在按鈕上顯示圖標(biāo),方法跟顯示位圖差不到哪去,只要讓CImageList里添加的是圖標(biāo)就行了,首先向工程引入六個(gè)圖標(biāo),假設(shè)ID號(hào)分別為IDI_ICON1、IDI_ICON2.IDI_ICON6以上面的工程為例:在OnInitDialog函數(shù)最后添加如下代碼:m_ImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);/圖片大小必須一致for(int i=IDI_ICON1;i<=IDI_ICON6;i+)m_ImageList.Add(AfxGetApp()->LoadI

16、con(i);/添加圖標(biāo)UINT nArray6;for(i=0;i<6;i+)nArrayi=ID_BUTTON1+i;m_Toolbar.CreateEx(this);/創(chuàng)建工具欄控件m_Toolbar.EnableToolTips();/激活信息提示功能m_Toolbar.SetButtons(nArray,6);m_Toolbar.SetSizes(CSize(60,56),CSize(48,48);m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);m_Rebar.Create(this);m_Rebar.AddB

17、ar(&m_Toolbar);m_Rebar.RedrawWindow();REBARBANDINFO info;info.cbSize=sizeof(info);info.fMask=RBBIM_BACKGROUND;m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);/設(shè)置工具欄背景色透明info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK);m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);Repos

18、itionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);運(yùn)行效果如下:第 5 頁 共 9 頁設(shè)置工具欄按鈕熱點(diǎn)圖片像前面的SetImageList函數(shù)設(shè)置工具欄按鈕正常顯示時(shí)的圖片,而SetHotImageList函數(shù)是設(shè)置工具熱點(diǎn)按鈕圖片,也就是當(dāng)鼠標(biāo)停留在按鈕上所顯示的圖片,用法跟SetImageList函數(shù)一樣,只是CImageList類關(guān)聯(lián)的圖片不一樣。為了顯示熱點(diǎn)按鈕圖片,我們得準(zhǔn)備兩組圖片,一組用于正常顯示,一組用于熱點(diǎn)顯示。這里我的圖片格式是圖標(biāo)。還有一點(diǎn)要說明的是,工具欄必須具有TBSTYLE_FLAT(浮動(dòng)按

19、鈕)屬性,這一點(diǎn)在用CreateEx函數(shù)創(chuàng)建工具欄的時(shí)候,已經(jīng)默認(rèn)包含了。兩組圖片:正常顯示:熱點(diǎn)顯示:工具欄背景位圖:首先向工程引入這十二個(gè)圖標(biāo):假設(shè)正常顯示的圖標(biāo)ID號(hào)依次為:IDI_NORMAL1、IDI_NORMAL2、。IDI_NORMAL6熱點(diǎn)圖標(biāo)ID依次為:IDI_HOT1、IDI_HOT2、。IDI_HOT6然后引入背景位圖,ID號(hào)為IDB_TOOLBACK做完了這些,我們就向?qū)υ掝惱锾砑铀膫€(gè)成員變量:CToolBar m_Toolbar;CImageList m_ImageList;CImageList m_hotImageList;CReBar m_Rebar;然后增加五個(gè)

20、宏定義:#define ID_BUTTON1 501#define ID_BUTTON2 502#define ID_BUTTON3 503#define ID_BUTTON4 504#define ID_BUTTON5 505第 6 頁 共 9 頁接著在OnInitDialog函數(shù)添加如下代碼:m_ImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);/圖片大小必須一致m_hotImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);for(int i=0;i<5;i+)m_ImageList.Add

21、(AfxGetApp()->LoadIcon(IDI_NORMAL1+i);m_hotImageList.Add(AfxGetApp()->LoadIcon(IDI_HOT1+i);UINT nArray5;for(i=0;i<5;i+)nArrayi=ID_BUTTON1+i;m_Toolbar.CreateEx(this);/創(chuàng)建工具欄控件m_Toolbar.SetButtons(nArray,5);m_Toolbar.SetSizes(CSize(60,56),CSize(48,48);m_Toolbar.GetToolBarCtrl().SetImageList(&a

22、mp;m_ImageList);m_Toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList);m_Rebar.Create(this);m_Rebar.AddBar(&m_Toolbar);m_Rebar.RedrawWindow();REBARBANDINFO info;info.cbSize=sizeof(info);info.fMask=RBBIM_BACKGROUND;m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);/設(shè)置工具欄背景色透明info.hbmBack=Load

23、Bitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK);m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);運(yùn)行效果:CToolBarCtrl工具欄控制類這個(gè)類的用法跟CToolBar的用法大同小異,模式都差不多,只需要了解一下這個(gè)類里的Create和AddButtons函數(shù)就行了,Create函數(shù)定義如下:BOOL Create( DWORD dwSty

24、le, const RECT& rect, CWnd* pParentWnd, UINT nID );dwStyle:工具欄控件的風(fēng)格 rect:工具欄位置和區(qū)域 pParentWnd:工具欄父窗口句柄(屬于哪個(gè)窗口) nID:工具欄控件ID號(hào)第 7 頁 共 9 頁AddButtons函數(shù)用于往工具欄里添加一組按鈕,函數(shù)定義如下:BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );nNumButtons:要添加的按鈕數(shù)量 也就是函數(shù)第二個(gè)參數(shù)數(shù)組大小。lpButtons:一個(gè)TBBUTTON結(jié)構(gòu)數(shù)組的地址 TBBUTON結(jié)構(gòu)

25、定義如下:typedef struct _TBBUTTONint iBitmap; / 按鈕顯示的圖片索引,沒有圖像為NULL,int idCommand; / 與此按鈕相關(guān)聯(lián)的命令標(biāo)識(shí)符,當(dāng)fsStyle具有TBSTYLE_SEP屬性時(shí),該項(xiàng)必須為0 BYTE fsState; / 按鈕的狀態(tài)標(biāo)志BYTE fsStyle; /按鈕風(fēng)格DWORD dwData; / 用戶定義的數(shù)據(jù)int iString; / 按鈕顯示的文本內(nèi)容索引,無為NULL。 TBBUTTON;“MFC類庫詳解”關(guān)于fsState和fsStyle參數(shù)的解釋如下:fsState 按鈕的狀態(tài)標(biāo)志。它可以是下面列出的值的一個(gè)組

26、合: · TBSTATE_CHECKED 該按鈕具有TBSTYLE_CHECKED風(fēng)格并且被按下。 · TBSTATE_ENABLED 按鈕接收用戶輸入。一個(gè)不具有這個(gè)狀態(tài)的按鈕是不接收用戶輸入的,并且變灰。 · TBSTATE_HIDDEN 按鈕不可見,并且不能接收用戶輸入。 · TBSTATE_INDETERMINATE 按鈕是變灰的。 · TBSTATE_PRESSED 按鈕被按下。 · TBSTATE_WRAP 按鈕之后是一個(gè)分隔線。此按鈕還必須具有TBSTATE_ENABLED狀態(tài)。 sStyle 按鈕風(fēng)格。它可以是下列值的

27、一個(gè)組合: · TBSTYLE_BUTTON 創(chuàng)建一個(gè)標(biāo)準(zhǔn)的按鈕。 · TBSTYLE_CHECK 創(chuàng)建一個(gè)每次用戶點(diǎn)擊時(shí)可以在按下和彈起狀態(tài)間切換的按鈕。該按鈕則處于按下狀態(tài)時(shí)有一種不同的背景顏色。 · TBSTYLE_CHECKGROUP 創(chuàng)建一個(gè)核選按鈕,它被選擇后一直處于按下狀態(tài),直到同組中的另一個(gè)按鈕被按下時(shí)它才彈起。 · TBSTYLE_GROUP 創(chuàng)建一個(gè)被選擇后一直處于按下狀態(tài),直到同組中的另一個(gè)按鈕被按下時(shí)它才彈起的按鈕。 · TBSTYLE_SEP 創(chuàng)建一個(gè)分隔線,為按鈕組之間提供一個(gè)小的間距。具有這個(gè)風(fēng)格的按鈕是不接收用戶輸入的。用CToolBarCtrl類在窗口里顯示一個(gè)工具欄的步驟如下:引入四個(gè)圖標(biāo)文件到工程里,然后在對(duì)話框類定義兩個(gè)變量:CImageList m_ImageList;CToolBarCtrl m_TBarCtrl;然后在OnInitDialog函數(shù)添加如下代碼:TBBUTTON button4;m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1);m_ImageList.Add(Afx

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論