#include <windows.h>

// Declaración de funciones
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Punto de entrada de la aplicación
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // Registrar la clase de ventana
    const wchar_t CLASS_NAME[] = L"WinAPIAppClass";

    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Crear la ventana
    HWND hwnd = CreateWindowEx(
        0,
        CLASS_NAME,
        L"Ventana con Scrollbar",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 100, 300, // Tamaño más pequeño
        NULL,
        NULL,
        hInstance,
        NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    // Mostrar la ventana
    ShowWindow(hwnd, nCmdShow);

    // Bucle de mensajes
    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

// Procedimiento de ventana
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    static int scrollPos = 0;

    switch (msg) {
        case WM_CREATE: {
            // Crear una barra de desplazamiento vertical
            SCROLLINFO si = {};
            si.cbSize = sizeof(SCROLLINFO);
            si.fMask = SIF_RANGE | SIF_PAGE;
            si.nMin = 0;
            si.nMax = 100;
            si.nPage = 10; // Cantidad de elementos que se muestran en la ventana a la vez
            SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
            break;
        }
        case WM_VSCROLL: {
            // Manejar eventos de la barra de desplazamiento
            switch (LOWORD(wParam)) {
                case SB_THUMBPOSITION:
                case SB_THUMBTRACK: {
                    // Obtener la posición de la barra de desplazamiento
                    SCROLLINFO si = {};
                    si.cbSize = sizeof(SCROLLINFO);
                    si.fMask = SIF_TRACKPOS;
                    GetScrollInfo(hwnd, SB_VERT, &si);

                    // Actualizar la posición de la barra de desplazamiento
                    scrollPos = si.nTrackPos;
                    InvalidateRect(hwnd, NULL, TRUE);
                    break;
                }
            }
            break;
        }
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // Dibujar contenido (este ejemplo no dibuja nada, solo muestra la barra de desplazamiento)

            EndPaint(hwnd, &ps);
            break;
        }
        case WM_DESTROY: {
            // Cerrar la aplicación cuando se cierra la ventana
            PostQuitMessage(0);
            break;
        }
        default: {
            return DefWindowProc(hwnd, msg, wParam, lParam);
        }
    }
    return 0;
}

