CCCPaste

ccounter.cpp

// 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;
}