2010-01-20 10 views
14

In Bezug auf Notification Area Empfehlungen von Microsoft, bin ich auf der Suche nach Ideen oder eine Delphi-Komponente zu implementieren Notification Area Flyouts.Windows 7 Stil Benachrichtigungen Flyouts in Delphi

alt text

Die erste „natürliche“ Idee ist es, eine Standard-Delphi-Formular zu verwenden, aber ich bin vor zwei Probleme mit sich:

  1. Ich kann nicht das Formular Grenze Verhalten erhalten die Verwendung von Standard "BorderStyle" -Eigenschaft. Es wurde versucht, den Rahmen mit der GlassFrame-Eigenschaft zu "imitieren", während BorderStyle auf bsNone festgelegt ist. Es gibt jedoch keinen GlassFrame, wenn kein Rahmen vorhanden ist (zumindest in Delphi 2007).
  2. Ich kann nicht herausfinden, wie man das Formular schließt, wenn der Benutzer überall aus dem Formular selbst klickt. Gestern habe ich mit verschiedenen Nachrichten versucht, aber niemand funktioniert wie erwartet.

werde ich keine Ahnung oder Komponente danken ihm :)

Mit freundlichen Grüßen geschehen.

jachguate.

ps. Es gibt eine verwandte Frage in converting notification area icon to Program icon in Win7 (Delphi).

update [0] Ich bin immer noch auf der Suche nach Beratung. @skamradt Antwort sieht sehr gut aus, funktioniert aber in der Praxis leider nicht gut.

Update [1] Schließlich Das automatische Schließen Verhalten wird mit der WM_ACTIVATE Nachricht nach einer Berufung SetForegroundWindog Arbeit zu zwingen, Flyout „Aktivierung“

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

Nun suche ich Rat an Erreichen Sie das Border-Verhalten und den visuellen Stil, da das engste Verhalten mit Style als WS_POPUP oder WS_DLGFRAME erreicht wird, während das nächste visuelle Ziel erreicht wird, indem Sie Style als WS_POPUP oder WS_THICKFRAME festlegen.

+0

Vielen Dank RRUZ für die Link-Konvertierung :) – jachguate

+0

Kein Problem @jachguate. ;) – RRUZ

Antwort

8

Ich glaube, was Ihr nach ist die folgende:

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; 

Dies wird Ihnen ein beträchtliches Popup-Fenster mit einem Glasrahmen. Sie können das Fenster nicht ohne zusätzliche Programmierung verschieben, da die Standardfensterbeschriftung fehlt. Wenn ein anderes Fenster den Fokus erhält, wird das FormDeactivate-Ereignis ausgelöst ... aber nur, wenn Sie in derselben Anwendung zu einem anderen Formular wechseln. Um dies unabhängig von der geschalteten Anwendung zu handhaben, verwenden Sie die Nachrichtenaufnahmemethode.

+0

Danke! Es sieht sehr, sehr gut aus. Ich habe win7 nicht zur Hand, und in Vista funktioniert es 50% der Zeit, weil WM_ACTIVATE nicht in allen Situationen ausgelöst wird, oder vielleicht bin ich jetzt zu müde. In ein paar Stunden, mit etwas Ruhe und Win7 zur Hand werde ich einen weiteren Versuch machen. Danke noch einmal. – jachguate

+0

Ich habe endlich die Win7-Maschine und testete sie, aber wie in Vista, ist das Formular immer noch sichtbar, wenn andere Flyouts schließen. Wenn Sie z. B. zu einer anderen Anwendung wechseln, die die Schaltfläche für die Taskleiste auswählt, wird sie nur zu 50% geschlossen (ungefähr). Ich habe versucht, ein paar Dinge zu verstehen, und das Formular erhält nicht die WM_ACTIVATE Nachricht die ganze Zeit. Vielleicht ein Win-Bug, aber sicher gibt es einen Workaround, weil System-Flyouts (Batterie) funktioniert. Wenn Sie auf ein anderes Tray-Icon klicken, wird Delphi frm nicht geschlossen. Fehle ich etwas? Soweit ich sehe, ist Ihre Idee in meinem Testprogramm. – jachguate

+0

Sie können auch in das Application.OnDeactivate-Ereignis einhaken. Setzen Sie Application.OnDeactivate einfach auf ein Benachrichtigungsereignis, das das Popup ebenfalls ausblendet, wenn es sichtbar ist. Leider habe ich kein Vista zum testen. – skamradt