Acerca de Windows
En este tema se describen los elementos de programación que las aplicaciones usan para crear y usar ventanas; administrar relaciones entre ventanas; y tamaño, mover y mostrar ventanas.
La información general incluye los temas siguientes.
- Ventana de escritorio
- Ventanas de aplicación
- Controles y cuadros de diálogo
- Atributos de ventana
- Creación de ventanas
Ventana de escritorio
Al iniciar el sistema, se crea automáticamente la ventana de escritorio. La ventana de escritorio es una ventana definida por el sistema que pinta el fondo de la pantalla y sirve como base para todas las ventanas mostradas por todas las aplicaciones.
La ventana de escritorio usa un mapa de bits para pintar el fondo de la pantalla. El patrón creado por el mapa de bits se denomina fondo de pantalla de escritorio. De forma predeterminada, la ventana de escritorio usa el mapa de bits de un archivo de .bmp especificado en el registro como fondo de pantalla del escritorio.
La función GetDesktopWindow devuelve un identificador a la ventana de escritorio.
Una aplicación de configuración del sistema, como un elemento de Panel de control, cambia el fondo de pantalla de escritorio mediante la función SystemParametersInfo con el parámetro wAction establecido en SPI_SETDESKWALLPAPER y el parámetro lpvParam que especifica un nombre de archivo de mapa de bits. A continuación, SystemParametersInfo carga el mapa de bits del archivo especificado, usa el mapa de bits para pintar el fondo de la pantalla y escribe el nuevo nombre de archivo en el Registro.
Ventanas de aplicación
Cada aplicación gráfica basada en Windows crea al menos una ventana, denominada ventana principal, que actúa como interfaz principal entre el usuario y la aplicación. La mayoría de las aplicaciones también crean otras ventanas, ya sea directa o indirectamente, para realizar tareas relacionadas con la ventana principal. Cada ventana desempeña una parte en la visualización de la salida y la recepción de la entrada del usuario.
Al iniciar una aplicación, el sistema también asocia un botón de barra de tareas a la aplicación. El botón de la barra de tareas contiene el icono y el título del programa. Cuando la aplicación está activa, su botón de barra de tareas se muestra en estado insertado.
Una ventana de aplicación incluye elementos como una barra de título, una barra de menús, el menú de ventana (anteriormente conocido como menú del sistema), el botón minimizar, el botón maximizar, el botón de restauración, el botón cerrar, un borde de tamaño, un área de cliente, una barra de desplazamiento horizontal y una barra de desplazamiento vertical. La ventana principal de una aplicación suele incluir todos estos componentes. En la ilustración siguiente se muestran estos componentes en una ventana principal típica.
Área de cliente
El área cliente es la parte de una ventana en la que la aplicación muestra la salida, como texto o gráficos. Por ejemplo, una aplicación de publicación de escritorio muestra la página actual de un documento en el área cliente. La aplicación debe proporcionar una función, denominada procedimiento de ventana, para procesar la entrada en la ventana y mostrar la salida en el área cliente. Para más información, vea Procedimientos de ventanas.
Área no cliente
La barra de título, la barra de menús, el menú de ventanas, minimizar y maximizar botones, el borde de tamaño y las barras de desplazamiento se conocen colectivamente como área no cliente de la ventana. El sistema administra la mayoría de los aspectos del área no cliente; la aplicación administra la apariencia y el comportamiento de su área cliente.
La barra de título muestra un icono definido por la aplicación y una línea de texto; Normalmente, el texto especifica el nombre de la aplicación o indica el propósito de la ventana. Una aplicación especifica el icono y el texto al crear la ventana. La barra de título también permite al usuario mover la ventana mediante un mouse u otro dispositivo señalador.
La mayoría de las aplicaciones incluyen una barra de menús que enumera los comandos admitidos por la aplicación. Los elementos de la barra de menús representan las categorías principales de comandos. Al hacer clic en un elemento de la barra de menús, normalmente se abre un menú emergente cuyos elementos corresponden a las tareas de una categoría determinada. Al hacer clic en un comando, el usuario dirige a la aplicación para llevar a cabo una tarea.
El sistema crea y administra el menú de la ventana . Contiene un conjunto estándar de elementos de menú que, cuando el usuario lo elige, establece el tamaño o la posición de una ventana, cierra la aplicación o realiza tareas. Para obtener más información, vea Menús.
Los botones de la esquina superior derecha afectan al tamaño y la posición de la ventana. Al hacer clic en el botón maximizar, el sistema amplía la ventana al tamaño de la pantalla y coloca la ventana, por lo que cubre todo el escritorio, menos la barra de tareas. Al mismo tiempo, el sistema reemplaza el botón maximizar por el botón de restauración. Al hacer clic en el botón restaurar, el sistema restaura la ventana a su tamaño y posición anteriores. Al hacer clic en el botón minimizar, el sistema reduce la ventana al tamaño de su botón de la barra de tareas, coloca la ventana sobre el botón de la barra de tareas y muestra el botón de la barra de tareas en su estado normal. Para restaurar la aplicación a su tamaño y posición anteriores, haga clic en el botón de la barra de tareas. Al hacer clic en el botón Cerrar, se cierra la aplicación.
El borde de ajuste de tamaño es un área alrededor del perímetro de la ventana que permite al usuario ajustar el tamaño de la ventana mediante un mouse u otro dispositivo señalador.
La barra de desplazamiento horizontal y la barra de desplazamiento vertical convierten la entrada del mouse o del teclado en valores que una aplicación usa para desplazar el contenido del área cliente de forma horizontal o vertical. Por ejemplo, una aplicación de procesamiento de texto que muestra un documento largo normalmente proporciona una barra de desplazamiento vertical para permitir al usuario desplazarse hacia arriba y hacia abajo a través del documento.
Controles y cuadros de diálogo
Una aplicación puede crear varios tipos de ventanas además de su ventana principal, incluidos controles y cuadros de diálogo.
Un control es una ventana que una aplicación usa para obtener un fragmento de información específico del usuario, como el nombre de un archivo para abrir o el tamaño de punto deseado de una selección de texto. Las aplicaciones también usan controles para obtener información necesaria para controlar una característica determinada de una aplicación. Por ejemplo, una aplicación de procesamiento de texto normalmente proporciona un control para permitir que el usuario active y desactive el ajuste de palabras. Para obtener más información, vea Controles de Windows.
Los controles siempre se usan junto con otra ventana, normalmente, un cuadro de diálogo. Un cuadro de diálogo es una ventana que contiene uno o varios controles. Una aplicación usa un cuadro de diálogo para solicitar al usuario la entrada necesaria para completar un comando. Por ejemplo, una aplicación que incluye un comando para abrir un archivo mostraría un cuadro de diálogo que incluye controles en los que el usuario especifica una ruta de acceso y un nombre de archivo. Normalmente, los cuadros de diálogo no usan el mismo conjunto de componentes de ventana que una ventana principal. La mayoría tiene una barra de título, un menú de ventanas, un borde (sin ajuste de tamaño) y un área de cliente, pero normalmente no tienen una barra de menús, minimizar y maximizar botones o barras de desplazamiento. Para obtener más información, vea Cuadros de diálogo.
Un cuadro de mensaje es un cuadro de diálogo especial que muestra una nota, precaución o advertencia al usuario. Por ejemplo, un cuadro de mensaje puede informar al usuario de un problema que ha encontrado la aplicación al realizar una tarea. Para obtener más información, vea Cuadros de mensaje.
Atributos de ventana
Una aplicación debe proporcionar la siguiente información al crear una ventana. (Con la excepción del identificador de ventana, que la función de creación devuelve para identificar de forma única la nueva ventana).
- Nombre de la clase
- Nombre de la ventana
- Estilo de ventana
- Estilo de ventana extendida
- Posición
- Tamaño
- Identificador de ventana primario o propietario
- Identificador de menú o identificador de Child-Window
- Identificador de instancia de aplicación
- Datos de creación
- Identificador de ventana
Estos atributos de ventana se describen en las secciones siguientes.
Class Name (Nombre de clase)
Cada ventana pertenece a una clase de ventana. Una aplicación debe registrar una clase de ventana antes de crear las ventanas de esa clase. La clase de ventana define la mayoría de los aspectos de la apariencia y el comportamiento de una ventana. El componente principal de una clase de ventana es el procedimiento de ventana, una función que recibe y procesa todas las entradas y solicitudes enviadas a la ventana. El sistema proporciona la entrada y las solicitudes en forma de mensajes. Para obtener más información, vea Clases de ventana, procedimientos de ventana y mensajes y colas de mensajes.
Nombre de la ventana
Un nombre de ventana es una cadena de texto que identifica una ventana para el usuario. Normalmente, una ventana principal, un cuadro de diálogo o un cuadro de mensaje muestra su nombre de ventana en su barra de título, si está presente. Un control puede mostrar su nombre de ventana, según la clase del control. Por ejemplo, los botones, los controles de edición y los controles estáticos muestran sus nombres de ventana dentro del rectángulo ocupado por el control. Sin embargo, los controles como cuadros de lista y cuadros combinados no muestran sus nombres de ventana.
Para cambiar el nombre de la ventana después de crear una ventana, use la función SetWindowText . Esta función usa las funciones GetWindowTextLength y GetWindowText para recuperar la cadena actual de nombre de ventana de la ventana.
Estilo de ventana
Cada ventana tiene uno o varios estilos de ventana. Un estilo de ventana es una constante con nombre que define un aspecto de la apariencia y el comportamiento de la ventana que no se especifica en la clase de la ventana. Normalmente, una aplicación establece estilos de ventana al crear ventanas. También puede establecer los estilos después de crear una ventana mediante la función SetWindowLong .
El sistema y, en cierta medida, el procedimiento de ventana de la clase interpretan los estilos de ventana.
Algunos estilos de ventana se aplican a todas las ventanas, pero la mayoría se aplican a las ventanas de clases de ventana específicas. Los estilos de ventana generales se representan mediante constantes que comienzan por el prefijo WS_; se pueden combinar con el operador OR para formar diferentes tipos de ventanas, incluidas las ventanas principales, los cuadros de diálogo y las ventanas secundarias. Los estilos de ventana específicos de la clase definen la apariencia y el comportamiento de las ventanas que pertenecen a las clases de control predefinidas. Por ejemplo, la clase SCROLLBAR especifica un control de barra de desplazamiento, pero los estilos SBS_HORZ y SBS_VERT determinan si se crea un control de barra de desplazamiento horizontal o vertical.
Para obtener listas de estilos que pueden usar las ventanas, consulte los temas siguientes:
- Estilos de ventana
- Estilos de botón
- Estilos de cuadro combinado
- Editar estilos de control
- Estilos de cuadro de lista
- Estilos de control de edición enriquecidos
- Estilos de control de barra de desplazamiento
- Estilos de control estáticos
Estilo de ventana extendida
Cada ventana puede tener opcionalmente uno o varios estilos de ventana extendidos. Un estilo de ventana extendida es una constante con nombre que define un aspecto de la apariencia y el comportamiento de la ventana que no especifica la clase de ventana o los demás estilos de ventana. Normalmente, una aplicación establece estilos de ventana extendidos al crear ventanas. También puede establecer los estilos después de crear una ventana mediante la función SetWindowLong .
Para obtener más información, vea CreateWindowEx.
Posición
La posición de una ventana se define como coordenadas de su esquina superior izquierda. Estas coordenadas, a veces llamadas coordenadas de ventana, siempre son relativas a la esquina superior izquierda de la pantalla o, para una ventana secundaria, la esquina superior izquierda del área cliente de la ventana primaria. Por ejemplo, una ventana de nivel superior que tiene las coordenadas (10,10) se coloca 10 píxeles a la derecha de la esquina superior izquierda de la pantalla y 10 píxeles hacia abajo. Una ventana secundaria que tiene las coordenadas (10,10) se coloca 10 píxeles a la derecha de la esquina superior izquierda del área cliente de su ventana primaria y 10 píxeles hacia abajo.
La función WindowFromPoint recupera un identificador de la ventana que ocupa un punto determinado en la pantalla. Del mismo modo, las funciones ChildWindowFromPoint y ChildWindowFromPointEx recuperan un identificador de la ventana secundaria que ocupa un punto determinado en el área de cliente de la ventana primaria. Aunque ChildWindowFromPointEx puede omitir ventanas secundarias invisibles, deshabilitadas y transparentes, ChildWindowFromPoint no.
Size
El tamaño de una ventana (ancho y alto) se asigna en píxeles. Una ventana puede tener un ancho o alto cero. Si una aplicación establece el ancho y el alto de una ventana en cero, el sistema establece el tamaño en el tamaño mínimo predeterminado de la ventana. Para detectar el tamaño de ventana mínimo predeterminado, una aplicación usa la función GetSystemMetrics con las marcas SM_CXMIN y SM_CYMIN .
Es posible que una aplicación tenga que crear una ventana con un área cliente de un tamaño determinado. Las funciones AdjustWindowRect y AdjustWindowRectEx calculan el tamaño necesario de una ventana en función del tamaño deseado del área de cliente. La aplicación puede pasar los valores de tamaño resultantes a la función CreateWindowEx .
Una aplicación puede ajustar el tamaño de una ventana para que sea extremadamente grande; sin embargo, no debe cambiar el tamaño de una ventana para que sea mayor que la pantalla. Antes de establecer el tamaño de una ventana, la aplicación debe comprobar el ancho y el alto de la pantalla mediante GetSystemMetrics con las marcas SM_CXSCREEN y SM_CYSCREEN .
Identificador de ventana primario o propietario
Una ventana puede tener una ventana primaria. Una ventana que tiene un elemento primario se denomina ventana secundaria. La ventana primaria proporciona el sistema de coordenadas que se usa para colocar una ventana secundaria. Tener una ventana primaria afecta a aspectos de la apariencia de una ventana; por ejemplo, se recorta una ventana secundaria para que ninguna parte de la ventana secundaria pueda aparecer fuera de los bordes de su ventana primaria.
Una ventana que no tiene ningún elemento primario o cuyo elemento primario es la ventana de escritorio, se denomina ventana de nivel superior. Una aplicación puede usar la función EnumWindows para obtener un identificador para cada ventana de nivel superior de la pantalla. EnumWindows pasa el identificador a cada ventana de nivel superior, a su vez, a una función de devolución de llamada definida por la aplicación, EnumWindowsProc.
Una ventana de nivel superior puede ser propietaria o propiedad de otra ventana. Una ventana propiedad siempre aparece delante de su ventana de propietario, se oculta cuando se minimiza su ventana de propietario y se destruye cuando se destruye su ventana de propietario. Para obtener más información, consulte Propiedad de Windows.
Identificador de menú o identificador de Child-Window
Una ventana secundaria puede tener un identificador de ventana secundaria, un valor único definido por la aplicación asociado a la ventana secundaria. Los identificadores de ventana secundaria son especialmente útiles en las aplicaciones que crean varias ventanas secundarias. Al crear una ventana secundaria, una aplicación especifica el identificador de la ventana secundaria. Después de crear la ventana, la aplicación puede cambiar el identificador de la ventana mediante la función SetWindowLong , o bien puede recuperar el identificador mediante la función GetWindowLong .
Todas las ventanas, excepto una ventana secundaria, pueden tener un menú. Una aplicación puede incluir un menú proporcionando un identificador de menú al registrar la clase de la ventana o al crear la ventana.
Identificador de instancia de aplicación
Cada aplicación tiene asociado un identificador de instancia. El sistema proporciona el identificador de instancia a una aplicación cuando se inicia la aplicación. Dado que puede ejecutar varias copias de la misma aplicación, el sistema usa identificadores de instancia internamente para distinguir una instancia de una aplicación de otra. La aplicación debe especificar el identificador de instancia en muchas ventanas diferentes, incluidas las que crean ventanas.
Datos de creación
Cada ventana puede tener datos de creación definidos por la aplicación asociados. Cuando se crea la ventana por primera vez, el sistema pasa un puntero a los datos del procedimiento de ventana de la ventana que se va a crear. El procedimiento de ventana usa los datos para inicializar variables definidas por la aplicación.
Identificador de ventana
Después de crear una ventana, la función de creación devuelve un identificador de ventana que identifica de forma única la ventana. Un identificador de ventana tiene el tipo de datos HWND ; Una aplicación debe usar este tipo al declarar una variable que contiene un identificador de ventana. Una aplicación usa este identificador en otras funciones para dirigir sus acciones a la ventana.
Una aplicación puede usar la función FindWindow para detectar si existe una ventana con el nombre de clase o el nombre de ventana especificados en el sistema. Si existe una ventana de este tipo, FindWindow devuelve un identificador a la ventana. Para limitar la búsqueda a las ventanas secundarias de una aplicación determinada, use la función FindWindowEx .
La función IsWindow determina si un identificador de ventana identifica una ventana válida y existente. Hay constantes especiales que pueden reemplazar un identificador de ventana en determinadas funciones. Por ejemplo, una aplicación puede usar HWND_BROADCAST en las funciones SendMessage y SendMessageTimeout, o HWND_DESKTOP en la función MapWindowPoints.
Creación de ventanas
Para crear ventanas de aplicación, use la función CreateWindow o CreateWindowEx . Debe proporcionar la información necesaria para definir los atributos de la ventana. CreateWindowEx tiene un parámetro, dwExStyle, que CreateWindow no tiene; de lo contrario, las funciones son idénticas. De hecho, CreateWindow simplemente llama a CreateWindowEx con el parámetro dwExStyle establecido en cero. Por este motivo, el resto de esta información general solo hace referencia a CreateWindowEx.
Esta sección contiene los siguientes temas:
Nota
Hay funciones adicionales para crear ventanas de propósito especial, como cuadros de diálogo y cuadros de mensaje. Para obtener más información, vea DialogBox, CreateDialog y MessageBox.
Creación de la ventana principal
Cada aplicación basada en Windows debe tener WinMain como su función de punto de entrada. WinMain realiza varias tareas, incluido el registro de la clase de ventana para la ventana principal y la creación de la ventana principal. WinMain registra la clase de ventana principal llamando a la función RegisterClass y crea la ventana principal llamando a la función CreateWindowEx .
La función WinMain también puede limitar la aplicación a una sola instancia. Cree una exclusión mutua con nombre mediante la función CreateMutex . Si GetLastError devuelve ERROR_ALREADY_EXISTS, existe otra instancia de la aplicación (creó la exclusión mutua) y debería salir de WinMain.
El sistema no muestra automáticamente la ventana principal después de crearla; en su lugar, una aplicación debe usar la función ShowWindow para mostrar la ventana principal. Después de crear la ventana principal, la función WinMain de la aplicación llama a ShowWindow, pasando dos parámetros: un identificador a la ventana principal y una marca que especifica si la ventana principal debe minimizarse o maximizarse cuando se muestra por primera vez. Normalmente, la marca se puede establecer en cualquiera de las constantes que comienzan por el prefijo SW_. Sin embargo, cuando se llama a ShowWindow para mostrar la ventana principal de la aplicación, la marca debe establecerse en SW_SHOWDEFAULT. Esta marca indica al sistema que muestre la ventana como indica el programa que inició la aplicación.
Si una clase de ventana se registró con la versión Unicode de RegisterClass, la ventana recibe solo mensajes Unicode. Para determinar si una ventana usa el juego de caracteres Unicode o no, llame a IsWindowUnicode.
mensajes de Window-Creation
Al crear cualquier ventana, el sistema envía mensajes al procedimiento de ventana para la ventana. El sistema envía el mensaje WM_NCCREATE después de crear el área no cliente de la ventana y el mensaje WM_CREATE después de crear el área cliente. El procedimiento de ventana recibe ambos mensajes antes de que el sistema muestre la ventana. Ambos mensajes incluyen un puntero a una estructura CREATESTRUCT que contiene toda la información especificada en la función CreateWindowEx . Normalmente, el procedimiento de ventana realiza tareas de inicialización al recibir estos mensajes.
Al crear una ventana secundaria, el sistema envía el mensaje WM_PARENTNOTIFY a la ventana primaria después de enviar el WM_NCCREATE y WM_CREATE mensajes. También envía otros mensajes al crear una ventana. El número y el orden de estos mensajes dependen de la clase y el estilo de la ventana y de la función utilizada para crear la ventana. Estos mensajes se describen en otros temas de este archivo de ayuda.
Aplicaciones multiproceso
Una aplicación basada en Windows puede tener varios subprocesos de ejecución y cada subproceso puede crear ventanas. El subproceso que crea una ventana debe contener el código para su procedimiento de ventana.
Una aplicación puede usar la función EnumThreadWindows para enumerar las ventanas creadas por un subproceso determinado. Esta función pasa el identificador a cada ventana del subproceso, a su vez, a una función de devolución de llamada definida por la aplicación, EnumThreadWndProc.
La función GetWindowThreadProcessId devuelve el identificador del subproceso que creó una ventana determinada.
Para establecer el estado de presentación de una ventana creada por otro subproceso, use la función ShowWindowAsync .