#define UNICODE
#define _UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <commctrl.h>
// Enable visual styles (modern UI look instead of Windows 98 look) for MSVC compilers
#if defined(_MSC_VER)
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#pragma comment(lib, "comctl32.lib")
#endif
// Global font handles
HFONT hFontRegular = NULL;
HFONT hFontItalic = NULL;
// Callback to apply the default font to all child controls easily
BOOL CALLBACK SetFontEnumProc(HWND hwnd, LPARAM lParam) {
SendMessage(hwnd, WM_SETFONT, (WPARAM)lParam, TRUE);
return TRUE;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE: {
HINSTANCE hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
// Create fonts (Segoe UI is the standard modern Windows font)
hFontRegular = CreateFontW(-15, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Segoe UI");
hFontItalic = CreateFontW(-15, 0, 0, 0, FW_NORMAL, TRUE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Segoe UI");
// --- LEFT COLUMN ---
CreateWindowExW(0, L"STATIC", L"Some Text",
WS_CHILD | WS_VISIBLE | SS_LEFT,
20, 20, 200, 20, hwnd, NULL, hInstance, NULL);
HWND hCheck = CreateWindowExW(0, L"BUTTON", L"is this GUI epic?",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
20, 50, 200, 20, hwnd, NULL, hInstance, NULL);
SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0); // Checked by default
CreateWindowExW(0, L"STATIC", L"How much epic is it?",
WS_CHILD | WS_VISIBLE | SS_LEFT,
20, 85, 200, 20, hwnd, NULL, hInstance, NULL);
HWND hRadio1 = CreateWindowExW(0, L"BUTTON", L"a little",
WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
20, 110, 200, 20, hwnd, NULL, hInstance, NULL);
SendMessage(hRadio1, BM_SETCHECK, BST_CHECKED, 0); // Selected by default
CreateWindowExW(0, L"BUTTON", L"very",
WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
20, 135, 200, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(0, L"BUTTON", L"a lot",
WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
20, 160, 200, 20, hwnd, NULL, hInstance, NULL);
// Split label to support inline italics for *much*
CreateWindowExW(0, L"STATIC", L"How",
WS_CHILD | WS_VISIBLE | SS_LEFT,
20, 200, 32, 20, hwnd, NULL, hInstance, NULL);
HWND hItalicWord = CreateWindowExW(0, L"STATIC", L"much",
WS_CHILD | WS_VISIBLE | SS_LEFT,
52, 200, 40, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(0, L"STATIC", L"epic is it?",
WS_CHILD | WS_VISIBLE | SS_LEFT,
92, 200, 100, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(0, L"STATIC", L"Between\n5 and 10",
WS_CHILD | WS_VISIBLE | SS_LEFT,
20, 230, 60, 40, hwnd, NULL, hInstance, NULL);
// Slider (Trackbar)
HWND hSlider = CreateWindowExW(0, TRACKBAR_CLASSW, L"",
WS_CHILD | WS_VISIBLE | TBS_HORZ | WS_TABSTOP,
80, 235, 200, 30, hwnd, NULL, hInstance, NULL);
// Values mapped as integers (50 to 100 represents 5.0 to 10.0)
SendMessage(hSlider, TBM_SETRANGE, TRUE, MAKELONG(50, 100));
SendMessage(hSlider, TBM_SETPOS, TRUE, 67);
CreateWindowExW(0, L"STATIC", L"6.7",
WS_CHILD | WS_VISIBLE | SS_LEFT,
290, 235, 30, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(0, L"BUTTON", L"calculate epicness",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
150, 350, 150, 35, hwnd, NULL, hInstance, NULL);
// --- RIGHT COLUMN ---
CreateWindowExW(0, L"STATIC", L"Little textbox",
WS_CHILD | WS_VISIBLE | SS_LEFT,
400, 20, 200, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", L"Foo",
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
400, 45, 200, 25, hwnd, NULL, hInstance, NULL);
CreateWindowExW(0, L"STATIC", L"BIG Text box",
WS_CHILD | WS_VISIBLE | SS_LEFT,
400, 85, 200, 20, hwnd, NULL, hInstance, NULL);
CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", L"",
WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_WANTRETURN | WS_TABSTOP,
400, 110, 350, 275, hwnd, NULL, hInstance, NULL);
// Apply regular font to ALL controls
EnumChildWindows(hwnd, SetFontEnumProc, (LPARAM)hFontRegular);
// Override the one word with the italic font
SendMessage(hItalicWord, WM_SETFONT, (WPARAM)hFontItalic, TRUE);
return 0;
}
// Make static controls have transparent backgrounds to blend with window perfectly
case WM_CTLCOLORSTATIC: {
HDC hdcStatic = (HDC)wParam;
SetBkMode(hdcStatic, TRANSPARENT);
return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
case WM_DESTROY: {
if (hFontRegular) DeleteObject(hFontRegular);
if (hFontItalic) DeleteObject(hFontItalic);
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// Required to use the Trackbar (Slider) class
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_WIN95_CLASSES | ICC_BAR_CLASSES;
InitCommonControlsEx(&icex);
const wchar_t CLASS_NAME[] = L"EpicGuiClass";
WNDCLASSW wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); // Standard gray window background
RegisterClassW(&wc);
HWND hwnd = CreateWindowExW(
0,
CLASS_NAME,
L"My epic GUI",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 450,
NULL, NULL, hInstance, NULL
);
if (hwnd == NULL) {
return 0;
}
ShowWindow(hwnd, nCmdShow);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
// IsDialogMessage allows using TAB to switch between textboxes/buttons
if (!IsDialogMessage(hwnd, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}