// Compteur cliquable : clic = +1, Shift + clic = remise à zéro. // Compilation : cl.exe /EHsc compteur.cpp /link /SUBSYSTEM:WINDOWS #include int compteur = 0; HICON CreateCounterIcon() { HDC hdc = GetDC(NULL); HDC memDC = CreateCompatibleDC(hdc); HBITMAP color = CreateCompatibleBitmap(hdc, 32, 32); HBITMAP old = (HBITMAP)SelectObject(memDC, color); HBRUSH black = CreateSolidBrush(RGB(0, 0, 0)); RECT r = { 0, 0, 32, 32 }; FillRect(memDC, &r, black); DeleteObject(black); HFONT font = CreateFontW(29, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"Arial"); HFONT oldFont = (HFONT)SelectObject(memDC, font); SetBkMode(memDC, TRANSPARENT); SetTextColor(memDC, RGB(255, 255, 255)); DrawTextW(memDC, L"C", -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SelectObject(memDC, oldFont); DeleteObject(font); SelectObject(memDC, old); HBITMAP mask = CreateBitmap(32, 32, 1, 1, NULL); ICONINFO ii = {}; ii.fIcon = TRUE; ii.hbmMask = mask; ii.hbmColor = color; HICON icon = CreateIconIndirect(&ii); DeleteObject(mask); DeleteObject(color); DeleteDC(memDC); ReleaseDC(NULL, hdc); return icon; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_LBUTTONDOWN: if (wParam & MK_SHIFT) compteur = 0; else compteur++; InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); RECT rect; GetClientRect(hwnd, &rect); HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0)); FillRect(hdc, &rect, blackBrush); DeleteObject(blackBrush); HFONT font = CreateFontW(48, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial"); HFONT oldFont = (HFONT)SelectObject(hdc, font); wchar_t texte[32]; wsprintfW(texte, L"%d", compteur); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(255, 255, 255)); DrawTextW(hdc, texte, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); SelectObject(hdc, oldFont); DeleteObject(font); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProcW(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { const wchar_t CLASS_NAME[] = L"CompteurWin32"; HICON icon = CreateCounterIcon(); WNDCLASSW wc = {}; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; wc.hCursor = LoadCursorW(NULL, IDC_ARROW); wc.hIcon = icon; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); RegisterClassW(&wc); HWND hwnd = CreateWindowExW(0, CLASS_NAME, L"Compteur", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 40, 80, NULL, NULL, hInstance, NULL); if (!hwnd) return 0; SendMessageW(hwnd, WM_SETICON, ICON_BIG, (LPARAM)icon); SendMessageW(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)icon); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg = {}; while (GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); } DestroyIcon(icon); return 0; }