Implementación de mensajes del mecanismo de procesamiento de mensajes de Windows
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