Toolbar控件:32位真彩色大圖標

一、創建普通toolbar

1.         新建一MFC程序,在Dlg頭文件中添加一個CToolBar類的成員變量CToolBar m_Toolbar;

2.         然後在頭文件中定義工具欄命令ID。

#define ID_BUTTON1    501
#define ID_BUTTON2    502
#define ID_BUTTON3    503

3.         在資源對話框中,新建一toolbar.然後創建3個按鈕。

注意:在VS 2008中添加按鈕操作是對當前按鈕的ID屬性賦值,系統會自動出現一個新的按鈕。

4.         修改按鈕的ID分別爲ID_BUTTON1、ID_BUTTON2、ID_BUTTON3,也可以修改按鈕的大小,用畫筆工具修改按鈕的樣子。

5.         然後就可以初始化toolbar了:

m_Toolbar.Create(this);//創建工具欄控件
 m_Toolbar.LoadToolBar(IDR_TOOLBAR1);//裝載工具欄資源
 //該函數用於顯示工具欄,並根據窗口大小自動調整工具欄的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

6.         添加按鈕的相應事件:

首先在頭文件中聲明事件處理函數:

afx_msg void Button1Click();

在.cpp文件中聲明COMMAND 事件的消息函數映射:ON_COMMAND(ID_BUTTON1,CToolbarNewDlg::Button1Click)

在.cpp中實現Button1Click函數即可。

 

二、創建真彩色toolbar

1.首先向工程中導入6張位圖(格式爲bmp),大小爲32*32,顏色爲32位。ID分別默認爲IDB_BITMAP1, IDB_BITMAP2……

2.在Dlg頭文件中添加兩個變量:

                   CToolBar m_Toolbar;
                   CImageList m_ImageList;

3.在頭文件中添加宏定義:

#define ID_BUTTON1    501
#define ID_BUTTON2    502
#define ID_BUTTON3    503
#define ID_BUTTON4    504
#define ID_BUTTON5    505
#define ID_BUTTON6    506

4.添加初始化代碼:

m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,1,1);

//圖片大小必須一致,參數分別表示圖片的像素32*3232位真彩色。
    CBitmap bmp;
    for(int i=0;i<6;i++)
    {
                 //使用現有位圖爲bmp賦值

bmp.LoadBitmap(IDB_BITMAP1+i);
                 m_ImageList.Add(&bmp,RGB(255,255,255));
                 bmp.DeleteObject();
    }
    UINT nArray[6];
    for(i=0;i<6;i++)
    {
         nArray[i]=ID_BUTTON1+i;
    }
      m_Toolbar.CreateEx(this);

//創建工具欄控件,CreateEx函數創建的工具欄,默認有浮動按鈕屬性
        m_Toolbar.SetButtons(nArray,6);

//創建六個工具按鈕,並依次設置ID號,對應nArray數組的元素

//相當於完成了一中手動爲按鈕設置ID的工作。
        m_Toolbar.SetSizes(CSize(40,40),CSize(32,32));

//函數第一個是按鈕大小,第二個是圖像大小,按鈕必須比圖像要大,具體是按鈕的要比圖像的寬大7或者以上,高6
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);//設置圖像
 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

顯示效果:

Toolbar控件:32位真彩色大圖標 - WelKangm - WelKangm的博客
 

 

三、爲toolbar添加背景位圖

1. MFC提供了一個類CReBar,這是一個容器類,可以向這個類中添加工具欄,編輯框,下拉列表等等。在頭文件中添加一個CReBar類的變量:CReBar m_Rebar;

2.導入一張位圖,作爲工具欄背景,ID爲ID_TOOLBACK.

3.在上邊代碼中RepositionBars語句之前添加如下代碼:

 

 

m_Rebar.Create(this);//創建窗口(控件)
        m_Rebar.AddBar(&m_Toolbar);//m_Toolbar綁定到CReBar
        m_Rebar.RedrawWindow();//重畫窗口
        REBARBANDINFO info;//設置CReBar的樣式
        info.cbSize=sizeof(info);
        info.fMask=RBBIM_BACKGROUND;
        m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);

//設置工具欄背景色透明,以便顯示CReBar的底色
        info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));

//加載位圖
        m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);

4.如果要爲button設置文字的話,可以使用CToolBar類的SetButtonText函數,但是此函數必須放在setSize函數之前,否則無法顯示文字;而且要設置toolbar的高度足夠,以便顯示文字。

5.運行效果如下:

Toolbar控件:32位真彩色大圖標 - WelKangm - WelKangm的博客
 

