You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WINAPI中如何为已创建的Button控件添加图标?

给Button控件设置位图的实现步骤

首先你得修改按钮的创建风格,加上BS_BITMAP——这个风格告诉系统按钮要显示位图。如果还要同时显示文字,搭配BS_LEFT/BS_RIGHT这类对齐风格就行,修改后的创建代码:

HWND button = CreateWindow("button", "test_text", WS_VISIBLE | WS_CHILD | BS_BITMAP, 0, 0, 500, 500, window, NULL, NULL, NULL);

接下来,你已经加载了位图,只需要给按钮发个消息把位图绑定上去就行,用SendMessage发送BM_SETIMAGE:

// 你的位图加载代码保留
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, TEXT("1.png"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

// 先检查位图有没有加载成功
if (hBitmap) {
    // 把位图设置到按钮上
    SendMessage(button, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
} else {
    // 加载失败的话可以查错误码排查
    DWORD err = GetLastError();
    // 比如用MessageBox弹窗提示,或者DebugView看错误信息
}

几个关键注意点

  • 要是想让文字和位图共存,除了BS_BITMAP,记得加BS_LEFT(文字在图右边)或者BS_RIGHT(文字在图左边),不然文字可能被位图盖住。
  • 你加载PNG时用的LR_CREATEDIBSECTION很关键,它能创建支持Alpha通道的DIB位图,不然带透明的PNG显示会有问题。
  • 最后别忘了清理资源,窗口销毁时要释放位图,避免内存泄漏:
    // 在窗口WM_DESTROY消息的处理里加这段
    HBITMAP oldBmp = (HBITMAP)SendMessage(button, BM_GETIMAGE, IMAGE_BITMAP, 0);
    if (oldBmp) DeleteObject(oldBmp);
    

内容的提问来源于stack exchange,提问作者Rarest Loki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:43:31