Características de las ventanas

En esta introducción se describen las características de las ventanas, como los tipos de ventana, los estados, el tamaño y la posición.

Tipos de ventana

Esta sección contiene los temas siguientes que describen los tipos de ventana.

Ventanas superpuestas

Una ventana superpuesta es una ventana de nivel superior (ventana no secundaria) que tiene una barra de título, un borde y un área cliente; está diseñado para servir como ventana principal de una aplicación. También puede tener un menú de ventana, minimizar y maximizar botones y barras de desplazamiento. Una ventana superpuesta que se usa como ventana principal normalmente incluye todos estos componentes.

Al especificar el estilo WS_OVERLAPPED o WS_OVERLAPPEDWINDOW en la función CreateWindowEx , una aplicación crea una ventana superpuesta. Si usa el estilo WS_OVERLAPPED , la ventana tiene una barra de título y un borde. Si usa el estilo WS_OVERLAPPEDWINDOW , la ventana tiene una barra de título, un borde de ajuste de tamaño, un menú de ventana y minimiza y maximiza los botones.

Ventanas emergentes

Una ventana emergente es un tipo especial de ventana superpuesta que se usa para cuadros de diálogo, cuadros de mensaje y otras ventanas temporales que aparecen fuera de la ventana principal de una aplicación. Las barras de título son opcionales para las ventanas emergentes; De lo contrario, las ventanas emergentes son las mismas que las ventanas superpuestas del estilo WS_OVERLAPPED .

Para crear una ventana emergente, especifique el estilo de WS_POPUP en CreateWindowEx. Para incluir una barra de título, especifique el estilo WS_CAPTION . Use el estilo WS_POPUPWINDOW para crear una ventana emergente que tenga un borde y un menú de ventana. El estilo WS_CAPTION debe combinarse con el estilo WS_POPUPWINDOW para que el menú de la ventana sea visible.

Ventanas secundarias

Una ventana secundaria tiene el estilo WS_CHILD y se limita al área cliente de su ventana primaria. Normalmente, una aplicación usa ventanas secundarias para dividir el área cliente de una ventana primaria en áreas funcionales. Para crear una ventana secundaria, especifique el estilo WS_CHILD en la función CreateWindowEx .

Una ventana secundaria debe tener una ventana primaria. La ventana primaria puede ser una ventana superpuesta, una ventana emergente o incluso otra ventana secundaria. Especifique la ventana primaria al llamar a CreateWindowEx. Si especifica el estilo de WS_CHILD en CreateWindowEx pero no especifica una ventana primaria, el sistema no crea la ventana.

Una ventana secundaria tiene un área de cliente pero ninguna otra característica, a menos que se soliciten explícitamente. Una aplicación puede solicitar una barra de título, un menú de ventanas, minimizar y maximizar botones, un borde y barras de desplazamiento para una ventana secundaria, pero una ventana secundaria no puede tener un menú. Si la aplicación especifica un identificador de menú, ya sea cuando registra la clase de ventana secundaria o crea la ventana secundaria, se omite el identificador de menú. Si no se especifica ningún estilo de borde, el sistema crea una ventana sin bordes. Una aplicación puede usar ventanas secundarias sin borde para dividir el área de cliente de una ventana primaria mientras mantiene invisibles las divisiones para el usuario.

En esta sección se describen los siguientes aspectos de las ventanas secundarias:

Posicionamiento

El sistema siempre coloca una ventana secundaria en relación con la esquina superior izquierda del área cliente de su ventana primaria. Ninguna parte de una ventana secundaria aparece nunca fuera de los bordes de su ventana primaria. Si una aplicación crea una ventana secundaria que es mayor que la ventana primaria o coloca una ventana secundaria para que una o todas las ventanas secundarias se extiendan más allá de los bordes del elemento primario, el sistema recorta la ventana secundaria; es decir, no se muestra la parte fuera del área de cliente de la ventana primaria. Las acciones que afectan a la ventana primaria también pueden afectar a la ventana secundaria, como se indica a continuación.

Ventana primaria Ventana secundaria
Destruido Destruido antes de que se destruya la ventana primaria.
Hidden Oculto antes de que se oculte la ventana primaria. Una ventana secundaria solo es visible cuando la ventana primaria está visible.
Movido Se ha movido con el área de cliente de la ventana primaria. La ventana secundaria es responsable de pintar su área cliente después del movimiento.
Mostrado Se muestra después de que se muestre la ventana primaria.

 

Recorte

El sistema no recorta automáticamente una ventana secundaria desde el área cliente de la ventana primaria. Esto significa que la ventana primaria dibuja sobre la ventana secundaria si lleva a cabo algún dibujo en la misma ubicación que la ventana secundaria. Sin embargo, el sistema recorta la ventana secundaria desde el área cliente de la ventana primaria si la ventana primaria tiene el estilo WS_CLIPCHILDREN . Si se recorta la ventana secundaria, la ventana primaria no se puede dibujar sobre ella.

Una ventana secundaria puede superponerse a otras ventanas secundarias en el mismo área de cliente. Una ventana secundaria que comparte la misma ventana primaria que una o más ventanas secundarias se denomina ventana del mismo nivel. Las ventanas del mismo nivel pueden dibujarse en el área de cliente del otro, a menos que una de las ventanas secundarias tenga el estilo WS_CLIPSIBLINGS . Si una ventana secundaria tiene este estilo, se recorta cualquier parte de su ventana del mismo nivel que se encuentra dentro de la ventana secundaria.

Si una ventana tiene el estilo WS_CLIPCHILDREN o WS_CLIPSIBLINGS , se produce una pequeña pérdida de rendimiento. Cada ventana ocupa recursos del sistema, por lo que una aplicación no debe usar ventanas secundarias indiscriminadamente. Para obtener el mejor rendimiento, una aplicación que necesita dividir lógicamente su ventana principal debe hacerlo en el procedimiento de ventana de la ventana principal en lugar de usar ventanas secundarias.

Relación con la ventana primaria

Una aplicación puede cambiar la ventana primaria de una ventana secundaria existente llamando a la función SetParent . En este caso, el sistema quita la ventana secundaria del área cliente de la ventana primaria antigua y la mueve al área cliente de la nueva ventana primaria. Si SetParent especifica un identificador NULL , la ventana de escritorio se convierte en la nueva ventana primaria. En este caso, la ventana secundaria se dibuja en el escritorio, fuera de los bordes de cualquier otra ventana. La función GetParent recupera un identificador de la ventana primaria de una ventana secundaria.

