2010-01-20 37 views
14

En cuanto a las recomendaciones del área de notificación de Microsoft, estoy buscando ideas o un componente de Delphi para implementar Notification Area Flyouts.Salidas de notificaciones de estilo de Windows 7 en Delphi

alt text

La primera idea "natural" es el uso de un formulario estándar de Delphi, pero estoy frente a dos problemas con él:

  1. no puedo obtener el comportamiento forma frontera con el propiedad estándar "BorderStyle". Intenté "imitar" el borde utilizando la propiedad GlassFrame junto con BorderStyle establecido en bsNone, pero no hay GlassFrame cuando no hay borde (al menos, en Delphi 2007).
  2. No puedo averiguar cómo cerrar el formulario cuando el usuario hace clic fuera del formulario. Ayer estaba intentando con diferentes mensajes, pero nadie funciona como se esperaba.

agradeceré cualquier pista o componente para que esto ocurra :)

Saludos.

jachguate.

ps. Hay una pregunta relacionada en converting notification area icon to Program icon in Win7 (Delphi).

actualización [0] Todavía estoy buscando asesoramiento. La respuesta de @skamradt se ve muy bien, pero desafortunadamente no funciona bien en la práctica.

actualización [1] Por último, el comportamiento de auto-cierre está trabajando con el mensaje WM_ACTIVATE después de un SetForegroundWindog llamada a la fuerza "activación" del menú lateral

begin 
    FlyoutForm.Show; 
    SetForegroundWindow(FlyoutForm.Handle); 
end; 

Ahora, estoy en busca de consejo para Alcanzar el comportamiento del borde y el estilo visual, porque el comportamiento más cercano se logra con estilo como WS_POPUP o WS_DLGFRAME, mientras que el objetivo visual más cercano se logra con el estilo de configuración como WS_POPUP o WS_THICKFRAME.

+0

Gracias RRUZ por la conversión de enlace :) – jachguate

+0

No hay problema @jachguate. ;) – RRUZ

Respuesta

8

creo que lo que buscas es la siguiente:

TForm1 = class(TForm) 
    : 
protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    procedure WMActivate(Var msg:tMessage); message WM_ACTIVATE; 
end; 

procedure TForm1.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.Style := WS_POPUP or WS_THICKFRAME; 
end; 

procedure TForm4.WMActivate(var msg: tMessage); 
begin 
    if Msg.WParam = WA_INACTIVE then 
    Hide; // or close 
end; 

esto le dará una ventana emergente con un importante marco de cristal. No puede mover la ventana sin programación adicional, ya que falta el título estándar de Windows. Cuando otra ventana se enfoca, el evento FormDeactivate se dispara ... pero solo si cambia a otro formulario en la misma aplicación. Para manejarlo independientemente de la aplicación conmutada, use el método de captura de mensajes.

+0

¡Gracias! Se ve muy, muy bien. No tengo win7 a la mano, y en vista funciona el 50% del tiempo, porque WM_ACTIVATE no se activa en todas las situaciones, o tal vez ahora estoy demasiado cansado. En un par de horas, con algo de descanso y Win7 a mano, haré otra prueba. Gracias de nuevo. – jachguate

+0

Finalmente obtengo la máquina Win7 y la pruebo, pero como en vista, la forma aún es visible en los casos en que se cierran otros dispositivos. Por ejemplo, si cambia a otra aplicación seleccionando su botón de la barra de tareas, se cierra solo el 50% de las veces (aproximada). Intenté un par de cosas para entender, y el formulario no recibe el mensaje WM_ACTIVATE todo el tiempo. Tal vez un error de win, pero seguro hay una solución porque funciona el flyout (batería) del sistema. Si hace clic en otro ícono de bandeja, el delphi frm no se cierra. ¿Me estoy perdiendo de algo? Por lo que veo, tu idea está en mi programa de prueba. – jachguate

+0

También puede conectar el evento Application.OnDeactivate. Simplemente configure Application.OnDeactivate como un evento de notificación que también oculta la ventana emergente si está visible. Desafortunadamente no tengo Vista para probar. – skamradt

Cuestiones relacionadas