首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在工具栏控件中创建大小不同的按钮(Win32 API)

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

Stack Overflow用户
提问于 2020-02-18 07:59:38
回答 2查看 295关注 0票数 0

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

代码:

代码语言:javascript
运行
复制
//(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(m_hInstance, MAKEINTRESOURCE(IDB_TB_CONNECT_TO)),
    LoadBitmap(m_hInstance, MAKEINTRESOURCE(IDB_TB_CONNECT_TO_MASK))) == -1)
    return false;

if (ImageList_Add(hImageListSmall,
    LoadBitmap(m_hInstance, 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, m_hInstance, 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;
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 = 500;
SendMessage(m_hToolbar, TB_SETBUTTONINFO, (WPARAM)0, (LPARAM)& tbbi);

tbbi.cx = 32;
SendMessage(m_hToolbar, TB_SETBUTTONINFO, (WPARAM)1, (LPARAM)& tbbi);

tbbi.cx = 16;
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, m_hInstance, nullptr);

if (!m_hComboHosts)
    return false;

return true;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-18 08:36:58

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

注释这一行代码:

代码语言:javascript
运行
复制
SendMessage(m_hToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS);

TBSTYLE_EX_MIXEDBUTTONS

5.81版。此样式允许您为所有按钮设置文本,但仅用于那些具有BTNS_SHOWTEXT按钮样式的按钮。还必须设置TBSTYLE_LIST样式。通常,当按钮不显示文本时,应用程序必须处理TBN_GETINFOTIP或TTN_GETDISPINFO才能显示工具提示。使用TBSTYLE_EX_MIXEDBUTTONS扩展样式,设置但不显示在按钮上的文本将自动用作按钮的工具提示文本。如果您的应用程序在指定工具提示文本时需要更多的灵活性,它只需要处理TBN_GETINFOTIP或TTN_GETDISPINFO。

当您设置TBSTYLE_EX_MIXEDBUTTONS样式时,它将允许您为所有按钮设置文本。

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

如果要显示按钮文本,只需添加BTNS_SHOWTEXT样式即可。

修改后的代码:

代码语言:javascript
运行
复制
//(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;
票数 0
EN

Stack Overflow用户

发布于 2020-02-18 09:20:57

我使用第一个TB_SETBUTTONINFO消息来修改按钮的大小(分隔符)。要使其足够大以容纳comboBox控件:

代码语言:javascript
运行
复制
//(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);

这是创建ComboBox的代码:

代码语言:javascript
运行
复制
//(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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60276257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档