通过CToolBar类创建工具栏

xiaoxiao2021-02-28  101

VC并不提供工具栏控件,而是通过CToolBar类来创建工具栏。

 

动态创建工具栏的操作如下:

通过资源窗口导入工具栏按钮的ico文件。

在App的头文件(如CDemoDlg.h)里,添加如下定义

#defineTB_BUTTON_CNTMAX        5           //工具栏按钮个数

#defineTB_BUTTON_WIDTH     32          //工具栏按钮图标宽度

#defineTB_BUTTON_HIGHT     32          //工具栏按钮图标高度

添加成员变量并声明提示信息的消息处理函数OnDisplay

CToolBar            m_objToolBar;

CImageList      m_TBImageList;

CString         m_sHint;

 

BOOL OnDisplay(UINT id, NMHDR*pNMHDR, LRESULT *pResult);  //显示提示信息

DECLARE_MESSAGE_MAP()

 

在APP的源文件(如CDemoDlg.c)的OnInitDialog()函数最后添加如下代码,将m_TBImageList与工具栏m_objToolBar关联,并将工具栏和对应菜单项ID进行关联,从而与菜单项共用处理函数

BOOLCDemoDlg ::OnInitDialog()

{

//创建m_TBImageList

m_TBImageList.Create(TB_BUTTON_WIDTH,TB_BUTTON_HIGHT, ILC_COLOR32 | ILC_MASK, 1, 1);

m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON1));

m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON2));

m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON3));

m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON4));

m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON5));

//创建m_objToolBar

m_objToolBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER

        | CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC| CBRS_BORDER_TOP);

//TBImageList设置给m_objToolBar

m_objToolBar.GetToolBarCtrl().SetImageList(&m_TBImageList);

//工具栏按钮设置

TBBUTTON tbButton[TB_BUTTON_CNTMAX]= {0};

for(inti=0; i< TB_BUTTON_CNTMAX; i++)

    {

        if(i == 1 || i == 3)

        {

            tbButton[i].dwData      = NULL;

            tbButton[i].fsState     = TBSTATE_ENABLED;

            tbButton[i].fsStyle     = (BYTE)TBSTYLE_SEP;        //设为分割条

            tbButton[i].iBitmap     = i;

        }

        else

        {

            tbButton[i].dwData      = NULL;

            tbButton[i].fsState     = TBSTATE_ENABLED;

            tbButton[i].fsStyle     = (BYTE)TBSTYLE_FLAT;

            tbButton[i].iBitmap     = i;

        }

    }

}

//绑定菜单项

tbButton[0].idCommand   = ID_MENU_0_0;

tbButton[1].idCommand   =ID_MENU_0_1;

tbButton[2].idCommand   = ID_MENU_0_2;

tbButton[3].idCommand   =ID_MENU_0_3;

tbButton[4].idCommand   = ID_MENU_0_4;

m_objToolBar.GetToolBarCtrl().AddButtons(TB_BUTTON_CNTMAX, tbButton);

//设定按钮及按钮图片大小

m_objToolBar.SetSizes(CSize(40,40), CSize(TB_BUTTON_WIDTH,TB_BUTTON_HIGHT));

//使工具栏根据窗口大小自动调整工具栏的位置

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

//显示提示信息

m_objToolBar.EnableToolTips(); 

 

}

 

//提示信息需要在消息映射中添加如下处理

BEGIN_MESSAGE_MAP(CDemoDlg, CDialogEx)

ON_NOTIFY_EX(TTN_NEEDTEXT,0, & CDemoDlg::OnDisplay)

END_MESSAGE_MAP()

 

BOOL CJWEODocDialog::OnDisplay(UINTid, NMHDR *pNMHDR, LRESULT *pResult)

{

    TOOLTIPTEXT *pTBT=(TOOLTIPTEXT*)pNMHDR;

    UINT nID  =pNMHDR->idFrom;                                              //获取工具栏按钮ID

    UINT nIndex = m_objToolBar.CommandToIndex(nID);     //根据按钮ID获取索引

 

    switch(nIndex)

    {

    case0:

        m_sHint= "打开";

        break;

    case2:

        m_sHint= "套红头";

        break;

    case4:

        m_sHint= "公文盖章";

        break;

    default:

        m_sHint= "";

        break;

    }

    pTBT ->lpszText= m_sHint.GetBuffer(m_sHint.GetLength());       //设置按钮提示信息

    pTBT ->hinst= AfxGetResourceHandle();

 

    returnTRUE;

}

 

想控制工具栏按钮置灰,可添加UpdateToolBarStatus(),并在头文件CDemoDlg.h中添加声明

CDemoDlg.h

void UpdateToolBarStatus()

 

CDemoDlg.c

voidCDemoDlg::UpdateToolBarStatus()

{

    m_objToolBar.GetToolBarCtrl().SetState(ID_MENU_0_0, TBSTATE_ENABLED);

}

 

可通过ShowWindow设置工具栏的显示隐藏

::ShowWindow(m_objToolBar.m_hWnd, SW_HIDE);

::ShowWindow(m_objToolBar.m_hWnd, SW_SHOWNORMAL);

 

后记:

通过工具栏按钮的结构体,可以对每一个工具栏按钮进行设置,结构体如下:

typedefstruct_TBBUTTON {

    intiBitmap;

    intidCommand;

    BYTE fsState;

    BYTE fsStyle;

#ifdef _WIN64

    BYTEbReserved[6];          //padding for alignment

#elifdefined(_WIN32)

    BYTE bReserved[2];         // padding for alignment

#endif

    DWORD_PTR dwData;

    INT_PTR iString;

} TBBUTTON, NEAR* PTBBUTTON, *LPTBBUTTON;

 

idCommand与此按钮相关联的命令标识符,当fsStyle具有TBSTYLE_SEP属性时,该项必须为0

fsState: 按钮的状态标志。它可以是下面列出的值的一个组合:

 · TBSTATE_CHECKED 该按钮具有TBSTYLE_CHECKED风格并且被按下。

 · TBSTATE_ENABLED 按钮接收用户输入。一个不具有这个状态的按钮是不接收用户输入的,并且变灰。

 · TBSTATE_HIDDEN 按钮不可见,并且不能接收用户输入。

 · TBSTATE_INDETERMINATE 按钮是变灰的。

 · TBSTATE_PRESSED 按钮被按下。

 · TBSTATE_WRAP 按钮之后是一个分隔线。此按钮还必须具有TBSTATE_ENABLED状态。 

sStyle 按钮风格。它可以是下列值的一个组合:

 · TBSTYLE_BUTTON 创建一个标准的按钮。

 · TBSTYLE_CHECK 创建一个每次用户点击时可以在按下和弹起状态间切换的按钮。该按钮则处于按下状态时有一种不同的背景颜色。

 · TBSTYLE_CHECKGROUP 创建一个核选按钮,它被选择后一直处于按下状态,直到同组中的另一个按钮被按下时它才弹起。

 · TBSTYLE_GROUP 创建一个被选择后一直处于按下状态,直到同组中的另一个按钮被按下时它才弹起的按钮。

 · TBSTYLE_SEP 创建一个分隔线,为按钮组之间提供一个小的间距。具有这个风格的按钮是不接收用户输入的

CToolBar类的主要成员函数 

virtual 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

);

 

pParentWnd为工具栏父窗口的指针。

dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。

dwStyle为工具栏的风格,默认为WS_CHILD| WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部,各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。

nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。

转载请注明原文地址: https://www.6miu.com/read-46626.html

最新回复(0)