Share via


Módulo 1. Su primer programa de Windows

En este módulo, escribiremos un programa de escritorio de Windows mínimo. Todo lo que hace es crear y mostrar una ventana en blanco. Este primer programa contiene aproximadamente 50 líneas de código, sin contar líneas en blanco y comentarios. Será nuestro punto de partida; más adelante agregaremos gráficos, texto, entrada de usuario y otras características.

Si busca más detalles sobre cómo crear una aplicación de escritorio de Windows tradicional en Visual Studio, consulte Tutorial: Crear una aplicación de escritorio de Windows tradicional (C++).

Captura de pantalla del programa de ejemplo, que muestra que es una ventana en blanco con el título Learn to Program Windows (Aprender a programar Ventanas).

Este es el código completo del programa:

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";
    
    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

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

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

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

            // All painting occurs here, between BeginPaint and EndPaint.

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Puede descargar el proyecto completo de Visual Studio desde Windows Hello World Sample.

Puede ser útil describir brevemente lo que hace este código. Los temas posteriores examinarán el código en detalle.

  1. wWinMain es el punto de entrada del programa. Cuando se inicia el programa, registra información sobre el comportamiento de la ventana de la aplicación. Uno de los elementos más importantes es la dirección de una función, denominada WindowProc en este ejemplo. Esta función define el comportamiento de la ventana, su apariencia, su interacción con el usuario, etc.
  2. A continuación, el programa crea la ventana y recibe un identificador que identifica de forma única la ventana.
  3. Si la ventana se crea correctamente, el programa entra en un bucle while . El programa permanece en este bucle hasta que el usuario cierra la ventana y sale de la aplicación.

Observe que el programa no llama explícitamente a la WindowProc función , aunque hemos dicho esto es donde se define la mayoría de la lógica de la aplicación. Windows se comunica con el programa pasando una serie de mensajes. El código dentro del bucle while controla este proceso. Cada vez que el programa llama a la función DispatchMessage , hace que Windows indirectamente invoque la función WindowProc, una vez para cada mensaje.

En esta sección

Aprender a programar para Windows en C++

Ejemplo de Windows Hello World