Share via


Crear una ventana

En este artículo, aprenderá a crear y mostrar una ventana.

Clases de ventana

Una clase de ventana define un conjunto de comportamientos que pueden tener varias ventanas en común. Por ejemplo, en un grupo de botones, cada botón tiene un comportamiento similar cuando el usuario selecciona el botón. Por supuesto, los botones no son completamente idénticos. Cada botón muestra su propia cadena de texto y tiene sus propias coordenadas de pantalla. Los datos que son únicos para cada ventana se denominan datos de instancia.

Cada ventana debe estar asociada a una clase de ventana, incluso si el programa solo crea una instancia de esa clase. Una clase de ventana no es una clase en el sentido de C++. En su lugar, es una estructura de datos utilizada internamente por el sistema operativo. Las clases de ventana se registran con el sistema en tiempo de ejecución. Para registrar una nueva clase de ventana, rellene una estructura WNDCLASS :

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

Debe establecer los siguientes miembros de estructura:

  • lpfnWndProc es un puntero a una función definida por la aplicación denominada procedimiento de ventana o procedimiento de ventana. El procedimiento de ventana define la mayor parte del comportamiento de la ventana. Por ahora, este valor es una declaración de reenvío de una función. Para obtener más información, vea Escritura del procedimiento Window.
  • hInstance es el identificador de la instancia de la aplicación. Obtenga este valor del parámetro hInstance de wWinMain.
  • lpszClassName es una cadena que identifica la clase window.

Los nombres de clase son locales para el proceso actual, por lo que el nombre solo debe ser único dentro del proceso. Sin embargo, los controles estándar de Windows también tienen clases. Si usa cualquiera de esos controles, debe elegir nombres de clase que no entren en conflicto con los nombres de clase de control. Por ejemplo, la clase de ventana del control de botón se denomina Button.

La estructura WNDCLASS tiene otros miembros que no se muestran aquí. Puede establecerlos en cero, como se muestra en este ejemplo, o rellenarlos. Para obtener más información, vea WNDCLASS.

A continuación, pase la dirección de la estructura WNDCLASS a la función RegisterClass . Esta función registra la clase de ventana con el sistema operativo.

RegisterClass(&wc);

Creación de la ventana

Para crear una nueva instancia de una ventana, llame a la función CreateWindowEx :

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

Para obtener descripciones detalladas de parámetros, consulte CreateWindowEx. Este es un resumen rápido:

  • El primer parámetro permite especificar algunos comportamientos opcionales para la ventana, por ejemplo, ventanas transparentes. Establezca este parámetro en cero para los comportamientos predeterminados.
  • CLASS_NAME es el nombre de la clase de ventana. Este nombre define el tipo de ventana que se va a crear.
  • El texto de la ventana se usa de maneras diferentes por diferentes tipos de ventanas. Si la ventana tiene una barra de título, el texto se muestra en la barra de título.
  • El estilo de ventana es un conjunto de marcas que definen parte de la apariencia de una ventana. La constante WS_OVERLAPPEDWINDOW es realmente varias marcas combinadas con un bit a ORbit . Juntos, estas marcas proporcionan a la ventana una barra de título, un borde, un menú del sistema y los botones Minimizar y Maximizar . Este conjunto de marcas es el estilo más común para una ventana de aplicación de nivel superior.
  • Para la posición y el tamaño, la constante CW_USEDEFAULT significa usar valores predeterminados.
  • El siguiente parámetro establece una ventana principal o una ventana de propietario para la nueva ventana. Establezca el elemento primario si se va a crear una ventana secundaria. Para una ventana de nivel superior, establezca este valor en NULL.
  • Para una ventana de aplicación, el parámetro siguiente define el menú de la ventana. En este ejemplo no se usa un menú, por lo que el valor es NULL.
  • hInstance es el identificador de instancia, descrito anteriormente. Consulte WinMain: el punto de entrada de la aplicación.
  • El último parámetro es un puntero a datos arbitrarios de tipo void*. Puede usar este valor para pasar una estructura de datos al procedimiento de ventana. Para obtener una manera posible de usar este parámetro, consulte Administración del estado de la aplicación.

CreateWindowEx devuelve un identificador a la nueva ventana o cero si se produce un error en la función. Para mostrar la ventana, es decir, hacer que la ventana sea visible, pase el identificador de ventana a la función ShowWindow :

ShowWindow(hwnd, nCmdShow);

El parámetro hwnd es el identificador de ventana devuelto por CreateWindowEx. El parámetro nCmdShow se puede usar para minimizar o maximizar una ventana. El sistema operativo pasa este valor al programa a través de la función wWinMain .

Este es el código completo para crear la ventana. Recuerde que WindowProc sigue siendo solo una declaración de avance de una función.

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

Enhorabuena, ha creado una ventana.

En este momento, la ventana no contiene ningún contenido ni interactúa con el usuario. En una aplicación de GUI real, la ventana respondería a eventos del usuario y del sistema operativo. En la sección siguiente se describe cómo los mensajes de ventana proporcionan este tipo de interactividad.

Consulte también

Vaya a Mensajes de ventana para continuar con este módulo.