La ventana primaria renuncia una parte de su área cliente a una ventana secundaria y la ventana secundaria recibe toda la entrada de esta área. La clase de ventana no debe ser la misma para cada una de las ventanas secundarias de la ventana primaria. Esto significa que una aplicación puede rellenar una ventana primaria con ventanas secundarias que parecen diferentes y llevan a cabo tareas diferentes. Por ejemplo, un cuadro de diálogo puede contener muchos tipos de controles, cada uno de ellos una ventana secundaria que acepta distintos tipos de datos del usuario.

Una ventana secundaria tiene solo una ventana primaria, pero un elemento primario puede tener cualquier número de ventanas secundarias. Cada ventana secundaria, a su vez, puede tener ventanas secundarias. En esta cadena de ventanas, cada ventana secundaria se denomina ventana descendiente de la ventana primaria original. Una aplicación usa la función IsChild para detectar si una ventana determinada es una ventana secundaria o una ventana descendiente de una ventana primaria determinada.

La función EnumChildWindows enumera las ventanas secundarias de una ventana primaria. A continuación, EnumChildWindows pasa el identificador a cada ventana secundaria a una función de devolución de llamada definida por la aplicación. También se enumeran las ventanas descendientes de la ventana primaria especificada.

error de Hadoop

El sistema pasa los mensajes de entrada de una ventana secundaria directamente a la ventana secundaria; los mensajes no se pasan a través de la ventana primaria. La única excepción es si la función EnableWindow ha deshabilitado la ventana secundaria. En este caso, el sistema pasa los mensajes de entrada que habrían pasado a la ventana secundaria a la ventana primaria en su lugar. Esto permite que la ventana primaria examine los mensajes de entrada y habilite la ventana secundaria, si es necesario.

Una ventana secundaria puede tener un identificador entero único. Los identificadores de ventana secundarios son importantes al trabajar con ventanas de control. Una aplicación dirige la actividad de un control mediante el envío de mensajes. La aplicación usa el identificador de ventana secundaria del control para dirigir los mensajes al control. Además, un control envía mensajes de notificación a su ventana primaria. Un mensaje de notificación incluye el identificador de la ventana secundaria del control, que el elemento primario usa para identificar qué control envió el mensaje. Una aplicación especifica el identificador de ventana secundaria para otros tipos de ventanas secundarias estableciendo el parámetro hMenu de la función CreateWindowEx en un valor en lugar de un identificador de menú.

Ventanas superpuestas

El uso de una ventana superpuesta puede mejorar significativamente el rendimiento y los efectos visuales de una ventana que tiene una forma compleja, anima su forma o desea usar efectos de combinación alfa. El sistema crea y vuelve a pintar automáticamente ventanas superpuestas y las ventanas de las aplicaciones subyacentes. Como resultado, las ventanas superpuestas se representan sin problemas, sin el parpadeo típico de regiones de ventana complejas. Además, las ventanas superpuestas pueden ser parcialmente translúcidas, es decir, mezcla alfa.

Para crear una ventana superpuesta, especifique la WS_EX_LAYERED estilo de ventana extendida al llamar a la función CreateWindowEx o llame a la función SetWindowLong para establecer WS_EX_LAYERED una vez creada la ventana. Después de llamar a CreateWindowEx , la ventana superpuesta no será visible hasta que se haya llamado a la función SetLayeredWindowAttributes o UpdateLayeredWindow para esta ventana.

Nota

A partir de Windows 8, WS_EX_LAYERED se pueden usar con ventanas secundarias y ventanas de nivel superior. Las versiones anteriores de Windows solo admiten WS_EX_LAYERED para ventanas de nivel superior.

 

Para establecer el nivel de opacidad o la clave de color de transparencia de una ventana superpuesta determinada, llame a SetLayeredWindowAttributes. Después de la llamada, es posible que el sistema todavía pida a la ventana que pinte cuando se muestre o cambie el tamaño de la ventana. Sin embargo, dado que el sistema almacena la imagen de una ventana superpuesta, el sistema no pedirá a la ventana que pinte si las partes de ella se revelan como resultado de movimientos de ventana relativos en el escritorio. Las aplicaciones heredadas no necesitan reestructurar su código de dibujo si quieren agregar efectos de transparencia o translucencia para una ventana, ya que el sistema redirige la pintura de ventanas que llamó SetLayeredWindowAttributes en memoria fuera de la pantalla y la vuelve a calcular para lograr el efecto deseado.

Para una animación más rápida y eficaz o si se necesita alfa por píxel, llame a UpdateLayeredWindow. UpdateLayeredWindow se debe usar principalmente cuando la aplicación debe proporcionar directamente la forma y el contenido de una ventana superpuesta, sin usar el mecanismo de redireccionamiento que proporciona el sistema a través de SetLayeredWindowAttributes. Además, el uso de UpdateLayeredWindow usa directamente la memoria de forma más eficaz, ya que el sistema no necesita la memoria adicional necesaria para almacenar la imagen de la ventana redirigida. Para obtener la máxima eficacia en la animación de ventanas, llame a UpdateLayeredWindow para cambiar la posición y el tamaño de una ventana superpuesta. Tenga en cuenta que, después de llamar a SetLayeredWindowAttributes , se producirá un error en las llamadas posteriores a UpdateLayeredWindow hasta que se borre y vuelva a establecer el bit de estilo de capas.

Las pruebas de posicionamiento de una ventana superpuesta se basan en la forma y la transparencia de la ventana. Esto significa que las áreas de la ventana con clave de color o cuyo valor alfa es cero permitirán que los mensajes del mouse pasen. Sin embargo, si la ventana superpuesta tiene el estilo de ventana extendida WS_EX_TRANSPARENT, se omitirá la forma de la ventana superpuesta y los eventos del mouse se pasarán a otras ventanas debajo de la ventana superpuesta.

Message-Only Windows

Una ventana de solo mensaje le permite enviar y recibir mensajes. No está visible, no tiene ningún orden z, no se puede enumerar y no recibe mensajes de difusión. La ventana simplemente envía mensajes.

Para crear una ventana de solo mensaje, especifique la constante HWND_MESSAGE o un identificador para una ventana de solo mensaje existente en el parámetro hWndParent de la función CreateWindowEx . También puede cambiar una ventana existente a una ventana de solo mensaje especificando HWND_MESSAGE en el parámetro hWndNewParent de la función SetParent .

Para buscar ventanas de solo mensaje, especifique HWND_MESSAGE en el parámetro hwndParent de la función FindWindowEx . Además, FindWindowEx busca ventanas de solo mensaje, así como ventanas de nivel superior si los parámetros hwndParent y hwndChildAfter son NULL.

Relaciones de ventana

Hay muchas maneras en que una ventana puede relacionarse con el usuario u otra ventana. Una ventana puede ser una ventana propiedad, una ventana de primer plano o una ventana de fondo. Una ventana también tiene un orden z con respecto a otras ventanas. Para obtener más información, vea los temas siguientes:

