WINAPI中如何为已创建的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
相关产品推荐
相关产品推荐

