Colección de citas famosas - Diccionario de frases chinas - Implementación de mensajes del mecanismo de procesamiento de mensajes de Windows

Implementación de mensajes del mecanismo de procesamiento de mensajes de Windows

¿Cómo se muestran Windows Forms en la pantalla? Como todos sabemos, se implementa mediante dibujo API. El sistema operativo Windows proporciona una serie de funciones API para implementar la función de dibujo de la interfaz, como:

Dibujar texto

DrawEdge dibujar borde

Icono de dibujo Icono de dibujo

p>

Mapa de bits dibujo mapa de bits

Rectángulo dibujo rectángulo

No importa cuán compleja sea la interfaz del programa, es implementado por estas funciones.

Entonces, ¿cuándo se llaman estas funciones? Obviamente, necesitamos un centro de control para emitir comandos, y también necesitamos un mecanismo de transmisión de comandos para entregar los comandos a su destino de inmediato. Este centro de control es una fuente de energía, al igual que el corazón, que bombea sangre continuamente a todas partes. Este mecanismo de transmisión de comandos es el mecanismo de mensajería de Windows. Los mensajes de Windows son como la sangre en el cuerpo, los mensajeros que entregan órdenes.

El Centro de control de mensajes de Windows suele ser una estructura de tres capas, con el kernel de Windows en la parte superior. El kernel de Windows mantiene una cola de mensajes y el centro de control secundario obtiene los mensajes bajo su jurisdicción de esta cola de mensajes y luego los procesa. Algunos mensajes se procesan directamente, mientras que otros se envían a ventanas o controles de nivel inferior. El centro de control secundario es generalmente el objeto de aplicación de cada aplicación de Windows. El centro de control de tercer nivel es el objeto Windows Form. Cada formulario tiene un proceso de formulario predeterminado, que es responsable de procesar varios mensajes recibidos. Como se muestra en la siguiente figura:

(Nota: Windows se refiere al sistema operativo Windows; ventana: es decir, una ventana de Windows; formulario: incluye ventanas y controles con identificadores; un control se refiere a un control, que en sí mismo puede no ser una ventana; es posible que la aplicación no utilice el mecanismo de mensajes de Windows. Aquí analizamos las aplicaciones de bucle de mensajes)

Los mensajes se transmiten a la aplicación en una estructura fija, como se muestra a continuación.

Mensaje de tipo público

hwnd tiene la misma longitud

Longitud del mensaje

wParam tiene la misma longitud

lParam Misma duración

Misma duración de tiempo

pt que POINTAPI

Tipo de fin

Donde hwnd es el identificador del formulario, mensaje es el tipo de mensaje indicado. Las constantes del mensaje, wParam y lParam son información adicional de 32 bits, que depende del tipo de mensaje, el tiempo es el momento en que se envía el mensaje y pt es la posición del mouse cuando se envía el mensaje. enviado.

El sistema operativo Windows incluye los siguientes mensajes:

1. Mensajes estándar de Windows:

Este mensaje comienza con WM_.

2. Mensajes de notificación

Los mensajes de notificación son mensajes de controles estándar de Windows. Estos controles incluyen: botones, cuadros combinados, cuadros de edición, cuadros de lista, controles de vista de lista, controles de vista de árbol, barras de herramientas, menús, etc. Cada mensaje comienza con una cadena diferente.

3. Mensajes personalizados

Los programadores también pueden personalizar los mensajes. No todos los controles pueden recibir mensajes, reenviar mensajes y dibujarse a sí mismos. Sólo los controles con manijas pueden hacer esto. Un control con un identificador es esencialmente una ventana. Puede existir de forma independiente y puede usarse como contenedor para otros controles, mientras que un control sin identificador (como una etiqueta) no puede existir de forma independiente y solo puede usarse como un control secundario de. un control de ventana. No pueden dibujar por sí mismos y solo pueden confiar en la forma principal para dibujar.

La esencia del identificador es un valor de 32 bits mantenido automáticamente por el sistema, que es único en todo momento en todo el sistema operativo. Sin embargo, cuando se libera el formulario representado por el identificador, el identificador también se liberará y otros formularios podrán utilizar el valor. Es decir, el valor del identificador es dinámico y es sólo un identificador único. El sistema operativo utiliza identificadores para identificar y encontrar el objeto que representa.

Sin embargo, no todos los controladores son controladores de ventana. Hay muchos otros tipos de controladores en los sistemas Windows, como controladores de lienzo (hdc), controladores de pincel, controladores de pincel y controladores de aplicaciones. Este identificador no puede recibir mensajes. Pero no importa qué tipo de identificador sea, es el identificador único del objeto en el sistema. Este artículo solo analiza los identificadores de formulario.

Entonces, ¿por qué las manijas hacen que las ventanas sean tan únicas? En realidad todo es por la noticia. Gracias a los identificadores, el formulario puede recibir mensajes, por lo que sabe cuándo dibujarse, dibujar controles secundarios y sabe cuándo hizo clic el mouse en qué parte de la ventana para poder actuar en consecuencia. El mango es como el documento de identidad de una persona. Con él, puedes participar en diversas actividades sociales; de lo contrario, o eres un hombre negro invisible para la sociedad o puedes seguir a otros y demostrar tu existencia a través de otros. 1. Obtener mensajes de la cola de mensajes:

Puedes obtener mensajes de la cola de mensajes de Windows a través de la función PeekMessage o GetMessage. Windows guarda las colas de mensajes agrupadas por hilo, lo que significa que cada hilo tiene su propia cola de mensajes.