Ventanas en primer plano y en segundo plano

Cada proceso puede tener varios subprocesos de ejecución y cada subproceso puede crear ventanas. El subproceso que creó la ventana con la que el usuario está trabajando actualmente se denomina subproceso en primer plano y la ventana se denomina ventana de primer plano. Todos los demás subprocesos son subprocesos en segundo plano y las ventanas creadas por subprocesos en segundo plano se denominan ventanas en segundo plano.

Cada subproceso tiene un nivel de prioridad que determina la cantidad de tiempo de CPU que recibe el subproceso. Aunque una aplicación puede establecer el nivel de prioridad de sus subprocesos, normalmente el subproceso en primer plano tiene un nivel de prioridad ligeramente superior al de los subprocesos en segundo plano. Dado que tiene una prioridad más alta, el subproceso en primer plano recibe más tiempo de CPU que los subprocesos en segundo plano. El subproceso en primer plano tiene una prioridad base normal de 9; un subproceso en segundo plano tiene una prioridad base normal de 7.

El usuario establece la ventana de primer plano haciendo clic en una ventana o usando la combinación de teclas ALT+TAB o ALT+ESC. Para recuperar un identificador en la ventana de primer plano, use la función GetForegroundWindow . Para comprobar si la ventana de la aplicación es la ventana de primer plano, compare el identificador devuelto por GetForegroundWindow con el de la ventana de la aplicación.

Una aplicación establece la ventana de primer plano mediante la función SetForegroundWindow .

El sistema restringe los procesos que pueden establecer la ventana de primer plano. Un proceso solo puede establecer la ventana de primer plano si:

  • Todas las condiciones siguientes son verdaderas:
    • El proceso que llama a SetForegroundWindow pertenece a una aplicación de escritorio, no a una aplicación para UWP ni a una aplicación de la Tienda Windows diseñada para Windows 8 o 8.1.
    • El proceso en primer plano no ha deshabilitado las llamadas a SetForegroundWindow mediante una llamada anterior a la función LockSetForegroundWindow .
    • El tiempo de espera de bloqueo en primer plano ha expirado (consulte SPI_GETFOREGROUNDLOCKTIMEOUT en SystemParametersInfo).
    • No hay menús activos.
  • Además, se cumple al menos una de las siguientes condiciones:
    • El proceso de llamada es el proceso en primer plano.
    • El proceso de llamada se inició mediante el proceso en primer plano.
    • Actualmente no hay ninguna ventana de primer plano y, por tanto, no hay ningún proceso en primer plano.
    • El proceso de llamada recibió el último evento de entrada.
    • Se está depurando el proceso en primer plano o el proceso de llamada.

Es posible que se deniegue un proceso el derecho de establecer la ventana en primer plano incluso si cumple estas condiciones.

Un proceso que puede establecer la ventana de primer plano puede habilitar otro proceso para establecer la ventana de primer plano llamando a la función AllowSetForegroundWindow o llamando a la función BroadcastSystemMessage con la marca BSF_ALLOWSFW . El proceso de primer plano puede deshabilitar las llamadas a SetForegroundWindow llamando a la función LockSetForegroundWindow .

Windows propiedad

Una ventana emergente o superpuesta puede ser propiedad de otra ventana emergente o superpuesta. El hecho de ser propiedad coloca varias restricciones en una ventana.

  • Una ventana de propiedad siempre está por encima de su propietario en el orden z.
  • El sistema destruye automáticamente una ventana de propiedad cuando se destruye su propietario.
  • Una ventana propiedad está oculta cuando se minimiza su propietario.

Solo una ventana emergente o superpuesta puede ser una ventana propietaria; una ventana secundaria no puede ser una ventana de propietario. Una aplicación crea una ventana propiedad especificando el identificador de ventana del propietario como parámetro hwndParent de CreateWindowEx cuando crea una ventana con el estilo WS_OVERLAPPED o WS_POPUP . El parámetro hwndParent debe identificar una ventana emergente o superpuesta. Si hwndParent identifica una ventana secundaria, el sistema asigna la propiedad a la ventana primaria de nivel superior de la ventana secundaria. Después de crear una ventana propiedad, una aplicación no puede transferir la propiedad de la ventana a otra ventana.

Los cuadros de diálogo y los cuadros de mensaje son ventanas propiedad de forma predeterminada. Una aplicación especifica la ventana de propietario al llamar a una función que crea un cuadro de diálogo o un cuadro de mensaje.

Una aplicación puede usar la función GetWindow con la marca GW_OWNER para recuperar un identificador al propietario de una ventana.

Orden Z

El orden z de una ventana indica la posición de la ventana en una pila de ventanas superpuestas. Esta pila de ventanas está orientada a lo largo de un eje imaginario, el eje Z, que se extiende hacia fuera desde la pantalla. La ventana de la parte superior del orden Z se superpone a todas las demás ventanas. La ventana de la parte inferior del orden Z se superpone en todas las demás ventanas.

El sistema mantiene el orden z en una sola lista. Agrega ventanas al orden z en función de si son ventanas superiores, ventanas de nivel superior o ventanas secundarias. Una ventana superior se superpone a todas las demás ventanas no superiores, independientemente de si es la ventana activa o en primer plano. Una ventana superior tiene el estilo WS_EX_TOPMOST . Todas las ventanas superiores aparecen en el orden z antes de cualquier ventana que no sea superior. Una ventana secundaria se agrupa con su elemento primario en orden z.

Cuando una aplicación crea una ventana, el sistema lo coloca en la parte superior del orden z para las ventanas del mismo tipo. Puede usar la función BringWindowToTop para traer una ventana a la parte superior del orden z de las ventanas del mismo tipo. Puede reorganizar el orden z mediante las funciones SetWindowPos y DeferWindowPos .

El usuario cambia el orden z activando una ventana diferente. El sistema coloca la ventana activa en la parte superior del orden z para las ventanas del mismo tipo. Cuando una ventana llega a la parte superior del orden Z, así que haga sus ventanas secundarias. Puede usar la función GetTopWindow para buscar en todas las ventanas secundarias de una ventana primaria y devolver un identificador a la ventana secundaria que es más alta en orden z. La función GetNextWindow recupera un identificador de la ventana siguiente o anterior en orden z.

Mostrar estado de ventana

En un momento dado, una ventana puede estar activa o inactiva; oculto o visible; y minimizado, maximizado o restaurado. Estas cualidades se conocen colectivamente como estado de presentación de ventana. En los temas siguientes se describe el estado de presentación de la ventana:

Ventana activa

