// Compteur cliquable : clic = +1, Shift + clic = remise à zéro.
// Compilation : cl.exe /EHsc compteur.cpp /link /SUBSYSTEM:WINDOWS
#include <windows.h>
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;
}