Combreal icon

ccounter.cpp

Combreal | PRO | 09/15/26 07:44:51 PM UTC | 0 ⭐ | 22017 👁️ | Never ⏰ | [counter]
C++ |

3.61 KB

|

None

|

0 👍

/

0 👎

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

Comments