工具栏的使用

来源:互联网 发布:大数据的前沿技术论文 编辑:程序博客网 时间:2024/05/09 13:44
工具栏的使用
工具栏的知识
-----------------写于2005年12月15日

1. 创建带有组合框的工具栏:
要创建带有控件的工具栏,就要自己CtoolBar类中派生出自己的类,然后实现代码,下面在工具栏中加入组合框,先从CtoolBar类中派生自己的类CstyleBar.
class CStyleBar : public CToolBar
{
public:
CComboBox   m_comboBox; //组合框控件
CFont       m_font;       //控件中的字体
};
在框加的头文件中声明一个CstyleBar m_wndStyleBar;
然后在框架创建的时候同时创建工具栏,在框架创建函数中OnCreate中加入;
static UINT styles[] =
{
// same order as in the bitmap 'styles.bmp'
ID_SEPARATOR,           // for combo box (placeholder)
ID_SEPARATOR,
ID_STYLE_LEFT,
ID_STYLE_CENTERED,
ID_STYLE_RIGHT,
ID_STYLE_JUSTIFIED,
};
if (!m_wndStyleBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_TOP|
     CBRS_TOOLTIPS|CBRS_FLYBY, IDW_STYLES) ||
!m_wndStyleBar.LoadBitmap(IDB_STYLES) ||        // IDB_STYLES是加载的位图
!m_wndStyleBar.SetButtons(styles, sizeof(styles)/sizeof(UINT)));
下面简单介绍CtooBar常用一些函数;
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );
PParentWnd:是工具栏的父窗口,dwStyle是样式,具体可以参见MSDN,nID是工具栏的ID号。如果创建成功返回非0。
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
为工具栏载入位图,为每个按钮添加上位图,如果位图的大小不是标准设置(16*15),调用SetSize函数来设置按钮和位图的大小。
BOOL SetButtons( const UINT* lpIDArray, int nIDCount );
LpIDArray:按扭ID的数组,可以是NULL来连接一个空的按扭
NIDCount:数组中的个数,如果数组中有ID_SEPARATOR值,就在相应的位置创建一个分隔线。这个函数调用的时候同时为每个按扭设置TBBS_BUTTON样式,每个分隔线设置TBBS_SEPARATOR样式,同时为每个按扭设置一个位图索引。
工具栏创建好之后,就可以来创建组合框了,先设置组合框的位置和大小,加入下面代码:
m_wndStyleBar.SetButtonInfo(0, IDW_COMBO, TBBS_SEPARATOR, 100);
m_wndStyleBar.SetButtonInfo(1, ID_SEPARATOR, TBBS_SEPARATOR, 12);
一个句是设置索引为0的按扭的ID为IDW_COMBO,第二句设置分隔线的宽度。
函数void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );
nIndex是按扭或分割线的索引。
NID;是按扭的ID号
Nstyle:按扭的样式
IImage:按扭的图片索引值,如果是分隔线的话就是分割宽度。
创建组合框:
CRect rect;//组合框的大小
    m_wndStyleBar.GetItemRect(0, &rect);//取得工具栏中第一个按扭的矩形
    rect.top = 3;
    rect.bottom = rect.top + 100;
    if (!m_wndStyleBar.m_comboBox.Create(
            CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP,
            rect, &m_wndStyleBar, IDW_COMBO))
    {
        TRACE0("Failed to create combo-box/n");
        return FALSE;
    }
CcomboBox的创建函数定义如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
创建好之后就可以向组合框中添加文本了:下面在资源中定义了一些字符串资源,加入到组合框中;
CString szStyle;
    if (szStyle.LoadString(IDS_LEFT))
        m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
    if (szStyle.LoadString(IDS_CENTERED))
        m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
    if (szStyle.LoadString(IDS_RIGHT))
        m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
    if (szStyle.LoadString(IDS_JUSTIFIED))
        m_wndStyleBar.m_comboBox.AddString((LPCTSTR)szStyle);