Una ventana activa es la ventana de nivel superior de la aplicación con la que el usuario está trabajando actualmente. Para permitir al usuario identificar fácilmente la ventana activa, el sistema lo coloca en la parte superior del orden z y cambia el color de su barra de título y borde a los colores de ventana activa definidos por el sistema. Solo una ventana de nivel superior puede ser una ventana activa. Cuando el usuario trabaja con una ventana secundaria, el sistema activa la ventana primaria de nivel superior asociada a la ventana secundaria.

Solo hay una ventana de nivel superior en el sistema activa a la vez. El usuario activa una ventana de nivel superior haciendo clic en ella (o en una de sus ventanas secundarias), o mediante la combinación de teclas ALT+ESC o ALT+TAB. Una aplicación activa una ventana de nivel superior llamando a la función SetActiveWindow . Otras funciones pueden hacer que el sistema active una ventana de nivel superior diferente, como SetWindowPos, DeferWindowPos, SetWindowPlacement y DestroyWindow. Aunque una aplicación puede activar una ventana de nivel superior diferente en cualquier momento, para evitar confundir al usuario, debe hacerlo solo en respuesta a una acción del usuario. Una aplicación usa la función GetActiveWindow para recuperar un identificador en la ventana activa.

Cuando la activación cambia de una ventana de nivel superior de una aplicación a la ventana de nivel superior de otra, el sistema envía un mensaje WM_ACTIVATEAPP a ambas aplicaciones, notificándolos del cambio. Cuando la activación cambia a otra ventana de nivel superior de la misma aplicación, el sistema envía a ambas ventanas un mensaje WM_ACTIVATE .

Windows deshabilitado

Se puede deshabilitar una ventana. Una ventana deshabilitada no recibe ninguna entrada de teclado o mouse del usuario, pero puede recibir mensajes de otras ventanas, de otras aplicaciones y del sistema. Normalmente, una aplicación deshabilita una ventana para impedir que el usuario use la ventana. Por ejemplo, una aplicación puede deshabilitar un botón de inserción en un cuadro de diálogo para evitar que el usuario lo elija. Una aplicación puede habilitar una ventana deshabilitada en cualquier momento; al habilitar una ventana se restaura la entrada normal.

De forma predeterminada, se habilita una ventana cuando se crea. Sin embargo, una aplicación puede especificar el estilo WS_DISABLED para deshabilitar una nueva ventana. Una aplicación habilita o deshabilita una ventana existente mediante la función EnableWindow . El sistema envía un mensaje WM_ENABLE a una ventana cuando su estado habilitado está a punto de cambiar. Una aplicación puede determinar si una ventana está habilitada mediante la función IsWindowEnabled .

Cuando se deshabilita una ventana secundaria, el sistema pasa los mensajes de entrada del mouse del elemento secundario a la ventana primaria. El elemento primario usa los mensajes para determinar si se va a habilitar la ventana secundaria. Para obtener más información, vea Entrada del mouse.

Solo una ventana a la vez puede recibir la entrada del teclado; esa ventana se dice que tiene el foco del teclado. Si una aplicación usa la función EnableWindow para deshabilitar una ventana de foco de teclado, la ventana pierde el foco del teclado además de deshabilitarse. EnableWindow establece el foco del teclado en NULL, lo que significa que ninguna ventana tiene el foco. Si una ventana secundaria u otra ventana descendiente tiene el foco del teclado, la ventana descendiente pierde el foco cuando la ventana primaria está deshabilitada. Para obtener más información, vea Entrada de teclado.

Visibilidad de la ventana

Una ventana puede estar visible u oculta. El sistema muestra una ventana visible en la pantalla. Oculta una ventana oculta sin dibujarla. Si la ventana está visible, el usuario puede introducir información en la ventana y ver los resultados de la misma. Si una ventana está oculta, en realidad está deshabilitada. Una ventana oculta puede procesar mensajes del sistema o de otras ventanas, pero no puede procesar los datos de entrada del usuario ni mostrar los de salida. Una aplicación establece el estado de visibilidad de una ventana al crear la ventana. Más adelante, la aplicación puede cambiar el estado de visibilidad.

Una ventana es visible cuando se establece el estilo WS_VISIBLE para la ventana. De forma predeterminada, la función CreateWindowEx crea una ventana oculta a menos que la aplicación especifique el estilo WS_VISIBLE . Normalmente, una aplicación establece el estilo WS_VISIBLE después de crear una ventana para mantener los detalles del proceso de creación oculto del usuario. Por ejemplo, una aplicación puede mantener oculta una nueva ventana mientras personaliza la apariencia de la ventana. Si el estilo de WS_VISIBLE se especifica en CreateWindowEx, el sistema envía el mensaje WM_SHOWWINDOW a la ventana después de crear la ventana, pero antes de mostrarla.

Una aplicación puede determinar si una ventana está visible mediante la función IsWindowVisible . Una aplicación puede mostrar (hacer visible) u ocultar una ventana mediante la función ShowWindow, SetWindowPos, DeferWindowPos o SetWindowPlacement o SetWindowLong . Estas funciones muestran u ocultan una ventana estableciendo o quitando el estilo de WS_VISIBLE de la ventana. También envían el mensaje WM_SHOWWINDOW a la ventana antes de mostrarlo u ocultarlo.

Cuando se minimiza una ventana de propietario, el sistema oculta automáticamente las ventanas de propiedad asociadas. De forma similar, cuando se restaura una ventana de propietario, el sistema muestra automáticamente las ventanas de propiedad asociadas. En ambos casos, el sistema envía el mensaje WM_SHOWWINDOW a las ventanas de propiedad antes de ocultarlos o mostrarlos. En ocasiones, es posible que una aplicación tenga que ocultar las ventanas propiedad sin tener que minimizar u ocultar el propietario. En este caso, la aplicación usa la función ShowOwnedPopups . Esta función establece o quita el estilo de WS_VISIBLE para todas las ventanas de propiedad y envía el mensaje WM_SHOWWINDOW a las ventanas propiedad antes de ocultarlas o mostrarlas. Ocultar una ventana de propietario no tiene ningún efecto en el estado de visibilidad de las ventanas de propiedad.

Cuando una ventana primaria está visible, sus ventanas secundarias asociadas también son visibles. De forma similar, cuando la ventana principal está oculta, también se ocultan sus ventanas secundarias. Minimizar la ventana primaria no tiene ningún efecto en el estado de visibilidad de las ventanas secundarias; es decir, las ventanas secundarias se minimizan junto con el elemento primario, pero no se cambia el estilo de WS_VISIBLE .

