版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VC MFC工具欄(CToolBar)控件工具欄工具欄控件在控件面板里沒有對應的選項(圖標),但有一個工具欄控件類CToolBar,所以我們如果要創(chuàng)建一個工具欄控件并顯示在窗口里的話,只能用代碼來完成,事實上任何一種控件,都可以用代碼創(chuàng)建,如CButton按鈕類,現(xiàn)舉一個用代碼創(chuàng)建按鈕控件并顯示在窗口里的例子。CButton類的Create成員函數(shù)可以創(chuàng)建一個按鈕控件,這個函數(shù)的格式如下:BOOL CButton:Create(LPCTSTR lpszCaption,/按鈕顯示的文本DWORD dwStyle,/按鈕樣式const RECT& rect,/按鈕控件顯示的區(qū)域(大?。┫鄬?/p>
2、于父窗口CWnd* pParentWnd,/按鈕的父窗口(按鈕屬于哪個窗口)UINT nID/指明按鈕控件ID號);這個函數(shù)的第二個參數(shù)dwStyle是按鈕控件的樣式,也就是在可視化添加按鈕控件時,右擊按鈕控件,選擇屬性,之后會彈出一個對話框,這個對話框有一個樣式的選項,該參數(shù)即對應這個樣式。好了,了解了上面這些我們就來動態(tài)創(chuàng)建一個按鈕吧,首先在對應話類里添加一個按鈕類成員變量CButton m_Button;然后在對話框編輯區(qū)里給對話框添加一個按鈕控件(單擊這個按鈕創(chuàng)建按鈕控件),然后添加這個按鈕控件單擊消息處理函數(shù),并在函數(shù)添加以下語句:RECT ButtonRect;/按鈕控件顯示的區(qū)域
3、(大小)相對于父窗口ButtonRect.left=10;ButtonRect.top=10;ButtonRect.right=80;ButtonRect.bottom=30;m_Button.Create("動態(tài)創(chuàng)建",WS_CHILD,ButtonRect,this,1115);m_Button.ShowWindow(SW_SHOW);/顯示按鈕控件知道了怎樣動態(tài)創(chuàng)建按鈕控件,我們就來創(chuàng)建工具欄控件。首先在對話類中添加一個CToolBar類成員變量CToolBar m_Toolbar;然后在對話類文件中定義工具欄命令ID#define ID_BUTTON1 501#de
4、fine ID_BUTTON2 502#define ID_BUTTON3 503接著我們就要創(chuàng)建工具欄資源了,用于工具欄按鈕的顯示圖片方法是進入ResourceView(資源視圖選項卡),再隨便選中一個選項,右擊選擇插入,在彈出的對話框里選中Toolbar,點新建。接著創(chuàng)建三個按鈕。如下圖所示:第 1 頁 共 9 頁好了,下面把三個按鈕ID號,改成上面宏定義的ID號,如果要改變“天”字按鈕,選中該按鈕,然后回車鍵,就會彈出一個對話框,在ID項填入ID_BUTTON1,就可以了。接著依次把兩個ID號改為ID_BUTTON2,ID_BUTOON3。在這個對話框里也可以改變工具欄按鈕的大小。接下來
5、我們樣在對話框類的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);/移動工具欄在父窗口的位置m_Toolbar.ShowWindow(SW_SHOW);/顯示工具欄但這樣顯示工具欄不是很方便,特別是當窗口大小改變后,還要計算工具欄在窗口中的位置,有沒有什么方法,可以根據(jù)窗口大小自動調整工具欄到合
6、適的位置呢?答案是肯定的,RepositionBars函數(shù)可以做到。實現(xiàn)方法如下,把上面的語句換成下面的:m_Toolbar.Create(this);/創(chuàng)建工具欄控件m_Toolbar.LoadToolBar(IDR_TOOLBAR1);/裝載工具欄資源/該函數(shù)用于顯示工具欄,并根據(jù)窗口大小自動調整工具欄的位置RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);而響應工具欄按鈕單擊消息,跟前面介紹的添加按鈕單擊消息差不多,進入類向導,找到要添加的工具欄按鈕ID,添加COMMAND消息響應函數(shù),如下圖:第 2 頁
7、 共 9 頁工具欄按鈕上顯示真彩位圖上面的例子有一個缺陷,那就是工具欄按鈕顯示的圖形,不能超過256色,如果我想在工具欄按鈕顯示真彩位圖,上面的方法顯示是無法實現(xiàn)的,那這個功能是如何實現(xiàn)呢?SetImageList函數(shù)可以做到,既然要顯示真彩位圖,那就不能使用上面的工具欄資源(256色),所以一切都得到用代碼實現(xiàn)首先向工程引入六張位圖(用于工具欄按鈕顯示的圖片),假設ID號分別為IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6,大小為50X38第一步:在對話框里添加兩個成員變量分別是:CToolBar
8、 m_Toolbar;CImageList m_ImageList;第二步:在對話類文件添加以下宏定義:#define ID_BUTTON1 501#define ID_BUTTON2 502#define ID_BUTTON3 503#define ID_BUTTON4 504#define ID_BUTTON5 505#define ID_BUTTON6 506接下來在對話框初始化函數(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)建的工具欄,默認有浮動按鈕屬性m_Toolbar.SetButtons(nArray,6);/創(chuàng)建六個工具按鈕,并依次設置ID號,對應nArray數(shù)組的元素m_Toolbar.SetSizes(CSiz
10、e(60,56),CSize(50,38);/函數(shù)第一個是按鈕大小,第二個是圖像大小,按鈕必須比圖像要大,具體是按鈕的要/比圖像的寬大7或者以上,高6m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);/設置圖像RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);第 3 頁 共 9 頁運行效果如下圖:如果要響應工具欄按鈕單擊消息的話,必須手動添加消息映射:如ON_COMMAND(ID_BUTTON1,Button1) /button1為消息處理函數(shù)如
11、果要設置按鈕顯示文本的話,就是CToolBar類的 SetButtonText函數(shù)。設置工具欄背景位圖用CReBar類可以實現(xiàn)在工具欄背景里顯示位圖,可以把工具欄設置成CReBar類對應的子窗口,以上面的工程為例子,再在對話類里添加一個成員變量: CReBar m_Rebar;接著導入一張位圖,用做工具欄的背景,ID號為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);/設置工具欄背景色透明info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK);/加載位圖 m_Rebar.GetReBa
13、rCtrl().SetBandInfo(0,&info);編譯,運行效果如下:為工具欄按鈕添加鼠標停留提示信息以上面的工程為例子,在對話類里添加一個成員變量CString str;接著在m_Toolbar調用CreateEx函數(shù)后,調用這個語句: m_Toolbar.EnableToolTips();/激活信息提示功能 然后在對話類里添加一個成員函數(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();/設置按鈕提示信息pTTT->hinst=AfxGetRes
15、ourceHandle();return TRUE;工具欄按鈕上顯示圖標在按鈕上顯示圖標,方法跟顯示位圖差不到哪去,只要讓CImageList里添加的是圖標就行了,首先向工程引入六個圖標,假設ID號分別為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);/添加圖標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);/設置工具欄背景色透明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);運行效果如下:第 5 頁 共 9 頁設置工具欄按鈕熱點圖片像前面的SetImageList函數(shù)設置工具欄按鈕正常顯示時的圖片,而SetHotImageList函數(shù)是設置工具熱點按鈕圖片,也就是當鼠標停留在按鈕上所顯示的圖片,用法跟SetImageList函數(shù)一樣,只是CImageList類關聯(lián)的圖片不一樣。為了顯示熱點按鈕圖片,我們得準備兩組圖片,一組用于正常顯示,一組用于熱點顯示。這里我的圖片格式是圖標。還有一點要說明的是,工具欄必須具有TBSTYLE_FLAT(浮動按
19、鈕)屬性,這一點在用CreateEx函數(shù)創(chuàng)建工具欄的時候,已經(jīng)默認包含了。兩組圖片:正常顯示:熱點顯示:工具欄背景位圖:首先向工程引入這十二個圖標:假設正常顯示的圖標ID號依次為:IDI_NORMAL1、IDI_NORMAL2、。IDI_NORMAL6熱點圖標ID依次為:IDI_HOT1、IDI_HOT2、。IDI_HOT6然后引入背景位圖,ID號為IDB_TOOLBACK做完了這些,我們就向對話類里添加四個成員變量:CToolBar m_Toolbar;CImageList m_ImageList;CImageList m_hotImageList;CReBar m_Rebar;然后增加五個
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);/設置工具欄背景色透明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);運行效果:CToolBarCtrl工具欄控制類這個類的用法跟CToolBar的用法大同小異,模式都差不多,只需要了解一下這個類里的Create和AddButtons函數(shù)就行了,Create函數(shù)定義如下:BOOL Create( DWORD dwSty
24、le, const RECT& rect, CWnd* pParentWnd, UINT nID );dwStyle:工具欄控件的風格 rect:工具欄位置和區(qū)域 pParentWnd:工具欄父窗口句柄(屬于哪個窗口) nID:工具欄控件ID號第 7 頁 共 9 頁AddButtons函數(shù)用于往工具欄里添加一組按鈕,函數(shù)定義如下:BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );nNumButtons:要添加的按鈕數(shù)量 也就是函數(shù)第二個參數(shù)數(shù)組大小。lpButtons:一個TBBUTTON結構數(shù)組的地址 TBBUTON結構
25、定義如下:typedef struct _TBBUTTONint iBitmap; / 按鈕顯示的圖片索引,沒有圖像為NULL,int idCommand; / 與此按鈕相關聯(lián)的命令標識符,當fsStyle具有TBSTYLE_SEP屬性時,該項必須為0 BYTE fsState; / 按鈕的狀態(tài)標志BYTE fsStyle; /按鈕風格DWORD dwData; / 用戶定義的數(shù)據(jù)int iString; / 按鈕顯示的文本內容索引,無為NULL。 TBBUTTON;“MFC類庫詳解”關于fsState和fsStyle參數(shù)的解釋如下:fsState 按鈕的狀態(tài)標志。它可以是下面列出的值的一個組
26、合: · TBSTATE_CHECKED 該按鈕具有TBSTYLE_CHECKED風格并且被按下。 · TBSTATE_ENABLED 按鈕接收用戶輸入。一個不具有這個狀態(tài)的按鈕是不接收用戶輸入的,并且變灰。 · TBSTATE_HIDDEN 按鈕不可見,并且不能接收用戶輸入。 · TBSTATE_INDETERMINATE 按鈕是變灰的。 · TBSTATE_PRESSED 按鈕被按下。 · TBSTATE_WRAP 按鈕之后是一個分隔線。此按鈕還必須具有TBSTATE_ENABLED狀態(tài)。 sStyle 按鈕風格。它可以是下列值的
27、一個組合: · TBSTYLE_BUTTON 創(chuàng)建一個標準的按鈕。 · TBSTYLE_CHECK 創(chuàng)建一個每次用戶點擊時可以在按下和彈起狀態(tài)間切換的按鈕。該按鈕則處于按下狀態(tài)時有一種不同的背景顏色。 · TBSTYLE_CHECKGROUP 創(chuàng)建一個核選按鈕,它被選擇后一直處于按下狀態(tài),直到同組中的另一個按鈕被按下時它才彈起。 · TBSTYLE_GROUP 創(chuàng)建一個被選擇后一直處于按下狀態(tài),直到同組中的另一個按鈕被按下時它才彈起的按鈕。 · TBSTYLE_SEP 創(chuàng)建一個分隔線,為按鈕組之間提供一個小的間距。具有這個風格的按鈕是不接收用戶輸入的。用CToolBarCtrl類在窗口里顯示一個工具欄的步驟如下:引入四個圖標文件到工程里,然后在對話框類定義兩個變量: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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人住房公積金借款合同范本示例4篇
- 二零二五年度別墅裝修工程噪音控制合同3篇
- 2025年度美容院美容院美容師績效考核及激勵合同4篇
- 2025年度綠茶品牌戰(zhàn)略合作采購合同范本4篇
- 2025年度木方模板標準化生產(chǎn)與市場推廣合同4篇
- 2025年度鋼材運輸項目融資服務合同
- 2025年度存量房交易風險評估合同4篇
- 2025年度二零二五年度物流行業(yè)應收賬款保理合同4篇
- 2025年度數(shù)據(jù)中心場地租賃及網(wǎng)絡安全服務合同4篇
- 2025年度爬架租賃與應急救援預案合同示范3篇
- 有砟軌道施工工藝課件
- 兩辦意見八硬措施煤礦安全生產(chǎn)條例宣貫學習課件
- 40篇短文搞定高中英語3500單詞
- 人教版高中數(shù)學必修二《第九章 統(tǒng)計》同步練習及答案解析
- 兒科護理安全警示教育課件
- 三年級下冊口算天天100題
- 國家中英文名稱及代碼縮寫(三位)
- 人員密集場所消防安全培訓
- 液晶高壓芯片去保護方法
- 使用AVF血液透析患者的護理查房
- 拜太歲科儀文檔
評論
0/150
提交評論