//下面是设置组合框中的字体
   
    if (!::GetSystemMetrics(SM_DBCSENABLED))
    {
        // Since design guide says toolbars are fixed height so is the font.
        logFont.lfHeight = -12;
        logFont.lfWeight = FW_BOLD;
        logFont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
        CString strDefaultFont;
        strDefaultFont.LoadString(IDS_DEFAULT_FONT);
        lstrcpy(logFont.lfFaceName, strDefaultFont);
        if (!m_wndStyleBar.m_font.CreateFontIndirect(&logFont))
            TRACE0("Could Not create font for combo/n");
        else
            m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
    }
    else
    {
        m_wndStyleBar.m_font.Attach(::GetStockObject(SYSTEM_FONT));
        m_wndStyleBar.m_comboBox.SetFont(&m_wndStyleBar.m_font);
    }
创建完工具栏之后就可以为工具栏按扭添加消息映射函数了:
ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
    ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
void CMainFrame::OnChangeStyle(UINT nID)
{
    m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
}
 
void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
{
    UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
    pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
}
可以通过菜单命令来显示隐藏工具栏
可以更该每行显示按扭的数目:
void CStyleBar::SetColumns(UINT nColumns)
{
    m_nColumns = nColumns;
    int nCount = GetToolBarCtrl().GetButtonCount();
 
    for (int i = 0; i < nCount; i++)
    {
        UINT nStyle = GetButtonStyle(i);
        BOOL bWrap = (((i + 1) % nColumns) == 0);
        if (bWrap)
            nStyle |= TBBS_WRAPPED;
        else
            nStyle &= ~TBBS_WRAPPED;
        SetButtonStyle(i, nStyle);
    }
 
    Invalidate();
    GetParentFrame()->RecalcLayout();
}
2. 创建自定义的工具栏
m_wndToolBar.SetButtons(NULL, 7);
m_wndToolBar.SetButtonInfo(0, ID_VIEW_LONG,TBBS_BUTTON, 10);
m_wndToolBar.SetButtonInfo(1, ID_SEPARATOR,TBBS_SEPARATOR, 6);
m_wndToolBar.SetButtonInfo(2, ID_FILE_OPEN,TBBS_BUTTON, 1);
m_wndToolBar.SetButtonInfo(3, ID_FILE_NEW,TBBS_BUTTON, 0);
m_wndToolBar.SetButtonInfo(4, ID_FILE_SAVE,TBBS_BUTTON, 2);
m_wndToolBar.SetButtonInfo(5, ID_SEPARATOR,TBBS_SEPARATOR, 6);
m_wndToolBar.SetButtonInfo(6, ID_APP_ABOUT,TBBS_BUTTON, 7);
m_wndToolBar.Invalidate();
3. 设置工具栏的标题;
m_wndToolBar.SetWindowText(_T("Palette"));
4.设置工具栏的停靠位置
    FloatControlBar(&m_wndToolBa, pt);
    Pt:屏幕坐标
5.允许工具栏停靠
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
6.停靠工具栏
    在框架中加入
    DockControlBar(&m_wndToolBar);
7.定义的一些按扭式样:
 #define TBSTYLE_BUTTON          0x0000
#define TBSTYLE_SEP             0x0001
#define TBSTYLE_CHECK           0x0002
#define TBSTYLE_GROUP           0x0004
#define TBSTYLE_CHECKGROUP      (TBSTYLE_GROUP | TBSTYLE_CHECK)
#if (_WIN32_IE >= 0x0300)
#define TBSTYLE_DROPDOWN        0x0008
#endif
#if (_WIN32_IE >= 0x0400)
#define TBSTYLE_AUTOSIZE        0x0010
#define TBSTYLE_NOPREFIX        0x0020 
#endif
 
#define TBSTYLE_TOOLTIPS        0x0100
#define TBSTYLE_WRAPABLE        0x0200
#define TBSTYLE_ALTDRAG         0x0400
#if (_WIN32_IE >= 0x0300)
#define TBSTYLE_FLAT            0x0800
#define TBSTYLE_LIST            0x1000
#define TBSTYLE_CUSTOMERASE     0x2000
#endif
#if (_WIN32_IE >= 0x0400)
#define TBSTYLE_REGISTERDROP    0x4000
#define TBSTYLE_TRANSPARENT     0x8000
#define TBSTYLE_EX_DRAWDDARROWS 0x00000001
#endif
8.创建扁平和把手的按扭
         因为扩展风格缺省指的就是TBSTYLE_FLAT,因此我要得到扁平按钮就只需要简单地将 AppWizard形成的代码中的Create()改为 CreateEx()即可。
