2010-01-20 14 views
14

Per quanto riguarda le raccomandazioni sull'area di notifica di Microsoft, sto cercando idee o un componente Delphi per implementare Notification Area Flyouts.Notifiche stile Windows 7 in Delphi

alt text

La prima idea "naturale" è quella di utilizzare un modulo standard di Delphi, ma sto di fronte a due problemi con esso:

  1. non riesco a ottenere il comportamento modulo confine con il proprietà "BorderStyle" standard. Ho cercato di "imitare" il bordo usando la proprietà GlassFrame insieme a BorderStyle impostato su bsNone, ma non c'è GlassFrame quando non ci sono confini (almeno, in Delphi 2007).
  2. Non riesco a capire come rendere il modulo vicino quando l'utente fa clic in qualsiasi parte del modulo stesso. Ieri stavo provando con messaggi diversi, ma nessuno funziona come previsto.

io vi ringrazio qualsiasi indizio o componente per farlo accadere :)

i migliori saluti.

jachguate.

ps. C'è una domanda correlata in converting notification area icon to Program icon in Win7 (Delphi).

aggiornamento [0] Sto ancora cercando consigli. La risposta di @skamradt sembra molto buona, ma sfortunatamente non funziona bene nella pratica.

aggiornamento [1] Infine, il comportamento chiusura automatica sta lavorando con il messaggio WM_ACTIVATE dopo un SetForegroundWindog chiamata a forza di "attivazione" flyout

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

Ora, sto cercando raccomandi raggiungere il comportamento di confine e lo stile visivo, perché il comportamento più vicino si ottiene con stile come WS_POPUP o WS_DLGFRAME, mentre l'obiettivo visivo più vicino si ottiene impostando lo stile come WS_POPUP o WS_THICKFRAME.

+0

Grazie RRUZ per la conversione del link :) – jachguate

+0

Nessun problema @jachguate. ;) – RRUZ

risposta

8

Credo che ciò che il vostro dopo è la seguente:

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; 

questo vi darà una finestra pop-up consistente con una cornice di vetro. Non è possibile spostare la finestra senza programmazione aggiuntiva, poiché manca la sottotitoli standard di Windows. Quando viene attivata un'altra finestra, viene generato l'evento FormDeactivate ... ma solo se si passa a un altro modulo nella stessa applicazione. Per gestirlo indipendentemente dall'applicazione attivata, utilizzare il metodo di acquisizione dei messaggi.

+0

Grazie! Sembra molto, molto bene. Non ho win7 a portata di mano, e in vista funziona il 50% delle volte, perché il WM_ACTIVATE non è attivato in tutte le situazioni, o forse sono troppo stanco ora. Tra un paio d'ore, con un po 'di riposo e Win7 a disposizione, farò un altro tentativo. Grazie ancora. – jachguate

+0

Alla fine ho preso la macchina Win7 e l'ho testata, ma come in vista, il modulo è ancora visibile nei casi in cui altri riquadri si chiudono. Ad esempio, se si passa a un'altra applicazione selezionando il pulsante della barra delle attività, si chiude solo il 50% delle volte (approssimativo). Ho provato un paio di cose da capire e il modulo non riceve il messaggio WM_ACTIVATE tutte le volte. Forse un insuccesso, ma di sicuro c'è una soluzione perché i flyout di sistema (batteria) funzionano. Se si fa clic sull'icona di un'altra barra, il delphi non si chiude. Mi sto perdendo qualcosa? Per quanto vedo, la tua idea è nel mio programma di test. – jachguate

+0

Puoi anche collegarti all'evento Application.OnDeactivate. Basta impostare Application.OnDeactivate su un evento di notifica che nasconde anche il popup se è visibile. Sfortunatamente non ho Vista per testare. – skamradt