La diferencia entre el propietario de la ventana principal y el propietario de la ventana

Conceptos y diferencias

En el sistema Windows, cada objeto de ventana corresponde a una estructura de datos, formando una lista. El administrador de ventanas del sistema utiliza esta lista para obtener información de las ventanas y administrar cada ventana. Hay cuatro datos en esta estructura de datos que se utilizan para crear la lista, a saber, los cuatro campos de hijo, hermano, padre y propietario.

Así que podemos ver que existen dos tipos de relaciones entre ventanas: relación de propiedad del propietario y relación padre-hijo. La primera se denomina relación de propiedad/propiedad y la segunda se denomina relación de padre/hijo. En este artículo, llamo ventana del propietario ventana del propietario. En otras palabras, si bien una ventana tiene una ventana principal (parent), también puede ser propiedad de diferentes ventanas (owner) o puede tener su propia ventana secundaria (child). En la clase CWnd de MFC, la ventana propietaria se almacena en la variable miembro m_hWndOwner y la ventana principal se almacena en m_hParent, pero estos dos valores no necesariamente corresponden a los valores en la estructura de datos del objeto de ventana.

La relación entre ventanas determina el rendimiento externo de las ventanas. Como exhibición, destrucción, etc.

Si el campo de propietario de los datos de una ventana no es NULL, establece una relación de propiedad del propietario con la ventana. La relación de propiedad determina:

(1) La ventana de propiedad será. siempre se mostrará delante de la ventana propietaria;

(2) Cuando la ventana propietaria se minimiza, todas las ventanas que posee se ocultarán;

(3) Cuando el propietario La ventana se minimiza. Cuando se destruye una ventana, se destruirán todas las ventanas que posee.

Cabe señalar que ocultar la ventana propietaria no afecta el estado visible de la ventana que posee. Por ejemplo: si la ventana A es propietaria de la ventana B y la ventana B es propietaria de la ventana C, cuando se minimiza la ventana A, la ventana B está oculta, pero la ventana C sigue siendo visible.

Si el campo principal de una ventana no es NULL, se establece una relación padre-hijo entre él y la ventana. El padre y el hijo decidieron:

(1) La posición de visualización de la ventana en la pantalla. La ventana principal proporciona el sistema de coordenadas utilizado para posicionar la ventana secundaria. Una ventana secundaria solo se puede mostrar en el área del cliente de su ventana principal, y las partes exteriores se recortarán. Esta regla de recorte determina que si la ventana principal no es visible, la ventana secundaria no debe ser visible. Si la ventana principal sale de la pantalla, también lo hace la ventana secundaria.

(2) Cuando la ventana principal está oculta, todas sus ventanas secundarias también están ocultas.

(3) Cuando se destruye la ventana principal, se destruirán todas las ventanas secundarias que posee.

¡Atención! Minimizar la ventana principal no afectará el estado visible de la ventana secundaria. La ventana secundaria se minimizará junto con la ventana principal, pero su atributo WS_VISIBLE no cambiará.

¿Por qué el sistema Windows utiliza dos relaciones? Esto es para ventanas de administración más flexibles. Por ejemplo: el cuadro de lista desplegable de un cuadro combinado puede extenderse más allá del área de cliente de la ventana principal del cuadro combinado, lo que facilita la visualización. Por lo tanto, cuando el sistema crea el cuadro de lista, se utiliza como ventana de consola. ), su ventana principal hWndParent es NULL. De esta manera, el área de visualización del cuadro de lista está limitada a toda la pantalla, pero el propietario del cuadro de lista es el primer antecesor de la ventana no secundaria del cuadro combinado (por ejemplo). como cuadro de diálogo), el cuadro de lista se destruye automáticamente cuando se destruye la ventana de su propietario.

Además, la transmisión de mensajes entre ventanas también está relacionada con la relación de la ventana. Normalmente, una ventana enviará su mensaje de notificación a su ventana principal, pero este no es siempre el caso. Por ejemplo, CToolBar. envía un mensaje de notificación a su ventana propietaria en lugar de a la ventana principal. Esto permite que la barra de herramientas sea una ventana secundaria de una ventana (como la ventana de un programa contenedor OLE) y al mismo tiempo envíe mensajes a otra ventana (como una ventana de marco local). En cuanto a a quién envía mensajes un determinado tipo de ventana, ya sea la ventana principal o la ventana propietaria, Microsoft no lo ha dejado claro.

Además, en el caso de la edición in situ, cuando se activa o desactiva una ventana del servidor, la ventana secundaria propiedad de la ventana del marco se oculta o muestra automáticamente. Esto también se logra llamando directamente a la función SetOwner.