2010-01-20 8 views
14

En ce qui concerne les recommandations de zone de notification par Microsoft, je cherche des idées ou un composant Delphi à mettre en œuvre Notification Area Flyouts.Windows 7 style Notifications Flyouts dans Delphi

alt text

La première idée est d'utiliser un formulaire standard Delphi « naturelle », mais je suis face à deux problèmes avec elle:

  1. Je ne peux pas obtenir le comportement des frontières de formulaire en utilisant la propriété "BorderStyle" standard. J'ai essayé de "mimer" la bordure en utilisant la propriété GlassFrame avec BorderStyle définie sur bsNone, mais il n'y a pas de GlassFrame quand il n'y a pas de bordure (au moins, dans Delphi 2007).
  2. Je ne peux pas comprendre comment fermer le formulaire lorsque l'utilisateur clique partout hors du formulaire lui-même. Hier, j'essayais avec différents messages, mais personne ne fonctionne comme prévu.

Je remercierai tout indice ou d'un composant pour y arriver :)

Meilleures salutations.

jachguate.

ps. Il y a une question connexe dans converting notification area icon to Program icon in Win7 (Delphi).

mise à jour [0] Je suis toujours à la recherche de conseils. réponse @skamradt semble très bien, mais malheureusement, ne fonctionne pas bien dans la pratique.

mise à jour [1] Enfin, le comportement de fermeture automatique fonctionne avec le message WM_ACTIVATE après une SetForegroundWindog appelant à la force icône déroulante "activation"

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

Maintenant, je suis à la recherche de conseils à Atteignez le comportement frontalier et le style visuel, car le comportement le plus proche est atteint avec le style WS_POPUP ou WS_DLGFRAME, tandis que l'objectif visuel le plus proche est atteint avec WS_POPUP ou WS_THICKFRAME.

+0

Merci RRUZ pour la conversion de lien :) – jachguate

+0

Pas de problème @jachguate. ;) – RRUZ

Répondre

8

Je crois que votre après est la suivante:

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; 

Cela vous donnera une fenêtre importante avec un cadre en verre. Vous ne pouvez pas déplacer la fenêtre sans programmation supplémentaire, car la légende des fenêtres standard est manquante. Lorsqu'une autre fenêtre obtient le focus, l'événement FormDeactivate est déclenché ... mais seulement si vous passez à un autre formulaire dans la même application. Pour le gérer quelle que soit l'application commutée, utilisez la méthode de capture de message.

+0

Merci! Ça a l'air très, très bien. Je n'ai pas win7 en main, et à Vista cela fonctionne 50% du temps, parce que le WM_ACTIVATE n'est pas déclenché dans toutes les situations, ou peut-être que je suis trop fatigué maintenant. Dans quelques heures, avec un peu de repos et Win7 en main, je vais faire un autre essai. Merci encore. – jachguate

+0

J'ai finalement obtenu la machine Win7 et l'ai testée, mais comme dans Vista, le formulaire est toujours visible dans les cas où d'autres flyouts se ferment. Par exemple, si vous passez à une autre application en sélectionnant le bouton de la barre des tâches, elle ne ferme que 50% des temps (approximatif). J'ai essayé quelques choses à comprendre, et le formulaire n'obtient pas le message WM_ACTIVATE tout le temps. Peut-être un bug de victoire, mais à coup sûr il y a une solution de contournement car les flyouts du système (batterie) fonctionnent. Si vous cliquez sur une autre icône de la barre d'état, le fichier delphi frm ne se ferme pas. Est-ce que je manque quelque chose? Pour autant que je vois, votre idée est dans mon programme de test. – jachguate

+0

Vous pouvez également vous connecter à l'événement Application.OnDeactivate. Définissez simplement Application.OnDeactivate sur un événement de notification qui masque également la fenêtre contextuelle si elle est visible. Malheureusement, je n'ai pas Vista à tester avec. – skamradt