C++ 如何在工具栏控件中创建不同大小的按钮(Win32 API)

C++ 如何在工具栏控件中创建不同大小的按钮(Win32 API),c++,winapi,C++,Winapi,我想在工具栏中插入不同大小的按钮。 比如说2个按钮。一个尺寸为32x16,另一个尺寸为16x16。 我使用了两个图像列表。每个图像列表都有自己的图像大小(第一个32x16-第二个16x16)。 但问题是,当我编译代码时,我得到了正确加载的图像,但按钮的宽度相同(32) 代码: 快速检查后,请修改以下代码: 注释这行代码: SendMessage(m_hToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS); TBSTY

我想在工具栏中插入不同大小的按钮。 比如说2个按钮。一个尺寸为32x16,另一个尺寸为16x16。 我使用了两个图像列表。每个图像列表都有自己的图像大小(第一个32x16-第二个16x16)。 但问题是,当我编译代码时,我得到了正确加载的图像,但按钮的宽度相同(32)

代码:


快速检查后,请修改以下代码:

注释这行代码:

SendMessage(m_hToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS);
TBSTYLE\u EX\u混合按钮

版本5.81。此样式允许您为所有按钮设置文本,但 仅对具有BTNS\U SHOWTEXT按钮样式的按钮显示该按钮。 还必须设置TBSTYLE_列表样式。通常,当按钮 不显示文本,应用程序必须处理TBN_GETINFOTIP或 TTN\u GETDISPINFO以显示工具提示。使用TBSTYLE_EX_Mixed按钮 扩展样式,设置但未显示在按钮上的文本将 自动用作按钮的工具提示文本。你的申请 仅需要处理TBN_GETINFOTIP或TTN_GETDISPINFO(如果需要) 更灵活地指定工具提示文本

当您设置
TBSTYLE\u EX\u MIXEDBUTTONS
style时,它将允许您为所有按钮设置文本

测试后,此样式将阻止您更改按钮的宽度

如果要显示按钮文本,只需添加
BTNS\u SHOWTEXT
样式

修改代码:

