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

Dear ImGui如何创建同时带有图标和文字的按钮?

Dear ImGui 实现带图标+文字按钮的两种常用方案

ImGui 原生没有直接提供同时渲染图标和文字的按钮接口,但可以通过自定义组合逻辑快速实现,以下是两种落地性最高的方案:

方案1:使用字体图标拼接文字(最常用,适配性最强)

这种方案不需要额外处理图片资源,直接把图标字体和默认字体合并加载即可:

  • 首先将FontAwesome等图标字体和ImGui默认的字体合并加载,示例加载代码:
ImGuiIO& io = ImGui::GetIO();
// 加载默认字体
io.Fonts->AddFontFromFileTTF("Roboto-Regular.ttf", 16.0f);
// 合并加载FontAwesome图标字体,指定图标范围
static const ImWchar icons_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
ImFontConfig icons_config;
icons_config.MergeMode = true;
icons_config.PixelSnapH = true;
io.Fonts->AddFontFromFileTTF("fa-solid-900.ttf", 16.0f, &icons_config, icons_ranges);
  • 调用按钮接口时直接拼接图标宏和文字即可:
if (ImGui::Button(ICON_FA_COPY " 复制内容")) {
    // 按钮点击逻辑
}

注:需要提前引入FontAwesome对应的图标宏定义头文件,图标和文字之间可以加空格调整间距

方案2:图片+文字组合自定义按钮

如果需要使用自定义的图片图标,就可以手动组合控件实现:

// 先加载图标纹理,tex_id是你上传到GPU的纹理ID,icon_size是图标尺寸
ImTextureID tex_id = 你的图标纹理ID;
ImVec2 icon_size(20, 20);
// 计算按钮整体尺寸
ImVec2 button_size(icon_size.x + ImGui::CalcTextSize(" 保存").x + ImGui::GetStyle().FramePadding.x * 2, icon_size.y + ImGui::GetStyle().FramePadding.y * 2);

if (ImGui::InvisibleButton("custom_save_btn", button_size)) {
    // 按钮点击逻辑
}
// 按钮hover/激活状态绘制背景
if (ImGui::IsItemHovered() || ImGui::IsItemActive()) {
    ImU32 bg_col = ImGui::IsItemActive() ? ImGui::GetColorU32(ImGuiCol_ButtonActive) : ImGui::GetColorU32(ImGuiCol_ButtonHovered);
    ImGui::GetWindowDrawList()->AddRectFilled(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), bg_col, ImGui::GetStyle().FrameRounding);
}
// 绘制图标和文字
ImGui::SetCursorPos(ImVec2(ImGui::GetItemRectMin().x + ImGui::GetStyle().FramePadding.x, ImGui::GetItemRectMin().y + ImGui::GetStyle().FramePadding.y));
ImGui::Image(tex_id, icon_size);
ImGui::SameLine();
ImGui::Text(" 保存");

这个方案可以完全自定义图标、文字的间距和样式,适配特殊的设计需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:39:04