Incluso si una ventana tiene el estilo WS_VISIBLE , es posible que el usuario no pueda ver la ventana en la pantalla; otras ventanas pueden superponerse por completo o que se hayan movido más allá del borde de la pantalla. Además, una ventana secundaria visible está sujeta a las reglas de recorte establecidas por su relación de elementos primarios y secundarios. Si la ventana primaria de la ventana no está visible, tampoco será visible. Si la ventana primaria se mueve más allá del borde de la pantalla, la ventana secundaria también se mueve porque se dibuja una ventana secundaria en relación con la esquina superior izquierda del elemento primario. Por ejemplo, un usuario puede mover la ventana primaria que contiene la ventana secundaria lo suficientemente lejos del borde de la pantalla que es posible que el usuario no pueda ver la ventana secundaria, aunque la ventana secundaria y su ventana primaria tengan el estilo WS_VISIBLE .

Ventanas minimizadas, maximizadas y restauradas

Una ventana maximizada es una ventana que tiene el estilo WS_MAXIMIZE . De manera predeterminada, el sistema agranda una ventana maximizada para que ocupe toda la pantalla o, en el caso de las ventanas secundarias, toda el área de cliente de la ventana primaria. Aunque el tamaño de una ventana se puede establecer en el mismo tamaño de una ventana maximizada, una ventana maximizada es ligeramente diferente. El sistema mueve automáticamente la barra de título de la ventana a la parte superior de la pantalla o a la parte superior del área cliente de la ventana primaria. Además, el sistema deshabilita el borde de ajuste de tamaño de la ventana y la funcionalidad de posicionamiento de ventana de la barra de título (para que el usuario no pueda mover la ventana arrastrando la barra de título).

Una ventana minimizada es una ventana que tiene el estilo WS_MINIMIZE . De manera predeterminada, el sistema reduce una ventana minimizada al tamaño del botón de la barra de tareas y la mueve a la barra de tareas. Una ventana restaurada es una ventana que se ha devuelto a su tamaño y posición anteriores, es decir, el tamaño que tenía antes de que se minimizara o maximizara.

Si una aplicación especifica el estilo WS_MAXIMIZE o WS_MINIMIZE en la función CreateWindowEx , la ventana se maximiza o minimiza inicialmente. Después de crear una ventana, una aplicación puede usar la función CloseWindow para minimizar la ventana. La función ArrangeIconicWindows organiza los iconos en el escritorio o organiza las ventanas secundarias minimizadas de una ventana primaria en la ventana primaria. La función OpenIcon restaura una ventana minimizada a su tamaño y posición anteriores.

La función ShowWindow puede minimizar, maximizar o restaurar una ventana. También puede establecer los estados de visibilidad y activación de la ventana. La función SetWindowPlacement incluye la misma funcionalidad que ShowWindow, pero puede invalidar las posiciones predeterminadas minimizadas, maximizadas y restauradas de la ventana.

Las funciones IsZoomed e IsIconic determinan si una ventana determinada está maximizada o minimizada, respectivamente. La función GetWindowPlacement recupera las posiciones minimizadas, maximizadas y restauradas de la ventana y también determina el estado de presentación de la ventana.

Cuando el sistema recibe un comando para maximizar o restaurar una ventana minimizada, envía a la ventana un mensaje de WM_QUERYOPEN . Si el procedimiento de ventana devuelve FALSE, el sistema omite el comando maximizar o restaurar.

El sistema establece automáticamente el tamaño y la posición de una ventana maximizada en los valores predeterminados definidos por el sistema para una ventana maximizada. Para invalidar estos valores predeterminados, una aplicación puede llamar a la función SetWindowPlacement o procesar el mensaje WM_GETMINMAXINFO que recibe una ventana cuando el sistema está a punto de maximizar la ventana. WM_GETMINMAXINFO incluye un puntero a una estructura MINMAXINFO que contiene valores que el sistema usa para establecer el tamaño y la posición maximizados. Reemplazar estos valores invalida los valores predeterminados.

Tamaño y posición de la ventana

El tamaño y la posición de una ventana se expresan como rectángulo delimitador, dados en coordenadas relativas a la pantalla o a la ventana primaria. Las coordenadas de una ventana de nivel superior son relativas a la esquina superior izquierda de la pantalla; las coordenadas de una ventana secundaria son relativas a la esquina superior izquierda de la ventana primaria. Una aplicación especifica el tamaño inicial y la posición de una ventana cuando crea la ventana, pero puede cambiar el tamaño y la posición de la ventana en cualquier momento. Para obtener más información, vea Formas rellenadas.

Esta sección contiene los siguientes temas:

Tamaño y posición predeterminados

Una aplicación puede permitir que el sistema calcule el tamaño inicial o la posición de una ventana de nivel superior especificando CW_USEDEFAULT en CreateWindowEx. Si la aplicación establece las coordenadas de la ventana en CW_USEDEFAULT y no ha creado ninguna otra ventana de nivel superior, el sistema establece la posición de la nueva ventana en relación con la esquina superior izquierda de la pantalla; de lo contrario, establece la posición relativa a la posición de la ventana de nivel superior que creó la aplicación más recientemente. Si los parámetros de ancho y alto se establecen en CW_USEDEFAULT, el sistema calcula el tamaño de la nueva ventana. Si la aplicación ha creado otras ventanas de nivel superior, el sistema basa el tamaño de la nueva ventana en el tamaño de la ventana de nivel superior creada más recientemente. Especificar CW_USEDEFAULT al crear una ventana secundaria o emergente hace que el sistema establezca el tamaño de la ventana en el tamaño mínimo predeterminado de la ventana.

Tamaño de seguimiento

El sistema mantiene un tamaño de seguimiento mínimo y máximo para una ventana del estilo WS_THICKFRAME ; una ventana con este estilo tiene un borde de ajuste de tamaño. El tamaño mínimo de seguimiento es el tamaño de ventana más pequeño que se puede producir arrastrando el borde de ajuste de tamaño de la ventana. Del mismo modo, el tamaño máximo de seguimiento es el tamaño de ventana más grande que puede producir arrastrando el borde de ajuste de tamaño.

Los tamaños de seguimiento mínimo y máximo de una ventana se establecen en valores predeterminados definidos por el sistema cuando el sistema crea la ventana. Una aplicación puede detectar los valores predeterminados e invalidarlos procesando el mensaje WM_GETMINMAXINFO . Para obtener más información, vea Mensajes de posición y tamaño.

Comandos del sistema

Una aplicación que tiene un menú de ventana puede cambiar el tamaño y la posición de esa ventana mediante el envío de comandos del sistema. Los comandos del sistema se generan cuando el usuario elige comandos en el menú de la ventana. Una aplicación puede emular la acción del usuario enviando un mensaje de WM_SYSCOMMAND a la ventana. Los siguientes comandos del sistema afectan al tamaño y la posición de una ventana.

