// gcc -Wall -Wextra -pedantic -Wno-unused-parameter -std=c11 kruzhochek.c -luser32 -lgdi32 -o kruzhochek.exe #define STRICT #define UNICODE #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x501 #include static void window_create(HWND hWnd) { HDC dc = GetDC(hWnd); // По-хорошему, после SelectObject нужно старые объекты бережно хранить и // восстанавливать, но окна собственный DC (CS_OWNDS), а приложение все // равно закрывается после закрытия окна, поэтому ничего никуда не утекает. HBRUSH brush = CreateSolidBrush(RGB(20, 80, 100)); SelectObject(dc, brush); HPEN pen = CreatePen(PS_SOLID, 8, RGB(200, 40, 40)); SelectObject(dc, pen); HFONT font = CreateFont(-100, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("Comic Sans MS")); SelectObject(dc, font); SetTextColor(dc, RGB(240, 240, 240)); SetBkMode(dc, TRANSPARENT); } static void window_paint(HWND hWnd) { RECT rect; GetClientRect(hWnd, &rect); // У клиентской областии left/top всегда нули const int width = rect.right; const int height = rect.bottom; const int radius = 200; const int center_x = width / 2; const int center_y = height / 2; PAINTSTRUCT ps; BeginPaint(hWnd, &ps); const HDC dc = ps.hdc; BeginPath(dc); Arc(dc, center_x - radius, center_y - radius, center_x + radius, center_y + radius, center_x, center_y, center_x, center_y); EndPath(dc); StrokeAndFillPath(dc); MoveToEx(dc, 0, 0, NULL); LineTo(dc, width, height); MoveToEx(dc, rect.right, 0, NULL); LineTo(dc, 0, height); DrawText(dc, TEXT("sup /pr/"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); EndPaint(hWnd, &ps); } // Дальше обычный бойлерплейт для винды. static LRESULT CALLBACK window_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: window_create(hWnd); return 0; case WM_PAINT: window_paint(hWnd); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc = { .style = CS_OWNDC | CS_SAVEBITS | CS_HREDRAW | CS_VREDRAW, .lpfnWndProc = window_proc, .hInstance = hInstance, .hIcon = LoadIcon(NULL, IDI_APPLICATION), .hCursor = LoadCursor(NULL, IDC_ARROW), .hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH), .lpszClassName = TEXT("gdi_graphics"), }; if (!RegisterClass(&wc)) { MessageBox(NULL, TEXT("RegisterClass() failed!"), TEXT("Error"), MB_ICONERROR); return 1; } HWND hWnd = CreateWindowEx(0, wc.lpszClassName, TEXT("GDI Graphics"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, hInstance, NULL); if (!hWnd) { MessageBox(NULL, TEXT("CreateWindowEx() failed!"), TEXT("Error"), MB_ICONERROR); return 2; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; // nExitCode от PostQuitMessage. }