用ctoolbarctrl动态创建了一个toolbar,发现各个button的大小都是同时变化的,我现在要求有一个button比其它button宽一点。找了很多资料好像都没有。于是我试图再创建一个toolbar,紧跟着第一个toolbar(在同一水平线上),结果是第二个toolbar上的button不响应click事件,看起来好像是被第一个toolbar档住了(如果不在水平线上,就可以正确的响应click事件)
哪位可以告诉我怎么样才能在toolbar上实现不等宽的button,或者是如果解决我那个不响应click事件的问题也行。

解决方案 »

  1.   

    TBBUTTON btn; 
    memset(&btn, 0, sizeof(TBBUTTON));
    btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
    然后调用CToolBarCtrl::AddButtons选择了TBSTYLE_AUTOSIZE,button的宽度就和文本长度自适应
      

  2.   

    改变一个按钮的宽度:TBBUTTONINFO tbbi = { sizeof (TBBUTTONINFO) };
    tbbi.dwMask = TBIF_BYINDEX | TBIF_SIZE;
    tbbi.cx = 100;再调用
    m_wndToolBar.SendMessage(TB_SETBUTTONINFO, 1, (LPARAM)&tbbi); // MFC或者
    // SendMessage(hwndToolBar, TB_SETBUTTONINFO, 1, (LPARAM)&tbbi); // SDK
      

  3.   

    不过要注意,TBIF_BYINDEX 标志在 5.80 版本之后的通用控件库才支持,如果你要在之前的版本上工作的话,要在发送消息时把 wParam 指定为按钮的 ID,而不是上例中的索引。
      

  4.   

    没错,MSDN上也是这么说的,我也是这么做的,但是好像没有用,还用,那些button改一个就全改了,我的代码可以让大家看一下。
    BOOL CVisualStylesDlg::CreateToolBar()
    {
    BOOL bReturn = FALSE; //Get the postion we'll put the toolbar
    CRect rtPosition;
    CWnd* pWnd = this->GetDlgItem(IDC_STATIC_POS);
    pWnd->GetWindowRect(&rtPosition);
    this->ScreenToClient(rtPosition); m_pToolBar = new CToolBarCtrl();
    ASSERT(m_pToolBar);
    if(m_pToolBar)

    bReturn = m_pToolBar->Create(WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN | CCS_NODIVIDER|TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_CUSTOMERASE, rtPosition, this, IDR_TOOLBAR1);
    if(!bReturn)
    return bReturn;
    m_pToolBar->AddBitmap(3, IDR_TOOLBAR1); //add button definitions
    m_pTbButton = new TBBUTTON[3];
    ASSERT(m_pTbButton);
    m_pTbButton[0].dwData = NULL;
    m_pTbButton[0].fsState = TBSTATE_ENABLED;
    m_pTbButton[0].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE ;
    m_pTbButton[0].iBitmap = 0;
    m_pTbButton[0].idCommand = ID_SELECTFILE_BACK;
    m_pTbButton[0].iString = -1; m_pTbButton[1].dwData = NULL;
    m_pTbButton[1].fsState = TBSTATE_ENABLED;
    m_pTbButton[1].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE ;
    m_pTbButton[1].iBitmap = 1;
    m_pTbButton[1].idCommand = ID_SELECTFILE_UP;
    m_pTbButton[1].iString = -1; m_pTbButton[2].dwData = NULL;
    m_pTbButton[2].fsState = TBSTATE_ENABLED;
    m_pTbButton[2].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE ;
    m_pTbButton[2].iBitmap = 2;
    m_pTbButton[2].idCommand = ID_SELECTFILE_SWITCHVIEW ;
    m_pTbButton[2].iString = -1;
    bReturn = m_pToolBar->AddButtons(3, m_pTbButton);
    if(!bReturn)
    return bReturn;
    }
    return bReturn;
    }
      

  5.   

    我想做一个类似标准OpenFileDialog里的右上角的back/up/new folder/switch view...那样一个东西,那实际上就一个toolbar,你会看到switchview那个button比前面的几个button长一点。真不知道怎么弄的。
      

  6.   

    我刚才试过的,是起作用的。我的测试过程如下:
    1、使用 AppWizard 创建一个 MDI 工程。
    2、在 CMainFrame::OnCreate() 函数的末尾添加我上述的代码。
    3、编译运行。可以看到第二个按钮变宽的效果的。
      

  7.   

    你再把下列代码添加到 CMainFrame::OnCreate() 函数的末尾试试看:m_wndToolBar.SendMessage(TB_GETBUTTONINFO, 1, (LPARAM)&tbbi);
    tbbi.dwMask = TBIF_BYINDEX | TBIF_STYLE;
    tbbi.fsStyle |= BTNS_WHOLEDROPDOWN;
    m_wndToolBar.SendMessage(TB_SETBUTTONINFO, 1, (LPARAM)&tbbi);
      

  8.   

    曾经有人问过此问题:
    //添加一按钮
    TBBUTTON btn; 
    memset(&btn, 0, sizeof(TBBUTTON));
    btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;
    btn.iString = 10;
    btn.idCommand = ID_FILE_SAVE;
    btn.iBitmap = 2;
    CToolBarCtrl &o = m_wndToolBar.GetToolBarCtrl();
    o.AddButtons( 1, &btn );//修改ID_FILE_NEW按钮宽度
    TBBUTTONINFO info;
    memset(&info, 0, sizeof(TBBUTTONINFO));
    info.cbSize = sizeof(TBBUTTONINFO);
    info.dwMask = TBIF_SIZE;
    info.cx = 40;
    o.SetButtonInfo(ID_FILE_NEW,&info);
      

  9.   

    bReturn = m_pToolBar->Create(WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN |TBSTYLE_LIST 
    | CCS_NODIVIDER|TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | TBSTYLE_CUSTOMERASE, rtPosition, this, IDR_TOOLBAR1);
    ....... m_pTbButton[1].dwData = NULL;
    m_pTbButton[1].fsState = TBSTATE_ENABLED;
    m_pTbButton[1].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE ;
    m_pTbButton[1].iBitmap = 1;
    m_pTbButton[1].idCommand = 0;//ID_SELECTFILE_UP;
    char buf[]="YoungW";
    m_pTbButton[1].iString =(INT_PTR)buf;
      

  10.   

    CREATE的时候 添加 TBSTYLE_LIST属性然后给按钮加文字
      

  11.   

    加字确实可以让button自动变大,问题是我不想加字,而且button上面的图像不是一样大的,
    前面二个是16*16的,后来一个是16*24的。不知道如何解决。其实不用不等的位图也行,只要那图后面加个小箭头,我知道按钮有那样的风格,但那种风格中间是有条线的,我是希望有个小箭头,但是那个button还是一个整体。
    真的谢谢各位了。
      

  12.   

    m_pTbButton[2].fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE |BTNS_WHOLEDROPDOWN  ;加个BTNS_WHOLEDROPDOWN  属性就可以了
      

  13.   

    刚才忙了点别的事。
    不过我已经试过了,正是吾所想要的,呵呵。多谢了。
    不过那个button不响应click,找原因中....
      

  14.   

    when any part of the button is clicked, the toolbar control will send a TBN_DROPDOWN notification
      

  15.   

    BTNS_WHOLEDROPDOWN 
    Version 5.80. Specifies that the button will have a drop-down arrow, but not as a separate section. Buttons with this style behave the same, regardless of whether the TBSTYLE_EX_DRAWDDARROWS extended style is set.It's strange.
      

  16.   

    没什么奇怪的,那种分成两个的带下拉键头的按钮,除了要为按钮本身设置相应的属性之外,还需要对工具栏窗口自己设置 MSDN 上说的扩展风格。而你需要的这种风格则不需要对工具栏有额外要求。之所以你所引用的 MSDN 的文档上特意指出这一点,乃是因为那种分离式的下拉按钮出现在整体式的下拉按钮之前。
      

  17.   

    多谢指点,不过我还是不明白为什么我click那个button的时候它不响应。MSDN上有说
    If the main part of the button is clicked, the toolbar control sends a WM_COMMAND message with the button's ID. The application normally responds by launching the first command on the menu。难道我屐得去处理TBN_DROPDOWN吗?
      

  18.   

    你说得没错,是要处理 TBN_DROPDOWN。以我上面的例子接着示例:1、为 CMainFrame 添加 OnNotify() 消息处理函数(该函数为虚函数)。
    2、向其中插入如下代码:
    LPNMHDR pnmh = (LPNMHDR)lParam;
    if(pnmh->code == TBN_DROPDOWN)
    {
    RECT rc;
    int iIndex = ::SendMessage(pnmh->hwndFrom, TB_COMMANDTOINDEX, ID_FILE_OPEN, 0);
    ::SendMessage(pnmh->hwndFrom, TB_GETITEMRECT, iIndex, (LPARAM)&rc);
    ::MapWindowPoints(pnmh->hwndFrom, HWND_DESKTOP, (LPPOINT)&rc, 2);
    CMenu* pMenu = GetSystemMenu(FALSE);
    pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom, this);
    *pResult = TBDDRET_DEFAULT;
    return TRUE;
    }
    3、编译运行。可以看到,在点击工具栏上的打开文件按钮时,会把窗口的系统菜单显示出来。
      

  19.   

    感谢各位热心的帮助,特别是dandycheung(珠穆朗玛)兄不厌其烦的解释,还把代码都放上来,小弟感激不尽啊。
    好了,终于圆满的完成了我的东西,现在结贴给分。
      

  20.   

    改变button宽度
    nIndex = CommandToIndex(ID_PLACEHOLDER_ZOOM);
    SetButtonInfo(nIndex, ID_PLACEHOLDER_ZOOM, TBBS_SEPARATOR, 100);