Get-Help Descripción
SC_CLOSE Cierra la ventana. Este comando envía un mensaje WM_CLOSE a la ventana. La ventana lleva a cabo los pasos necesarios para limpiarse y destruirse.
SC_MAXIMIZE Maximiza la ventana.
SC_MINIMIZE Minimiza la ventana.
SC_MOVE Mueve la ventana.
SC_RESTORE Restaura una ventana minimizada o maximizada a su tamaño y posición anteriores.
SC_SIZE Inicia un comando de tamaño. Para cambiar el tamaño de la ventana, use el mouse o el teclado.

 

Funciones de tamaño y posición

Después de crear una ventana, una aplicación puede establecer el tamaño o la posición de la ventana llamando a una de varias funciones diferentes, como SetWindowPlacement, MoveWindow, SetWindowPos y DeferWindowPos. SetWindowPlacement establece la posición minimizada de una ventana, la posición maximizada, el tamaño y la posición restaurados, y muestra el estado. Las funciones MoveWindow y SetWindowPos son similares; ambos establecen el tamaño o la posición de una sola ventana de aplicación. La función SetWindowPos incluye un conjunto de marcas que afectan al estado de presentación de la ventana; MoveWindow no incluye estas marcas. Use las funciones BeginDeferWindowPos, DeferWindowPos y EndDeferWindowPos para establecer simultáneamente la posición de una serie de ventanas, incluido el tamaño, la posición, la posición en el orden z y mostrar el estado.

Una aplicación puede recuperar las coordenadas del rectángulo delimitador de una ventana mediante la función GetWindowRect . GetWindowRect rellena una estructura RECT con las coordenadas de las esquinas superior izquierda e inferior derecha de la ventana. Las coordenadas son relativas a la esquina superior izquierda de la pantalla, incluso para una ventana secundaria. La función ScreenToClient o MapWindowPoints asigna las coordenadas de pantalla del rectángulo delimitador de una ventana secundaria a las coordenadas relativas al área de cliente de la ventana primaria.

La función GetClientRect recupera las coordenadas del área de cliente de una ventana. GetClientRect rellena una estructura RECT con las coordenadas de las esquinas superior izquierda e inferior derecha del área de cliente, pero las coordenadas son relativas al propio área cliente. Esto significa que las coordenadas de la esquina superior izquierda de un área cliente siempre son (0,0) y las coordenadas de la esquina inferior derecha son el ancho y el alto del área de cliente.

La función CascadeWindows en cascada en cascada las ventanas del escritorio o en cascada las ventanas secundarias de la ventana primaria especificada. La función TileWindows mosaico las ventanas del escritorio o las ventanas secundarias de la ventana primaria especificada.

Mensajes de tamaño y posición

El sistema envía el mensaje WM_GETMINMAXINFO a una ventana cuyo tamaño o posición está a punto de cambiar. Por ejemplo, el mensaje se envía cuando el usuario hace clic en Mover o Tamaño desde el menú de la ventana o hace clic en el borde de ajuste de tamaño o la barra de título; El mensaje también se envía cuando una aplicación llama a SetWindowPos para mover o cambiar el tamaño de la ventana. WM_GETMINMAXINFO incluye un puntero a una estructura MINMAXINFO que contiene el tamaño y la posición maximizados predeterminados para la ventana, así como los tamaños de seguimiento mínimo y máximo predeterminados. Una aplicación puede invalidar los valores predeterminados procesando WM_GETMINMAXINFO y estableciendo los miembros adecuados de MINMAXINFO. Una ventana debe tener el estilo WS_THICKFRAME o WS_CAPTION para recibir WM_GETMINMAXINFO. Una ventana con el estilo WS_THICKFRAME recibe este mensaje durante el proceso de creación de ventanas, así como cuando se mueve o se ajusta el tamaño.

El sistema envía el mensaje WM_WINDOWPOSCHANGING a una ventana cuyo tamaño, posición, posición en el orden z o estado de presentación está a punto de cambiar. Este mensaje incluye un puntero a una estructura WINDOWPOS que especifica el nuevo tamaño, la posición, la posición de la ventana en el orden z y el estado de presentación. Al establecer los miembros de WINDOWPOS, una aplicación puede afectar al nuevo tamaño, la posición y la apariencia de la ventana.

Después de cambiar el tamaño, la posición, la posición de una ventana en el orden z o mostrar el estado, el sistema envía el mensaje WM_WINDOWPOSCHANGED a la ventana. Este mensaje incluye un puntero a WINDOWPOS que informa a la ventana de su nuevo tamaño, posición, posición en el orden z y mostrar estado. Establecer los miembros de la estructura WINDOWPOS que se pasa con WM_WINDOWPOSCHANGED no tiene ningún efecto en la ventana. Una ventana que debe procesar WM_SIZE y WM_MOVE mensajes debe pasar WM_WINDOWPOSCHANGED a la función DefWindowProc ; de lo contrario, el sistema no envía WM_SIZE y WM_MOVE mensajes a la ventana.

El sistema envía el mensaje WM_NCCALCSIZE a una ventana cuando se crea o se ajusta el tamaño de la ventana. El sistema usa el mensaje para calcular el tamaño del área cliente de una ventana y la posición del área de cliente en relación con la esquina superior izquierda de la ventana. Normalmente, una ventana pasa este mensaje al procedimiento de ventana predeterminado; Sin embargo, este mensaje puede ser útil en las aplicaciones que personalizan el área no cliente de una ventana o conservan partes del área de cliente cuando se ajusta el tamaño de la ventana. Para obtener más información, vea Dibujo y dibujo.

Animación de ventana

Puede producir efectos especiales al mostrar u ocultar ventanas mediante la función AnimateWindow . Cuando la ventana se anima de esta manera, el sistema se enrollará, deslizará o atenuará la ventana, en función de las marcas que especifique en una llamada a AnimateWindow.

De forma predeterminada, el sistema usa animación roll. Con este efecto, parece que la ventana se abre (que muestra la ventana) o se cierra (ocultando la ventana). Puede usar el parámetro dwFlags para especificar si la ventana se enrolla horizontalmente, vertical o diagonalmente.

Al especificar la marca AW_SLIDE , el sistema usa la animación de diapositivas. Con este efecto, la ventana parece deslizarse a la vista (mostrando la ventana) o deslizarse fuera de la vista (ocultando la ventana). Puede usar el parámetro dwFlags para especificar si la ventana se desliza horizontalmente, vertical o diagonalmente.

Cuando se especifica la marca AW_BLEND , el sistema usa un fundido combinado alfa.

También puede usar la marca AW_CENTER para que una ventana parezca contraerse hacia dentro o expandirse hacia fuera.

