Zuerst entfernen wir alle Widgets aus der vorherigen Lektion und erstellen ein minimales leeres Fenster ohne jegliche Steuerelemente darin.
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma execution_character_set("utf-8")
#include <GLFW/glfw3.h>
#include "imgui.h"
#include "backends/imgui_impl_glfw.h"
#include "backends/imgui_impl_opengl3.h"
#include <cstdio>
#include <string>
#include <fstream>
#include <windows.h>
#include <io.h>
#include <commdlg.h> // Benötigter Header für Dateidialoge
#include <iostream>
using namespace std;
// Schrift einrichten, um Zeichenfehler "??" zu beheben
// Füge hier einen Schriftpfad passend zu deinem Betriebssystem ein oder nutze den Standardschriftpfad
void SetupFont(ImGuiIO& io)
{
// Üblicher chinesischer Schriftpfad unter Windows
const char* font_path = "C:/Windows/Fonts/msyh.ttc"; // Microsoft YaHei
float font_size = 18.0f;
// Häufig genutzter Bereich vereinfachter chinesischer Zeichen laden
ImVector<ImWchar> ranges;
ImFontGlyphRangesBuilder builder;
builder.AddRanges(io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
builder.BuildRanges(&ranges);
// Benutzerdefinierte Schrift laden
io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, ranges.Data);
// Bei Bedarf weitere Schriftbereiche für Mehrsprachigkeit hinzufügen:
// io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, io.Fonts->GetGlyphRangesJapanese());
// io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, io.Fonts->GetGlyphRangesKorean());
}
int main()
{
if (!glfwInit())
{
printf("GLFW Initialisierung fehlgeschlagen\n");
return -1;
}
const char* glsl_version = "#version 330";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "Titel", nullptr, nullptr);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
ImGui::StyleColorsLight();
SetupFont(io); // Schrift laden um Textfehler zu beheben
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(io.DisplaySize);
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoSavedSettings;
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::Begin("Titel", nullptr, window_flags);
// Beginn des Widget-Zeichenbereichs
// Ende des Widget-Bereichs
ImGui::End();
ImGui::PopStyleVar(2);
ImGui::Render();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
glClearColor(0.12f, 0.12f, 0.12f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}Code-Sprache: C++ (cpp)

Jetzt erstellen wir die ImGui-Widgets nacheinander.
Text-Widget
ImGui::Text("Hallo Welt %d", 123);Code-Sprache: Klartext (plaintext)

