ccounter.cpp
  1. // Compteur cliquable : clic = +1, Shift + clic = remise Γ  zΓ©ro.
  2. // Compilation : cl.exe /EHsc compteur.cpp /link /SUBSYSTEM:WINDOWS
  3.  
  4. #include <windows.h>
  5.  
  6. int compteur = 0;
  7.  
  8. HICON CreateCounterIcon()
  9. {
  10. HDC hdc = GetDC(NULL);
  11. HDC memDC = CreateCompatibleDC(hdc);
  12. HBITMAP color = CreateCompatibleBitmap(hdc, 32, 32);
  13. HBITMAP old = (HBITMAP)SelectObject(memDC, color);
  14.  
  15. HBRUSH black = CreateSolidBrush(RGB(0, 0, 0));
  16. RECT r = { 0, 0, 32, 32 };
  17. FillRect(memDC, &r, black);
  18. DeleteObject(black);
  19.  
  20. 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");
  21. HFONT oldFont = (HFONT)SelectObject(memDC, font);
  22.  
  23. SetBkMode(memDC, TRANSPARENT);
  24. SetTextColor(memDC, RGB(255, 255, 255));
  25. DrawTextW(memDC, L"C", -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  26.  
  27. SelectObject(memDC, oldFont);
  28. DeleteObject(font);
  29. SelectObject(memDC, old);
  30.  
  31. HBITMAP mask = CreateBitmap(32, 32, 1, 1, NULL);
  32.  
  33. ICONINFO ii = {};
  34. ii.fIcon = TRUE;
  35. ii.hbmMask = mask;
  36. ii.hbmColor = color;
  37.  
  38. HICON icon = CreateIconIndirect(&ii);
  39.  
  40. DeleteObject(mask);
  41. DeleteObject(color);
  42. DeleteDC(memDC);
  43. ReleaseDC(NULL, hdc);
  44.  
  45. return icon;
  46. }
  47.  
  48. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  49. {
  50. switch (uMsg)
  51. {
  52. case WM_LBUTTONDOWN:
  53. if (wParam & MK_SHIFT) compteur = 0; else compteur++;
  54. InvalidateRect(hwnd, NULL, TRUE);
  55. return 0;
  56.  
  57. case WM_PAINT:
  58. {
  59. PAINTSTRUCT ps;
  60. HDC hdc = BeginPaint(hwnd, &ps);
  61. RECT rect;
  62. GetClientRect(hwnd, &rect);
  63.  
  64. HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0));
  65. FillRect(hdc, &rect, blackBrush);
  66. DeleteObject(blackBrush);
  67.  
  68. 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");
  69. HFONT oldFont = (HFONT)SelectObject(hdc, font);
  70.  
  71. wchar_t texte[32];
  72. wsprintfW(texte, L"%d", compteur);
  73.  
  74. SetBkMode(hdc, TRANSPARENT);
  75. SetTextColor(hdc, RGB(255, 255, 255));
  76. DrawTextW(hdc, texte, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  77.  
  78. SelectObject(hdc, oldFont);
  79. DeleteObject(font);
  80. EndPaint(hwnd, &ps);
  81. return 0;
  82. }
  83.  
  84. case WM_DESTROY:
  85. PostQuitMessage(0);
  86. return 0;
  87. }
  88.  
  89. return DefWindowProcW(hwnd, uMsg, wParam, lParam);
  90. }
  91.  
  92. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
  93. {
  94. const wchar_t CLASS_NAME[] = L"CompteurWin32";
  95. HICON icon = CreateCounterIcon();
  96.  
  97. WNDCLASSW wc = {};
  98. wc.lpfnWndProc = WindowProc;
  99. wc.hInstance = hInstance;
  100. wc.lpszClassName = CLASS_NAME;
  101. wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
  102. wc.hIcon = icon;
  103. wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  104.  
  105. RegisterClassW(&wc);
  106.  
  107. HWND hwnd = CreateWindowExW(0, CLASS_NAME, L"Compteur", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 40, 80, NULL, NULL, hInstance, NULL);
  108.  
  109. if (!hwnd) return 0;
  110.  
  111. SendMessageW(hwnd, WM_SETICON, ICON_BIG, (LPARAM)icon);
  112. SendMessageW(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)icon);
  113.  
  114. ShowWindow(hwnd, nCmdShow);
  115. UpdateWindow(hwnd);
  116.  
  117. MSG msg = {};
  118.  
  119. while (GetMessageW(&msg, NULL, 0, 0))
  120. {
  121. TranslateMessage(&msg);
  122. DispatchMessageW(&msg);
  123. }
  124.  
  125. DestroyIcon(icon);
  126.  
  127. return 0;
  128. }
Pasted 2026-09-15 01:36:32

Short link: