WIN32开发:如何让BM_SETIMAGE设置的按钮图标显示在文本右侧
Win32 按钮图标文本组合及间距调整解决方案
问题1:无需自绘实现图标在文本右侧的图文按钮
可以实现,仅需调整按钮样式并发送BM_SETIMAGE消息即可,操作步骤如下:
- 创建按钮时(或调用
SetWindowLongPtr修改已有按钮样式),添加以下必要样式:BS_ICON | BS_TEXT | BS_LEFTTEXTBS_ICON:指定按钮支持显示图标BS_TEXT:指定按钮保留文本显示(默认仅添加BS_ICON时会隐藏文本)BS_LEFTTEXT:将文本靠左对齐,图标自动排列到文本右侧
- 加载目标图标资源后,发送
BM_SETIMAGE消息绑定图标:
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_YOUR_ICON)); SendMessage(hBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
如果使用位图而非图标,将样式替换为BS_BITMAP,消息参数替换为IMAGE_BITMAP、HBITMAP类型即可。
问题2:无需添加空格调整图标与文本间距
可以通过按钮内置消息实现间距调整,不需要修改文本内容,有两种常用方案:
方案1:使用BCM_SETIMAGELIST指定间距(推荐,适用于开启视觉样式的场景)
ComCtl32 v6及以上版本支持通过BUTTON_IMAGELIST结构体的cxMargin字段直接指定图标与文本的像素间距,示例代码:
#include <commctrl.h> #pragma comment(lib, "comctl32.lib") // 先创建包含目标图标的ImageList,也可直接用单个图标创建 HIMAGELIST hImgList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 1); ImageList_AddIcon(hImgList, hYourIcon); BUTTON_IMAGELIST btnImgList = {0}; btnImgList.himl = hImgList; btnImgList.uAlign = BUTTON_IMAGELIST_ALIGN_RIGHT; // 图标对齐到右侧 btnImgList.cxMargin = 8; // 这里设置图标与文本的间距为8像素,可自行调整 SendMessage(hBtn, BCM_SETIMAGELIST, 0, (LPARAM)&btnImgList);
方案2:调整按钮内容边距
如果不需要修改图标绑定方式,可发送BCM_SETMARGIN消息调整按钮整体内容的左右边距,间接拉开图标与文本的间距:
// 左右边距设为4像素,上下边距设为2像素,可自行调整 DWORD margin = MAKELPARAM(4, 2); SendMessage(hBtn, BCM_SETMARGIN, 0, margin);
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

