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

C++ 如何在文本按钮上放置图标?,c++,winapi,C++,Winapi,我希望在同一个按钮上同时有一个图像图标和一个文本,比如在Word中 我在按钮上设置了一个图标,但文本消失了 HANDLE hBmp = (HBITMAP)LoadImage(g_hDllInstance, MAKEINTRESOURCE(IDB_BITMAP4), IMAGE_BITMAP, NULL, NULL, LR_DEFAULTCOLOR); HWND hwndButton = CreateWindowEx( NULL, _T("

我希望在同一个按钮上同时有一个图像图标和一个文本,比如在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);

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

有关如何使按钮同时显示图像和文本的说明在参考1中概述:

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

BS_图标或BS_位图设置?|BM_SETIMAGE称为结果
--------------------------+---------------------+--------------------  
是|是|仅显示图标。
否|是|显示图标和文本。
是|否|仅显示文本。
否|否|仅显示文本
换句话说:不要设置
BS_图标
BS_位图
样式(但要设置
BS_文本
样式),并在创建按钮后发送
BM_SETIMAGE
消息

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

  • 启用视觉样式。通过将
    #pragma
    链接器指令放入唯一的编译单元,最容易实现这一点:

    \pragma注释(链接器,“\”/manifestdependency:type='win32'\
    name='Microsoft.Windows.Common控件'version='6.0.0.0'\
    processorArchitecture='*'publicKeyToken='6595b64144ccf1df'语言='*'\“”)
    
  • 在主窗口的
    WM\u Create
    处理程序中创建按钮:

    case WM\u创建:
    {
    HWND btn{::CreateWindowExW(0x0,L“按钮”,L“按钮文本”,
    WS|u可见| WS|u儿童| BS|u文本,
    10,10,200,50,hWnd,(汉努)110,
    nullptr,nullptr)};
    HICON图标{(HICON)::LoadImageW(::GetModuleHandle(nullptr),
    MAKEINTRESOURCEW(107),
    图像_图标,32,32,0x0)};
    ::SendMessageW(btn、BM_设置图像、图像图标、(LPRAM)图标);
    }
    打破
    
    确保根据需要调整数值常量
    110
    是按钮的控制标识符,
    107
    是向导生成的应用程序图标资源的资源ID,
    32
    是请求的图标的宽度和高度

此代码生成以下输出:



1请注意,您必须这样做。

可能重复@MichaelWalz:不幸的是,重复问题的答案没有找到最直接的解决方案,并且实际上没有包含太多有用的信息。将另一个问答链接复制到这个链接可能会更有帮助。@IInspectable你是对的,cv收回了。并对你的答案投了赞成票。@I不可检测的可能更好的做法是在那里添加答案,并将其作为复制品关闭。答案的质量并不重要。重要的是如果这是同一个问题。如果是这样,那就是一个骗局。但为时已晚。我关闭了另一个副本。@David:如果副本没有被接受的答案,我会考虑这样做,从而导致一种情况,访问者必须滚动经过被接受的答案才能找到更好的答案。这并没有使找到解决方案变得更容易。我已经尝试过了,我正在从我的按钮样式中删除BS_位图,但在这种情况下,如果我发送BM_设置图像,图标将不显示message@RandomUser:您的目标是什么操作系统?是否启用了视觉样式?创建按钮时是否指定了
BS_TEXT
样式?我在windows 10上。我已经发布了代码。我刚刚用过。没有help@RandomUser:我已验证此功能在Windows 10上正常工作。但是,您必须启用视觉样式,这应该是任何应用程序的默认设置。除非你想让你的用户界面看起来像Windows 3。@zett42:这个问答是关于生成一个同时显示文本和图像的按钮。图像加载和图像大小与问题或答案无关。所需要的只是任意大小的任意图像。这就是代码的作用。如果您想应用解决方案,请随意选择您喜欢的方法来构建图像。