2010-12-08 21 views
6

Estoy creando un programa win32 simple con una ventana principal y un cuadro de diálogo no modal.Pregunta sobre IsDialogMessage() en WIN32

Sé que usando IsDialogMessage() el programa enviará mensajes a la ventana no modal (como eventos de teclado).

// step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    if(!IsDialogMessage(g_hToolbar, &Msg)) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 
} 

Pero sin utilizar IsDialogMessage(), la ventana no modal aún así obtener los acontecimientos, como hacer clic y algunos otros eventos distribuidos por el ratón.

¿Por qué? ¿Cómo puede este modo no modal obtener estos mensajes si el bucle principal no le está enviando mensajes?

Solo quiero saber cómo funciona internamente.

Respuesta

6

IsDialogMessage filtra algunos de los mensajes, pero permite que la mayoría de los mensajes lleguen a la parte TranslateMessage/DispatchMessage del bucle de mensajes y se envíen normalmente.

La razón por la que IsDialogMessage tiene que procesar algunos mensajes es porque los mensajes iban a enviarse a la ventana incorrecta.

Considere - normalmente - los mensajes de pulsación se entregan al control con enfoque. Sin embargo, la combinación de teclas con tabulador está destinada a mover el foco al siguiente control en el diálogo. En lugar de hacer que todos los controles tengan que procesar tabulaciones, IsDialogMessage detecta las pulsaciones de tecla de tabulación antes de que se entreguen al control actualmente enfocado, y garantiza que el código del cuadro de diálogo maneje la lógica de tabulación.

La mayoría de los otros mensajes (como sobres y pintura de mouse, etc.) se enviarán de todos modos a la ventana de cuadros de diálogo, por lo que se manejan de la forma habitual. Es realmente solo el subconjunto de mensajes que estaban destinados a ser enviados a los controles, pero necesitan ser manejados por el cuadro de diálogo, que IsDialogMessage filtra y procesa.

0

Sin IsDialogMessage algunas características del diálogo, como cambiar el enfoque cuando se presiona la tecla Tab, no funcionan. IsDialogMessage implementa estas características específicas del cuadro de diálogo. Si devuelve TRUE, el mensaje actual ya está manejado, y no hay necesidad de llamar a TranslateMessage y a DispatchMessage.

4

Una ventana modal desactivará su ventana principal, el hecho de que su HWND se llama g_hToolbar me dice que esto no es un diálogo modal ...

cuadros de diálogo modales (DialogBox*) crear su propio bucle de mensajes (Y el trabajo como MessageBox, etc.), debe estar hablando de cuadros de diálogo no modal (CreateDialog*) Obtendrá todos los mensajes del administrador de ventanas sin IsDialogMessage, IsDialogMessage realiza administrador de diálogos tareas como el manejo de TAB y el enfoque del botón predeterminado.

Consulte la publicación del blog this para obtener información sobre el uso de IsDialogMessage en ventanas que no son de diálogo. Consulte this post series para obtener una descripción general excelente sobre el administrador de diálogos y cómo escribir el suyo.

+0

¡Tienes razón! Estaba hablando de ventana no modal, no modal. Buenos artículos de Raymond Chen, ¡gracias! –