2. Enviar un mensaje

El envío de un mensaje a un formulario específico generalmente se realiza a través de las dos funciones siguientes: SendMessage y PostMessage. La diferencia entre estas dos funciones es que la función PostMessage solo agrega un mensaje a la cola de mensajes del hilo. Si el mensaje se agregó correctamente, se devuelve True; de ​​lo contrario, se devuelve False y se desconoce si el mensaje se procesó o el resultado del procesamiento. SendMessage, por otro lado, es un poco diferente. En lugar de agregar el mensaje a la cola, lo traduce directamente y llama al procesamiento de mensajes (es decir, el hilo se envía el mensaje a sí mismo) y no regresa hasta que se completa el procesamiento del mensaje. Por tanto, si queremos que el mensaje enviado se ejecute inmediatamente, debemos llamar a SendMessage.

Otro punto es que los mensajes enviados por SendMessage no se agregarán a la cola de mensajes (error: los mensajes enviados por hilos a otros hilos también se agregarán a las colas de mensajes de otros hilos, incluso si estos dos hilos en el mismo proceso), por lo que el mensaje enviado por SendMessage no se puede obtener a través de PeekMessage o GetMessage.

Además, PostMessage no puede procesar correctamente algunos mensajes, como wm_settext. Entonces no todos los mensajes pueden usar PostMessage.

Existen otras funciones API para enviar mensajes, como PostThreadMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage, etc. El flujo de mensajes es la razón fundamental por la que las aplicaciones siguen existiendo. Si el bucle sale, la aplicación finaliza.

Echemos un vistazo al bucle de mensajes encapsulado en Delphi:

Paso 1: El programa comienza a ejecutarse.

Aplicar. Inicialización; //Inicialización

Aplicación. crear formulario(t formulario 1, formulario 1); //Crear el formulario principal

Aplicación. run; //Comienza a ejecutar y prepara el bucle de mensajes.

La aplicación puede existir y ejecutarse si no se crea el formulario principal.

Paso 2: Comienza a llamar a HandleMessage.

Aplicación del programa. Ejecutando;

Iniciar

f ejecución: = True;

Intentar

AddExitProc(aplicación terminada);

si FMainForm tiene cero

Inicio

Visualización de caso

SW_SHOWMINNOACTIVE: FMainForm.

FWindowState:= ws minimizado;

SW_SHOWMAXIMIZED: MainFormwindow estado:= ws maximizado;

Fin;

Si FShowMainForm entonces

Si FMainForm . FWindowState = wsMinimized y luego

Minimizar else

FMainForm. visible:=True;

Repetir // NOTA: Comienza el bucle.

Intente

HandleMessage

Excepto...

manejar la excepción (Self);

Fin;

Hasta la terminación; //Condición de fin del bucle

Fin;

Finalmente

f en ejecución:= False;

Fin;

Fin;

Paso 3: Procesar el mensaje en el ciclo de mensajes.

Aplicación del programa. HandleMessage

Definir variables

msg: TMsg;

Inicio

Si no es un mensaje de proceso (Msg), está inactivo ( Msg) ;

Fin;

Aplicación de función. mensaje de proceso (var Msg: TMsg): booleano

Definir variable

manejado: booleano

Inicio

Resultado: = Falso;

Si PeekMessage(Msg, 0, 0, 0, PM_REMOVE), entonces

Iniciar

Resultado: = Verdadero

Si MSG . Mensaje lt gt Luego salir

Inicio

Procesado: = Falso

Si está asignado (FOnMessage), es FOnMessage (Msg, Handled)

;

Si no es intmsg(Msg) y no se maneja, entonces no es IsMDIMsg(Msg), y

no es IsKeyMsg(Msg) ni IsDlgMsg(Msg), entonces

Iniciar

TranslateMessage

DispatchMessage

Fin;

Fin

Otros

f terminar := Verdadero;

Fin;

Fin;

El proceso del formulario es en realidad una función de devolución de llamada. La llamada función de devolución de llamada es en realidad una función llamada por el sistema operativo Windows o un programa externo. Las funciones de devolución de llamada generalmente tienen un formato de parámetro específico y se pasan a la persona que llama por dirección. El sistema operativo Windows llamó en el proceso de ventana. Al crear una ventana, debe pasar la dirección de la función de devolución de llamada al asignar el identificador del formulario. Entonces, ¿por qué no solemos ver esta función de devolución de llamada en la programación? Esto se debe a que nuestra herramienta de programación ha generado un procedimiento de formulario predeterminado para nosotros. Lo que este programa debe hacer es determinar diferentes tipos de mensajes y luego manejarlos de manera diferente. Por ejemplo, se pueden generar eventos para la entrada del teclado o del mouse, etc. Los eventos son esencialmente encapsulaciones de mensajes y son herramientas útiles proporcionadas por el entorno de programación IDE para simplificar la programación. Esta encapsulación se implementa en el proceso del formulario.

Cada IDE encapsula muchos mensajes de Windows, por ejemplo, mensajes de eventos sobre activar WM_activate onclick WM_xbuttondowoncreate WM_createondblclick WM_xbuttonblclick onkeydownwm_keydowonkeypress. WM _ CHAR OnKeyUp WIN _ KEYUP OnPaint WM _ PAINT al cambiar el tamaño WM _ TAMAÑO en TIMER WM _ TIMER