Diseño y creación de reflejo de ventanas

El diseño de la ventana define cómo se disponen los objetos text y Windows Graphics Device Interface (GDI) en una ventana o contexto de dispositivo (DC). Algunos idiomas, como inglés, francés y alemán, requieren un diseño de izquierda a derecha (LTR). Otros idiomas, como árabe y hebreo, requieren diseño de derecha a izquierda (RTL). El diseño de la ventana se aplica al texto, pero también afecta a los demás elementos GDI de la ventana, incluidos mapas de bits, iconos, la ubicación del origen, botones, controles de árbol en cascada y si la coordenada horizontal aumenta a medida que avanza a la izquierda o a la derecha. Por ejemplo, una vez que una aplicación ha establecido el diseño RTL, el origen se coloca en el borde derecho de la ventana o el dispositivo, y el número que representa la coordenada horizontal aumenta a medida que se mueve a la izquierda. Sin embargo, no todos los objetos se ven afectados por el diseño de una ventana. Por ejemplo, el diseño de cuadros de diálogo, cuadros de mensaje y contextos de dispositivo que no están asociados a una ventana, como el metarchivo y los controladores de dominio de impresora, deben controlarse por separado. Los detalles de estos se mencionan más adelante en este tema.

Las funciones de ventana permiten especificar o cambiar el diseño de la ventana en las versiones árabe y hebreo de Windows. Tenga en cuenta que no se admite el cambio a un diseño RTL (también conocido como creación de reflejo) para las ventanas que tienen el estilo CS_OWNDC o para un controlador de dominio con el modo gráfico GM_ADVANCED.

De forma predeterminada, el diseño de la ventana es de izquierda a derecha (LTR). Para establecer el diseño de la ventana RTL, llame a CreateWindowEx con el estilo WS_EX_LAYOUTRTL. De forma predeterminada, una ventana secundaria (es decir, una creada con el estilo WS_CHILD y con un parámetro hWnd primario válido en la llamada a CreateWindow o CreateWindowEx) tiene el mismo diseño que su elemento primario. Para deshabilitar la herencia de la creación de reflejo en todas las ventanas secundarias, especifique WS_EX_NOINHERITLAYOUT en la llamada a CreateWindowEx. Tenga en cuenta que la creación de reflejo no se hereda de las ventanas propiedad (las creadas sin el estilo WS_CHILD ) o las creadas con el parámetro hWnd primario en CreateWindowEx establecido en NULL. Para deshabilitar la herencia de la creación de reflejo de una ventana individual, procese el mensaje de WM_NCCREATE con GetWindowLong y SetWindowLong para desactivar la marca WS_EX_LAYOUTRTL . Este procesamiento se suma a cualquier otro procesamiento que se necesite. En el fragmento de código siguiente se muestra cómo se hace esto.

SetWindowLong (hWnd, 
               GWL_EXSTYLE, 
               GetWindowLong(hWnd,GWL_EXSTYLE) & ~WS_EX_LAYOUTRTL))

Puede establecer el diseño predeterminado en RTL llamando a SetProcessDefaultLayout(LAYOUT_RTL). Todas las ventanas creadas después de la llamada se reflejarán, pero las ventanas existentes no se verán afectadas. Para desactivar la creación de reflejo predeterminada, llame a SetProcessDefaultLayout(0).

Tenga en cuenta que SetProcessDefaultLayout refleja los controladores de dominio solo de las ventanas reflejadas. Para reflejar cualquier controlador de dominio, llame a SetLayout(hdc, LAYOUT_RTL). Para obtener más información, consulte la explicación sobre los contextos de dispositivos de creación de reflejo que no están asociados a las ventanas, que se incluye más adelante en este tema.

Los mapas de bits y los iconos de una ventana reflejada también se reflejan de forma predeterminada. Sin embargo, no todos deben reflejarse. Por ejemplo, los que tienen texto, un logotipo empresarial o un reloj analógico no deben reflejarse. Para deshabilitar la creación de reflejo de mapas de bits, llame a SetLayout con el LAYOUT_BITMAPORIENTATIONPRESERVED bit establecido en dwLayout. Para deshabilitar la creación de reflejo en un controlador de dominio, llame a SetLayout(hdc, 0).

Para consultar el diseño predeterminado actual, llame a GetProcessDefaultLayout. Tras una devolución correcta, pdwDefaultLayout contiene LAYOUT_RTL o 0. Para consultar la configuración de diseño del contexto del dispositivo, llame a GetLayout. Tras una devolución correcta, GetLayout devuelve un valor DWORD que indica la configuración de diseño por la configuración del LAYOUT_RTL y los bits de LAYOUT_BITMAPORIENTATIONPRESERVED.

Una vez creada una ventana, cambie el diseño mediante la función SetWindowLong . Por ejemplo, esto es necesario cuando el usuario cambia el idioma de la interfaz de usuario de una ventana existente de árabe o hebreo a alemán. Sin embargo, al cambiar el diseño de una ventana existente, debe invalidar y actualizar la ventana para asegurarse de que el contenido de la ventana se dibuja en el mismo diseño. El ejemplo de código siguiente es del código de ejemplo que cambia el diseño de la ventana según sea necesario:

// Using ANSI versions of GetWindowLong and SetWindowLong because Unicode
// is not needed for these calls

lExStyles = GetWindowLongA(hWnd, GWL_EXSTYLE);

// Check whether new layout is opposite the current layout
if (!!(pLState -> IsRTLLayout) != !!(lExStyles & WS_EX_LAYOUTRTL))
{
    // the following lines will update the window layout

    lExStyles ^= WS_EX_LAYOUTRTL;        // toggle layout
    SetWindowLongA(hWnd, GWL_EXSTYLE, lExStyles);
    InvalidateRect(hWnd, NULL, TRUE);    // to update layout in the client area
}

En la creación de reflejo, debe pensar en términos de "cerca" y "lejos" en lugar de "izquierda" y "derecha". Si no lo hace, puede causar problemas. Una práctica de codificación común que provoca problemas en una ventana reflejada se produce al asignar entre coordenadas de pantalla y coordenadas de cliente. Por ejemplo, las aplicaciones suelen usar código similar al siguiente para colocar un control en una ventana:

// DO NOT USE THIS IF APPLICATION MIRRORS THE WINDOW

// get coordinates of the window in screen coordinates
GetWindowRect(hControl, (LPRECT) &rControlRect);  

// map screen coordinates to client coordinates in dialog
ScreenToClient(hDialog, (LPPOINT) &rControlRect.left); 
ScreenToClient(hDialog, (LPPOINT) &rControlRect.right);