Es rendert Text von links nach rechts beginnend an der oberen linken Ecke.
Schaltfläche
// Schaltfläche zeichnen; innerer Code wird bei Klick ausgeführt
if (ImGui::Button("Speichern"))
{
// Code hier wird nach dem Klick ausgeführt
}Code-Sprache: Klartext (plaintext)
Es gibt Dutzende verfügbare Widgets. Sehen wir uns unten den vollständigen Demo-Code an, der alle gängigen Widgets auf einmal rendert.
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma execution_character_set("utf-8")
#include <GLFW/glfw3.h>
#include "imgui.h"
#include "backends/imgui_impl_glfw.h"
#include "backends/imgui_impl_opengl3.h"
#include <cstdio>
#include <string>
#include <cstring>
#include <windows.h>
#include <io.h>
#include <iostream>
using namespace std;
// Schrift einrichten, um Zeichenfehler "??" zu beheben
// Füge hier einen Schriftpfad passend zu deinem Betriebssystem ein oder nutze den Standardschriftpfad
void SetupFont(ImGuiIO& io)
{
// Üblicher chinesischer Schriftpfad unter Windows
const char* font_path = "C:/Windows/Fonts/msyh.ttc"; // Microsoft YaHei
float font_size = 18.0f;
// Häufig genutzter Bereich vereinfachter chinesischer Zeichen laden
ImVector<ImWchar> ranges;
ImFontGlyphRangesBuilder builder;
builder.AddRanges(io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
builder.BuildRanges(&ranges);
// Benutzerdefinierte Schrift laden
io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, ranges.Data);
// Bei Bedarf weitere Schriftbereiche für Mehrsprachigkeit hinzufügen:
// io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, io.Fonts->GetGlyphRangesJapanese());
// io.Fonts->AddFontFromFileTTF(font_path, font_size, nullptr, io.Fonts->GetGlyphRangesKorean());
}
// ===================== Globale Variablen gebunden an Widgets =====================
char buf[256] = "Einzeiliger Eingabetesttext";
char bufMulti[1024] = "Mehrzeiliges Textfeld\nZeile 2\nZeile 3 Chinesischer Test";
float fVal = 0.5f;
int iVal = 50;
bool checkBox1 = false;
bool checkBox2 = true;
int radioIdx = 0;
int comboSel = 0;
ImVec4 color = ImVec4(0.2f, 0.7f, 0.9f, 1.0f);
bool showPopupWin = false;
bool showModal = false;
int tabIndex = 0;
float progress = 0.35f;
int main()
{
SetConsoleOutputCP(65001);
if (!glfwInit())
{
printf("GLFW Initialisierung fehlgeschlagen\n");
return -1;
}
const char* glsl_version = "#version 330";
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(1000, 700, "ImGui Demo aller gängigen Widgets", nullptr, nullptr);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
ImGui::StyleColorsLight();
SetupFont(io);
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(io.DisplaySize);
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
| ImGuiWindowFlags_NoMove
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoSavedSettings;
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::Begin("Hauptfenster", nullptr, window_flags);
// ========== 1. Oberste Menüleiste ==========
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Datei"))
{
if (ImGui::MenuItem("Neu", "Ctrl+N")) {}
if (ImGui::MenuItem("Speichern", "Ctrl+S")) {}
ImGui::Separator();
if (ImGui::MenuItem("Beenden"))
glfwSetWindowShouldClose(window, true);
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Werkzeuge"))
{
if (ImGui::MenuItem("Popup-Demo öffnen"))
showPopupWin = true;
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
ImGui::Spacing();
// ========== 2. Einfache Text-Widgets ==========
ImGui::Text("===== Text-Widgets =====");
ImGui::Text("Normaler Text Hallo Welt %d", 123);
ImGui::TextColored(ImVec4(1, 0, 0, 1), "Roter farbiger Text");
ImGui::TextDisabled("Grauer deaktivierter Text");
ImGui::BulletText("Aufzählungspunkt Text 1");
ImGui::BulletText("Aufzählungspunkt Text 2");
ImGui::Spacing();
// ========== 3. Schaltflächenfamilie ==========
ImGui::Text("===== Schaltflächen =====");
if (ImGui::Button("Normale Schaltfläche"))
cout << "Normale Schaltfläche geklickt" << endl;
ImGui::SameLine();
if (ImGui::SmallButton("Kleine Schaltfläche"))
cout << "Kleine Schaltfläche geklickt" << endl;
ImGui::SameLine();
if (ImGui::Button("Breite Schaltfläche", ImVec2(120, 0)))
cout << "Benutzerdefinierte breite Schaltfläche geklickt" << endl;
ImGui::Spacing();
// ========== 4. Eingabefelder ==========
ImGui::Text("===== Eingabewidgets =====");
ImGui::InputText("Einzeilige Eingabe", buf, IM_ARRAYSIZE(buf));
ImGui::InputTextWithHint("Eingabe mit Hinweis", "Inhalt hier eingeben...", buf, IM_ARRAYSIZE(buf));
ImGui::InputFloat("Gleitkommaeingabe", &fVal);
ImGui::InputInt("Ganzzahleingabe", &iVal);
ImGui::Spacing();
ImGui::Text("Mehrzeiliges Textfeld:");
ImVec2 multiSize = ImVec2(500, 80);
ImGui::InputTextMultiline("##multi", bufMulti, IM_ARRAYSIZE(bufMulti), multiSize);
ImGui::Spacing();
// ========== 5. Slider & Ziehbalken ==========
ImGui::Text("===== Slider / Ziehelemente =====");
ImGui::SliderFloat("Gleitkomma-Slider", &fVal, 0.0f, 1.0f);
ImGui::SliderInt("Ganzzahl-Slider", &iVal, 0, 100);
ImGui::DragFloat("Zieh-Gleitkomma", &fVal, 0.01f);
ImGui::DragInt("Zieh-Ganzzahl", &iVal, 1.0f);
ImGui::Spacing();
// ========== 6. Checkboxen & Radiobuttons ==========
ImGui::Text("===== Checkboxen & Radiobuttons =====");
ImGui::Checkbox("Checkbox A", &checkBox1);
ImGui::Checkbox("Checkbox B", &checkBox2);
ImGui::Text("Radiogruppe:");
ImGui::RadioButton("Option 1", &radioIdx, 0); ImGui::SameLine();
ImGui::RadioButton("Option 2", &radioIdx, 1); ImGui::SameLine();
ImGui::RadioButton("Option 3", &radioIdx, 2);
ImGui::Spacing();
// ========== 7. Combo-Dropdown ==========
ImGui::Text("===== Kombinations-Dropdown =====");
const char* items[] = { "Option A", "Option B", "Option C", "Option D" };
ImGui::Combo("Dropdown-Auswahl", &comboSel, items, IM_ARRAYSIZE(items));
ImGui::Spacing();
// ========== 8. Farbwähler ==========
ImGui::Text("===== Farbeditor =====");
ImGui::ColorEdit4("RGBA-Farbe", (float*)&color);
ImGui::ColorButton("Farbvorschau-Fläche", color);
ImGui::Spacing();
// ========== 9. Fortschrittsbalken & Trennlinien ==========
ImGui::Text("===== Fortschrittsbalken / Trenner =====");
ImGui::ProgressBar(progress, ImVec2(300, 0));
ImGui::Text("Fortschrittswert: %.2f", progress);
ImGui::Separator(); // Horizontale Trennlinie
ImGui::Spacing();
// ========== 10. Einklappbare Baumknoten ==========
ImGui::Text("===== Einklappbare Baum-Panels =====");
if (ImGui::CollapsingHeader("Einklappbares Panel – Klicken zum Ausklappen"))
{
ImGui::Text("Innerer Panelinhalt");
ImGui::Button("Panel-interne Schaltfläche");
}
if (ImGui::TreeNode("Baumknoten"))
{
ImGui::BulletText("Unterpunkt 1");
ImGui::BulletText("Unterpunkt 2");
ImGui::TreePop();
}
ImGui::Spacing();
// ========== 11. Tab-Leiste ==========
ImGui::Text("===== Tabs / TabBar =====");
ImGui::BeginTabBar("TabBar");
if (ImGui::BeginTabItem("Tab 1"))
{
ImGui::Text("Inhalt von Tab 1");
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem("Tab 2"))
{
ImGui::Text("Inhalt von Tab 2");
ImGui::EndTabItem();
}
ImGui::EndTabBar();
ImGui::Spacing();
// ========== 12. Tabellen-Widget ==========
ImGui::Text("===== Tabellen-Widget =====");
if (ImGui::BeginTable("table1", 3, ImGuiTableFlags_Borders))
{
ImGui::TableSetupColumn("ID");
ImGui::TableSetupColumn("Name");
ImGui::TableSetupColumn("Wert");
ImGui::TableHeadersRow();
// Zeile 1
ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::Text("1");
ImGui::TableNextColumn(); ImGui::Text("Test A");
ImGui::TableNextColumn(); ImGui::Text("%.2f", fVal);
// Zeile 2
ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::Text("2");
ImGui::TableNextColumn(); ImGui::Text("Test B");
ImGui::TableNextColumn(); ImGui::Text("%d", iVal);
ImGui::EndTable();
}
ImGui::Spacing();
// ========== 13. Rechtsklick-Kontextmenü ==========
ImGui::Text("===== Rechtsklick-Menü (Rechtsklick auf diesen Text) =====");
if (ImGui::IsItemClicked(ImGuiMouseButton_Right))
ImGui::OpenPopup("RightMenu");
if (ImGui::BeginPopup("RightMenu"))
{
ImGui::MenuItem("Kontexteintrag 1");
ImGui::MenuItem("Kontexteintrag 2");
ImGui::Separator();
ImGui::MenuItem("Menü schließen");
ImGui::EndPopup();
}
ImGui::Spacing();
// ========== 14. Nicht-modales Popup-Fenster ==========
if (showPopupWin)
{
ImGui::OpenPopup("PopupWindow");
showPopupWin = false;
}
if (ImGui::BeginPopup("PopupWindow"))
{
ImGui::Text("Nicht-modales Popup, Hauptfenster bleibt bedienbar");
if (ImGui::Button("Popup schließen"))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
// ========== 15. Modaler Dialog ==========
if (ImGui::Button("Modalen Dialog öffnen"))
showModal = true;
if (showModal)
{
ImGui::OpenPopup("ModalDialog");
showModal = false;
}
if (ImGui::BeginPopupModal("Modaler Dialog", nullptr, ImGuiWindowFlags_AlwaysAutoResize))
{
ImGui::Text("Der Modale sperrt das Hauptfenster; er muss zuerst geschlossen werden");
if (ImGui::Button("OK", ImVec2(120, 0)))
{
ImGui::CloseCurrentPopup();
}
ImGui::EndPopup();
}
ImGui::End();
ImGui::PopStyleVar(2);
ImGui::Render();
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
glClearColor(0.12f, 0.12f, 0.12f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}Code-Sprache: C++ (cpp)
Sie können langsam experimentieren und die Nutzung jedes Widgets erlernen.
Die Widget-Bibliothek ist sehr umfassend und erfüllt vollständig die Anforderungen der Entwicklung einfacher Hilfsprogramme. Sie enthält einklappbare Bäume, Tab-Seiten, alle Formularsteuerelemente: Ein-/Mehrzeilentextfelder, Radiobuttons, Checkboxen, Dropdown-Combos, Fortschrittsbalken, einklappbare Panels, Tabellen, Rechtsklick-Menüs, Farbwähler und vieles mehr. Testen Sie sie gerne selbst.