BOOL CreateEx  (
  CWnd* pParentWnd,                          // parent window
  DWORD dwCtrlStyle = TBSTYLE_FLAT,         // extended style
  DWORD dwStyle =                            // style
    WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
  CRect rcBorders = CRect(0,0,0,0),       // border rectangle
  UINT nID = AFX_IDW_TOOLBAR                // identifier
  );
为了获得把手,我必须在调用SetBarStyle()函数时包含 CBRS_GRIPPER标志
9.文本标签
   通过SetButtonText()函数为每个按钮设置一个文本串来获得这种效果
for(int i = 0; i < m_wndToolBar.GetCount(); i++)
 {
 UINT id = m_wndToolBar.GetItemID(i);
 CString s;
 if(!s.LoadString(id)) continue;
 int j = s.Find(_T('/n'));
 if(j < 0) continue;
 s = s.Right(s.GetLength() - j - 1);
 m_wndToolBar.SetButtonText(i,s); 
}
// Adjust sizes to include text
CRect rect;
m_wndToolBar.GetItemRect(0,&rect);
 m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
10.下拉列表:
有时希望工具条包含一个可以在鼠标点击时显示选择列表或菜单的按钮。该功能现在可以通过扩展风格 TBSTYLE_DROPDOWN和TBSTYLE_EX_DRAWDDARROWS实现了:
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
i=m_wndToolBar.CommandToIndex(ID_FILE_NEW);
UINT id,style;
int image;
m_wndToolBar.GetButtonInfo(i,id,style,image);
m_wndToolBar.SetButtonInfo(i,ID_FILE_NEW,TBSTYLE_BUTTON | TBSTYLE_DROPDOWN,image); 
// Adjust sizes to include text CRect rect; 
m_wndToolBar.GetItemRect(0,&rect); 
m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
当用户点击下拉箭头时,工具条就发出TBN_DROPDOWN通知消息给工具条的父窗口。我可以通过重载OnNotify()函数或者通过在消息映射中加入一个ON_NOTIFY而获取这个消息。
ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnDropDown)
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct,LRESULT* result)
{
         NMTOOLBAR* pToolBar = (NMTOOLBAR*)pNotifyStruct;
         CWnd *pWnd;
         UINT nID;
         switch (pToolBar->iItem)
         {
         case ID_FILE_OPEN:
                  pWnd = &m_wndToolBar;
                  nID  = IDR_MAINFRAME;
                  break;
         default:
                  return;
         }
         //加载菜单显示
         CMenu Menu;
         Menu.LoadMenu(nID);
         CMenu* pMenu = Menu.GetSubMenu(0);
         CRect Rect;
         pWnd->SendMessage(TB_GETRECT, pToolBar->iItem, (LPARAM)&Rect);
         pWnd->ClientToScreen(&Rect);    
         pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
                 Rect.left, Rect.bottom, this, &Rect);
}
11.热点图象:
   就能注意到在平时每个按钮是平淡的颜色。而当鼠标触及到该按钮时,他会凸出来并且显现出鲜艳的颜色。这种视觉效果采用了工具条控件的被称作“热点图像”的功能,要激活热点图像功能,我必须通过SetHotImageList()函数提供第二个图像列表。
12.如何获得工具栏状态栏的指针:

CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )
 —> GetDescendantWindow(AFX_IDW_STUTUS_BAR)

CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )
 —> GetDescendantWindow(AFX_IDW_TOOLBAR)
13.工具栏停靠的一些定义:
标准工具条的停靠控制
CBRS_ALIGN_TOP 停靠在框架窗口客户区域顶部; 
CBRS_ALIGN_BOTTOM 停靠在框架窗口客户区域底部; 
CBRS_ALIGN_LEFT 停靠在框架窗口客户区域左边; 
CBRS_ALIGN_RIGHT 停靠在框架窗口客户区域右边; 
CBRS_ALIGN_ANY 停靠在框架窗口客户区域任何位置。
浮动工具条的停靠控制
AFX_IDW_DOCKBAR_TOP 停靠在框架窗口的顶部; 
AFX_IDW_DOCKBAR_BOTTOM 停靠在框架窗口的底部; 
AFX_IDW_DOCKBAR_LEFT 停靠在框架窗口的左边; 
AFX_IDW_DOCKBAR_RIGHT 停靠在框架窗口的右边


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=562371