6.問題:

  我按上述方法進行操作後,CReBar已經創建,但是背景色不知道爲何添加不上。如果有誰解決了此問題,望不吝賜教。

 

四、添加鼠標停留事件

1.首先在頭文件中添加一字符串變量:CString str;

2.在m_Toolbar調用CreateEX函數後,添加語句:

m_Toolbar.EnableToolTips();//激活信息提醒功能

3.在頭文件中添加TTN_NEEDTEXT消息處理函數:

                   BOOL  OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)

4.在.cpp中添加消息映射宏:

                   ON_NOTIFY_EX(TTN_NEEDTEXT,0,CToolbarNewDlg::OnDisplay)

5.實現OnDisplay代碼:

TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//獲取工具欄按鈕ID
UINT nIndex=m_Toolbar.CommandToIndex(nID);//根據按鈕ID獲取索引
switch(nID)

                  {

                            case ID_BUTTON1: str="旅行社";break;

                            case ID_BUTTON2: str="賓館";break;

                            case ID_BUTTON3: str="招聘";break;

                            default : str="";

}

pTTT->lpszText=str.GetBuffer(str.GetLength());//設置按鈕提示信息
pTTT->hinst=AfxGetResourceHandle();
return TRUE;

 

五、使用ICON構建toolbar

1.與用bmp圖像構建toolbar一樣,只是向m_ImageList中添加圖片的方式有些不同:

                   for(int i=IDI_ICON1;i<=IDI_ICON6;i++)
                           m_ImageList.Add(AfxGetApp()->LoadIcon(i));//添加圖標

 

六、設置toolbar熱點圖標

1.準備兩套圖標,一套爲正常顯示,一套爲鼠標放上去後熱點顯示的圖標。

2.工具欄必須具有TBSTYLE_FLAT(浮動按鈕)屬性,這在創建時已經默認擁有。

3.在頭文件中額外定義ImageList:CmageList m_hotImageList;

4.以下語句添加在與_ImageList創建過程相應的位置即可:

                   m_hotImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);

m_hotImageList.Add(AfxGetApp()->LoadIcon(IDI_HOT1+i));

                   m_toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList);

5.這樣,當鼠標放上去時,就會顯示另一種樣子。

 

七、CToolBarCtrl工具欄控制類

1.用法跟CToolBar相似:

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

dwStyle:工具欄控件的風格    

rect:工具欄位置和區域  

pParentWnd:工具欄父窗口句柄(屬於哪個窗口)

nID:工具欄控件ID號

  AddButtons用於往工具欄添加一組按鈕:

BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );

nNumButtons:要添加的按鈕數量 也就是函數第二個參數數組大小。

lpButtons:一個TBBUTTON結構數組的地址

TBBUTON結構定義如下:
typedef struct _TBBUTTON
{
         int iBitmap;

// 按鈕顯示的圖片索引,沒有圖像爲NULL,
         int idCommand;

// 與此按鈕相關聯的命令標識符,fsStyle具有TBSTYLE_SEP屬性時,該項必須爲0
         BYTE fsState; // 按鈕的狀態標誌
         BYTE fsStyle; //按鈕風格
          DWORD dwData; // 用戶定義的數據

  int iString; // 按鈕顯示的文本內容索引,無爲NULL。
} TBBUTTON;

2.使用CToolBarCtrl添加一個工具條的過程:

        

    CImageList m_ImageList;
       CToolBarCtrl m_TBarCtrl;

TBBUTTON button[4];
 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_TBarCtrl.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1200);
 m_TBarCtrl.SetImageList(&m_ImageList);
 for(int i=0;i<4;i++)
 {
       button[i].fsState=TBSTATE_ENABLED;
       button[i].fsStyle=TBSTYLE_BUTTON;
       button[i].iBitmap=i;
 }
 m_TBarCtrl.AddButtons(4,button);
 m_TBarCtrl.AutoSize();
 m_TBarCtrl.SetStyle(TBSTYLE_FLAT|CCS_TOP);

3.爲按鈕創建響應事件函數

TBBUTON結構裏有一個成員idCommand,這個成員跟菜單項的ID值一樣,用於標識工具欄按鈕項,也就是說idCommand是工具欄項ID號,就是最前面設置工具欄資源時,選擇一個按鈕,然後按回車,彈出一個對話框,裏面有一個ID項,跟這個是一樣的。

 

在上邊的for循環中,添加button[i].idCommand=ID_BUTTON1+i;爲按鈕設置ID

然後添加COMMAND事件函數即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章