Esto provoca problemas en la creación de reflejo porque el borde izquierdo del rectángulo se convierte en el borde derecho en una ventana reflejada y viceversa. Para evitar este problema, reemplace las llamadas ScreenToClient por una llamada a MapWindowPoints como se indica a continuación:

// USE THIS FOR MIRRORING

GetWindowRect(hControl, (LPRECT) &rControlRect);
MapWindowPoints(NULL, hDialog, (LPPOINT) &rControlRect, 2)

Este código funciona porque, en plataformas que admiten la creación de reflejo, MapWindowPoints se modifica para intercambiar las coordenadas de punto izquierdo y derecho cuando se refleja la ventana del cliente. Para obtener más información, vea la sección Comentarios de MapWindowPoints.

Otra práctica común que puede causar problemas en ventanas reflejadas es colocar objetos en una ventana de cliente mediante desplazamientos en coordenadas de pantalla en lugar de coordenadas de cliente. Por ejemplo, el código siguiente usa la diferencia en las coordenadas de pantalla como la posición x de las coordenadas del cliente para colocar un control en un cuadro de diálogo.

// OK if LTR layout and mapping mode of client is MM_TEXT,
// but WRONG for a mirrored dialog 

RECT rdDialog;
RECT rcControl;

HWND hControl = GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hDlg, &rcDialog);             // gets rect in screen coordinates
GetWindowRect(hControl, &rcControl);
MoveWindow(hControl,
           rcControl.left - rcDialog.left,  // uses x position in client coords
           rcControl.top - rcDialog.top,
           nWidth,
           nHeight,
           FALSE);

Este código es correcto cuando la ventana de diálogo tiene un diseño de izquierda a derecha (LTR) y el modo de asignación del cliente se MM_TEXT, porque la nueva posición x en las coordenadas del cliente corresponde a la diferencia en los bordes izquierdos del control y el cuadro de diálogo en coordenadas de pantalla. Sin embargo, en un cuadro de diálogo reflejado, se invierten la izquierda y la derecha, por lo que en su lugar debe usar MapWindowPoints de la siguiente manera:

RECT rcDialog;
RECT rcControl;

HWND hControl - GetDlgItem(hDlg, IDD_CONTROL);
GetWindowRect(hControl, &rcControl);

// MapWindowPoints works correctly in both mirrored and non-mirrored windows.
MapWindowPoints(NULL, hDlg, (LPPOINT) &rcControl, 2);

// Now rcControl is in client coordinates.
MoveWindow(hControl, rcControl.left, rcControl.top, nWidth, nHeight, FALSE)

Cuadros de diálogo de creación de reflejo y cuadros de mensaje

Los cuadros de diálogo y los cuadros de mensaje no heredan el diseño, por lo que debe establecer el diseño explícitamente. Para reflejar un cuadro de mensaje, llame a MessageBox o MessageBoxEx con la opción MB_RTLREADING . Para diseñar un cuadro de diálogo de derecha a izquierda, use el estilo extendido WS_EX_LAYOUTRTL en la estructura de plantillas de diálogo DLGTEMPLATEEX. Las hojas de propiedades son un caso especial de cuadros de diálogo. Cada pestaña se trata como un cuadro de diálogo independiente, por lo que debe incluir el estilo de WS_EX_LAYOUTRTL en cada pestaña que desee reflejar.

Creación de reflejo de contextos de dispositivo no asociados a una ventana

Los controladores de dominio que no están asociados a una ventana, como el metarchivo o los controladores de dominio de impresora, no heredan el diseño, por lo que debe establecer el diseño explícitamente. Para cambiar el diseño del contexto del dispositivo, use la función SetLayout .

La función SetLayout rara vez se usa con ventanas. Normalmente, las ventanas reciben un controlador de dominio asociado solo en el procesamiento de un mensaje de WM_PAINT . En ocasiones, un programa crea un controlador de dominio para una ventana mediante una llamada a GetDC. En cualquier caso, el diseño inicial del controlador de dominio se establece mediante BeginPaint o GetDC según la marca WS_EX_LAYOUTRTL de la ventana.

Los valores devueltos por GetWindowOrgEx, GetWindowExtEx, GetViewportOrgEx y GetViewportEx no se ven afectados llamando a SetLayout.

Cuando el diseño es RTL, GetMapMode devolverá MM_ANISOTROPIC en lugar de MM_TEXT. Llamar a SetMapMode con MM_TEXT funcionará correctamente; solo se ve afectado el valor devuelto de GetMapMode . Del mismo modo, llamar a SetLayout(hdc, LAYOUT_RTL) cuando el modo de asignación está MM_TEXT hace que el modo de asignación notificado cambie a MM_ANISOTROPIC.

Destrucción de ventanas

En general, una aplicación debe destruir todas las ventanas que crea. Para ello, se usa la función DestroyWindow . Cuando se destruye una ventana, el sistema oculta la ventana, si está visible y, a continuación, quita los datos internos asociados a la ventana. Esto invalida el identificador de ventana, que la aplicación ya no puede usar.

Una aplicación destruye muchas de las ventanas que crea poco después de crearlas. Por ejemplo, una aplicación normalmente destruye una ventana de cuadro de diálogo en cuanto la aplicación tiene suficiente entrada del usuario para continuar su tarea. Una aplicación finalmente destruye la ventana principal de la aplicación (antes de finalizar).

Antes de destruir una ventana, una aplicación debe guardar o quitar los datos asociados a la ventana y debe liberar los recursos del sistema asignados para la ventana. Si la aplicación no libera los recursos, el sistema liberará los recursos no liberados por la aplicación.

La destrucción de una ventana no afecta a la clase de ventana desde la que se crea la ventana. Todavía se pueden crear nuevas ventanas con esa clase y las ventanas existentes de esa clase siguen funcionando. Al destruir una ventana también se destruyen las ventanas descendientes de la ventana. La función DestroyWindow envía primero un mensaje WM_DESTROY a la ventana y, a continuación, a sus ventanas secundarias y a las ventanas descendientes. De este modo, todas las ventanas descendientes de la ventana que se destruyen también se destruyen.

Una ventana con un menú de ventana recibe un mensaje de WM_CLOSE cuando el usuario hace clic en Cerrar. Al procesar este mensaje, una aplicación puede pedir al usuario confirmación antes de destruir la ventana. Si el usuario confirma que se debe destruir la ventana, la aplicación puede llamar a la función DestroyWindow para destruir la ventana.

Si la ventana que se destruye es la ventana activa, los estados activos y de foco se transfieren a otra ventana. La ventana que se convierte en la ventana activa es la siguiente ventana, determinada por la combinación de teclas ALT+ESC. A continuación, la nueva ventana activa determina qué ventana recibe el foco del teclado.