如何在文本按钮上放置图标?

Dav*_*itS 2 c++ winapi

我希望在同一个按钮上同时显示图像图标和文本,例如Word中的文字图标.

在此输入图像描述

我在按钮上设置了一个图标,但文本消失了.

HANDLE hBmp = (HBITMAP)LoadImage(g_hDllInstance,
    MAKEINTRESOURCE(IDB_BITMAP4),
    IMAGE_BITMAP,
    NULL,
    NULL,
    LR_DEFAULTCOLOR);
HWND hwndButton = CreateWindowEx(
    NULL,
    _T("BUTTON"),
    _T("SOME TEXT"),
    BS_BITMAP | WS_VISIBLE | WS_CHILD,
    point.x - 47,
    point.y - 3,
    36,
    40,
    hWnd,
    (HMENU)200,
    NULL,
    NULL);
SendMessage(
    (HWND)hwndButton,
    (UINT)BM_SETIMAGE,
    (WPARAM)IMAGE_BITMAP,
    (LPARAM)hBmp);
Run Code Online (Sandbox Code Playgroud)

我还尝试在我的按钮上的较小子窗口上设置图标,但由于某种原因,我的子窗口不可见.

IIn*_*ble 6

按钮样式参考1中概述了如何获取按钮以显示图像和文本的说明:

按钮控件上的文本或图标或两者的外观取决于BS_ICON和BS_BITMAP样式,以及是否发送BM_SETIMAGE消息.可能的结果如下.

BS_ICON or BS_BITMAP set? | BM_SETIMAGE called? | Result  
--------------------------+---------------------+--------------------  
Yes                       | Yes                 | Show icon only.  
No                        | Yes                 | Show icon and text.  
Yes                       | No                  | Show text only.  
No                        | No                  | Show text only
Run Code Online (Sandbox Code Playgroud)

换句话说:不要设置BS_ICONBS_BITMAP样式(但设置BS_TEXT样式),并BM_SETIMAGE在创建按钮后发送消息.

若要查看此操作,请在Visual Studio中创建标准Windows桌面应用程序,并应用以下更改:

  • 启用视觉样式.通过将#pragma链接器指令放入唯一的编译单元,这是最简单的方法:

    #pragma comment(linker,"\"/manifestdependency:type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    
    Run Code Online (Sandbox Code Playgroud)
  • 在主窗口的WM_CREATE处理程序中创建按钮:

    case WM_CREATE:
        {
            HWND btn{ ::CreateWindowExW(0x0, L"BUTTON", L"Button text",
                                        WS_VISIBLE | WS_CHILD | BS_TEXT,
                                        10, 10, 200, 50, hWnd, (HMENU)110,
                                        nullptr, nullptr) };
            HICON icon{ (HICON)::LoadImageW(::GetModuleHandle(nullptr),
                                            MAKEINTRESOURCEW(107),
                                            IMAGE_ICON, 32, 32, 0x0) };
            ::SendMessageW(btn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icon);
        }
        break;
    
    Run Code Online (Sandbox Code Playgroud)

    确保根据需要调整数字常量.110是按钮的控件标识符,107是向导生成的应用程序图标资源的资源ID ,是32所请求图标的宽度和高度.

此代码生成以下输出:

图像按钮


1 请注意,您必须启用视觉样式才能使其正常工作.

  • @ zett42:这个Q&A是关于生成一个显示文本和图像的按钮.图像加载和图像大小与问题或答案无关.所需要的只是任意大小的任意图像.这就是代码的作用.如果您想应用解决方案,请随意选择构建图像的首选方式. (2认同)