DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));


/**
    Eu sou o bom Pastor, e conheço as minhas ovelhas, e das minhas sou conhecido.
    João 10:14
*/

#include <windows.h>

#define DIVISIONS 5

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);

int idFocus = 0;
TCHAR szChildClass[] = TEXT("Checker4_Child");

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI, PSTR szCL, int iCS) {
    static TCHAR szAppName[] = TEXT("Checker4");
    HWND   hwnd;
    MSG    msg;
    WNDCLASS wndclass;

    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc   = WndProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInstance;
    wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = szAppName;

    if(!RegisterClass(&wndclass)) {
        MessageBox(
            NULL,
            TEXT("This program requires Windows NT!"),
            szAppName,
            MB_ICONERROR
        );
        return 0;
    }

    wndclass.lpfnWndProc   = ChildWndProc;
    wndclass.cbClsExtra    = sizeof(long);
    wndclass.hIcon         = NULL;
    wndclass.lpszClassName = szChildClass;

    RegisterClass(&wndclass);

    hwnd = CreateWindow(
        szAppName,
        TEXT("SelectObject(hdc, CreatePen(PS_SOLID, 0, 0));"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    ShowWindow(hwnd, iCS);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        FreeConsole();
    }
    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lParam) {
    static HWND hwndChild[DIVISIONS][DIVISIONS];
    int cxBlock, cyBlock, x, y;

    switch(msg) {
        case WM_CREATE:
            for(x=0; x<DIVISIONS; x++)
                for(y=0; y<DIVISIONS; y++)
                hwndChild[x][y] = CreateWindow(
                    szChildClass, NULL, WS_CHILDWINDOW | WS_VISIBLE,
                    0, 0, 0, 0,
                    hwnd,
                    (HMENU) (y << 8 | x),
                    (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
                    NULL
                );
            return 0;

        case WM_SIZE:
            cxBlock = LOWORD(lParam) / DIVISIONS;
            cyBlock = HIWORD(lParam) / DIVISIONS;

            for(x=0; x<DIVISIONS; x++)
                for(y=0; y<DIVISIONS; y++)
                MoveWindow(
                    hwndChild[x][y],
                    x * cxBlock,
                    y * cyBlock,
                    cxBlock,
                    cyBlock,
                    TRUE
                );
            return 0;

        case WM_LBUTTONDOWN:
            MessageBeep(0);
            return 0;

        case WM_SETFOCUS:
            SetFocus(GetDlgItem(hwnd, idFocus));
            return 0;
        case WM_KEYDOWN:
            x = idFocus & 0xFF;
            y = idFocus >> 8;

            switch(wP) {
                case VK_UP:
                    y--;
                    break;
                case VK_DOWN:
                    y++;
                    break;
                case VK_LEFT: x--; break;
                case VK_RIGHT: x++; break;
                case VK_HOME:
                    x = y = 0;
                    break;
                case VK_END:
                    x = y = DIVISIONS -1;
                    break;
                default:
                    return 0;
            }
            x = (x+DIVISIONS) % DIVISIONS;
            y = (y+DIVISIONS) % DIVISIONS;

            idFocus = y<<8 | x;
            SetFocus(GetDlgItem(hwnd, idFocus));
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, msg, wP, lParam);
}

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lParam) {
    HDC         hdc;
    PAINTSTRUCT ps;
    RECT        rect;

    switch(msg) {
        case WM_CREATE:
            SetWindowLong(hwnd, 0, 0);
            return 0;
        case WM_KEYDOWN:
            if(wP != VK_RETURN && wP != VK_SPACE) {
                SendMessage(GetParent(hwnd), msg, wP, lParam);
                return 0;
            }
        case WM_LBUTTONDOWN:
            SetWindowLong(hwnd, 0, 1 ^ GetWindowLong(hwnd, 0));
            SetFocus(hwnd);
            InvalidateRect(hwnd, NULL, FALSE);
            return 0;
        case WM_SETFOCUS:
            idFocus = GetWindowLong(hwnd, GWL_ID);
        case WM_KILLFOCUS:
            InvalidateRect(hwnd, NULL, TRUE);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &ps);
            Rectangle(hdc, 0, 0, rect.right, rect.bottom);

            if(GetWindowLong(hwnd, 0)) {
                MoveToEx(hdc, 0, 0, NULL);
                LineTo(hdc, rect.right, rect.bottom);
                MoveToEx(hdc, 0, rect.bottom, NULL);
                LineTo(hdc, rect.right, 0);
            }
            if(hwnd == GetFocus()) {
                rect.left   += rect.right/10;
                rect.right  -= rect.left;
                rect.top    += rect.bottom/10;
                rect.bottom -= rect.top;
                SelectObject(hdc, GetStockObject(NULL_BRUSH));
                SelectObject(hdc, CreatePen(PS_SOLID, 0, 0));
                Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
                DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));
            }
            EndPaint(hwnd, &ps);
            return 0;
    }
    return DefWindowProc(hwnd, msg, wP, lParam);
}

Comentários