//(1) Create the Toolbar ImageList
    HIMAGELIST hImageListLarge = ImageList_Create(32, 16, ILC_COLOR8 | ILC_MASK, 1, 0);
    if (!hImageListLarge)
        return false;

    HIMAGELIST hImageListSmall = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 1, 0);
    if (!hImageListSmall)
        return false;

    //(2) Fill the Image List
    if (ImageList_Add(hImageListLarge,
        LoadBitmap(hInst, MAKEINTRESOURCE(IDB_TB_CONNECT_TO)),
        LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_TB_CONNECT_TO_MASK))) == -1)
        return false;

    if (ImageList_Add(hImageListSmall,
        LoadBitmap(hInst, MAKEINTRESOURCE(IDB_TB_HELP)),
        LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_TB_HELP_MASK))) == -1)
        return false;



    //(3) Create the Toolbar window
    m_hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, nullptr,
        WS_CHILD | TBSTYLE_WRAPABLE | TBSTYLE_AUTOSIZE | TBSTYLE_LIST | TBSTYLE_TOOLTIPS,
        0, 0, 0, 0, m_hWnd, nullptr, hInst, nullptr);

    if (m_hToolbar == nullptr)
        return false;

    //(4) Sets the Image list for the Toolbar
    SendMessage(m_hToolbar, CCM_SETVERSION, 5, 0);
    SendMessage(m_hToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageListLarge);
    SendMessage(m_hToolbar, TB_SETIMAGELIST, 1, (LPARAM)hImageListSmall);

    //(5) Initialize the TBBUTTON structures for each button


    m_tbButtons[0].fsStyle = BTNS_SEP;

    m_tbButtons[1].iBitmap = MAKELONG(0, 0);
    m_tbButtons[1].idCommand = ID_CONNECTIONS_CONNECT_TO;
    m_tbButtons[1].fsState = TBSTATE_ENABLED;
    m_tbButtons[1].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; // If you want display text, you can add BTNS_SHOWTEXT 
    m_tbButtons[1].iString = (INT_PTR)TEXT("Connect to");

    m_tbButtons[2].iBitmap = MAKELONG(0, 1);
    m_tbButtons[2].idCommand = ID_HELP_ABOUT;
    m_tbButtons[2].fsState = TBSTATE_ENABLED;
    m_tbButtons[2].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE;
    m_tbButtons[2].iString = (INT_PTR)TEXT("Help");


    //(6) Add buttons to the toolbar 
    SendMessage(m_hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(m_hToolbar, TB_ADDBUTTONS, 3, (LPARAM)m_tbButtons);

    //(7) auto Resize the toolbar
    SendMessage(m_hToolbar, TB_AUTOSIZE, 0, 0);
    //SendMessage(m_hToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS);
    ShowWindow(m_hToolbar, SW_SHOW);

    //(8) Modify the size of the separator that will hold the combobox
    TBBUTTONINFO tbbi;
    tbbi.cbSize = sizeof(tbbi);
    tbbi.dwMask = TBIF_SIZE | TBIF_BYINDEX;
    tbbi.cx = 44;
    SendMessage(m_hToolbar, TB_SETBUTTONINFO, (WPARAM)1, (LPARAM)& tbbi);

    tbbi.cx = 27;
    SendMessage(m_hToolbar, TB_SETBUTTONINFO, (WPARAM)2, (LPARAM)& tbbi);


    //(9) Get the Rectangle occupied by the separator
    RECT rcSep;
    SendMessage(m_hToolbar, TB_GETITEMRECT, (WPARAM)0, (LPARAM)& rcSep);

    //(10) Create the hosts comboBox
    m_hComboHosts = CreateWindow(WC_COMBOBOXW, nullptr, WS_CHILD | CBS_DROPDOWN | WS_VISIBLE,
        rcSep.left, rcSep.top, rcSep.right - rcSep.left, rcSep.bottom - rcSep.top, m_hToolbar,
        (HMENU)IDC_COMBO_HOSTS, hInst, nullptr);

    if (!m_hComboHosts)
        return false;

return true;

我使用第一条TB_SETBUTTONINFO消息修改按钮(分隔符)的大小。 要使其足够大以容纳comboBox控件,请执行以下操作:

//(8) Modify the size of the separator that will hold the combobox
TBBUTTONINFO tbbi;
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_SIZE | TBIF_BYINDEX;
tbbi.cx = 500;
SendMessage(m_hToolbar, TB_SETBUTTONINFO, (WPARAM)0, (LPARAM)& tbbi);
以下是创建组合框的代码:

//(9) Get the Rectangle occupied by the separator
RECT rcSep;
SendMessage(m_hToolbar, TB_GETITEMRECT, (WPARAM)0, (LPARAM)& rcSep);

//(10) Create the hosts comboBox
m_hComboHosts = CreateWindow(WC_COMBOBOXW, nullptr, WS_CHILD | CBS_DROPDOWN | WS_VISIBLE,
    rcSep.left, rcSep.top, rcSep.right - rcSep.left, rcSep.bottom - rcSep.top, m_hToolbar,
    (HMENU)IDC_COMBO_HOSTS, m_hInstance, nullptr);
这是预期的工作

但是当我尝试添加另外两个按钮(32x16-16x16)时,我总是得到与第一个Imagelist(32)相同的宽度

但是当我交换图像列表索引时,我得到(两个都是16)

我正在使用新的视觉样式ComCtl32.lib


这不是答案。它应该作为对您的问题的编辑发布。您没有设置第二个按钮的宽度。查看我的答案更新。@strive sun msft:我更新了问题中的代码,非常感谢。这对我有帮助。当我删除TBSTYLE_EX_MIXEDBUTTONS扩展样式时,按钮的宽度不同。但是工具提示没有显示!!我尝试使用microsoft文档中给出的解决方案,但这不起作用!!
//(9) Get the Rectangle occupied by the separator
RECT rcSep;
SendMessage(m_hToolbar, TB_GETITEMRECT, (WPARAM)0, (LPARAM)& rcSep);

//(10) Create the hosts comboBox
m_hComboHosts = CreateWindow(WC_COMBOBOXW, nullptr, WS_CHILD | CBS_DROPDOWN | WS_VISIBLE,
    rcSep.left, rcSep.top, rcSep.right - rcSep.left, rcSep.bottom - rcSep.top, m_hToolbar,
    (HMENU)IDC_COMBO_HOSTS, m_hInstance, nullptr);