Esqueleto de Janela em Windows NT

EsAV-RJ Advanced Programming
#include <windows.h>

/**Baseado no Livro: Charles Petzold - Programming Windows 5th Edition*/

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

/**FUNÇÃO PRINCIPAL*/
int WINAPI WinMain(HINSTANCE hHinstance, HINSTANCE hInstance,
                   LPSTR szCmdLine, int iCmdShow) {

    static TCHAR szAppName[] = TEXT("AltWind");
    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_WARNING);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = GetSysColorBrush(COLOR_INFOBK);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

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

    hwnd = CreateWindow(szAppName, TEXT("Alternating and Winding Fill Modes"),
                        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    static POINT aptFigure[10] = {10, 70, 50, 70, 50, 10, 90, 10,
                                  90, 50, 30, 50, 30, 90, 70, 90, 70, 30, 10, 30};

    static int cxClient, cyClient;
    HDC hdc;
    int i;
    PAINTSTRUCT ps;
    POINT apt[10];

    switch(message) {
        case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
            return 0;

        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);

            (HGDIOBJ)/*SelectObject*/(hdc, (HBRUSH)/*GetStockObject*/(GRAY_BRUSH));

            for(i=0; i<10; i++) {
                apt[i].x = cxClient * aptFigure[i].x / 200;
                apt[i].y = cyClient * aptFigure[i].y / 200;
            }

            (HDC) /*SetPolyFillMode*/(hdc, ALTERNATE);

            (BOOL)/*Polygon*/(hdc, apt, 10);

            for(i=0; i<10; i++) {
                apt[i].x += cxClient / 2;
            }

            (HDC)/*SetPolyFillMode*/(hdc, WINDING);
            (BOOL)/*Polygon*/(hdc, apt, 10);

            EndPaint(hwnd, &ps);

            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

Comentários