2010-01-20 14 views
14

Jeśli chodzi o zalecenia dotyczące obszaru powiadomień firmy Microsoft, szukam pomysłów lub komponentu Delphi do wdrożenia Notification Area Flyouts.Powiadomienia w stylu systemu Windows 7 Rozwiązania w Delphi

alt text

Pierwszy „naturalny” Pomysł polega na użyciu standardowego formularza Delphi, ale mam obliczu dwóch problemów z nim:

  1. Nie mogę uzyskać zachowanie postać graniczną za pomocą standardowa właściwość "BorderStyle". Próbowałem "naśladować" granicę przy użyciu właściwości GlassFrame wraz z BorderStyle ustawionym na bsNone, ale nie ma GlassFrame, gdy nie ma granicy (przynajmniej w Delphi 2007).
  2. Nie mogę dowiedzieć się, jak zamknąć formularz, gdy użytkownik kliknie wszędzie poza sam formularz. Wczoraj próbowałem z różnymi wiadomościami, ale nikt nie działa zgodnie z oczekiwaniami.

będę dziękować jakąkolwiek wskazówkę lub składnik aby tak się stało :)

pozdrawiam.

jachowanie.

ps. W pokrewnym pytaniu jest converting notification area icon to Program icon in Win7 (Delphi).

aktualizacja: aktualizacja [0] Ciągle szukam porady. Odpowiedź @skamradt wygląda bardzo dobrze, ale niestety nie działa dobrze w praktyce.

zmiana [1] Wreszcie zachowanie auto blisko współpracuje z wiadomości WM_ACTIVATE po SetForegroundWindog wywołującego zmusić paletę wysuwaną „aktywacja”

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

Teraz szukam radzą osiągnąć zachowanie granicy i styl wizualny, ponieważ najbliższe zachowanie osiąga się przy stylach takich jak WS_POPUP lub WS_DLGFRAME, a najbliższy cel wizualny osiąga się ustawiając styl jako WS_POPUP lub WS_THICKFRAME.

+0

Dziękuję Ci RRUZ za konwersję linków :) – jachguate

+0

Bez problemu @)guate. ;) – RRUZ

Odpowiedz

8

wierzę, co się po to:

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; 

To daje pokaźną okienko z ramką szklaną. Nie można przesunąć okna bez dodatkowego programowania, ponieważ brakuje standardowego podpisu Windows. Gdy inne okno zostanie skupione, zdarzenie FormDeactivate zostanie uruchomione ... ale tylko wtedy, gdy przełączysz się na inny formularz w tej samej aplikacji. Aby obsłużyć go niezależnie od przełączanej aplikacji, użyj metody przechwytywania komunikatów.

+0

Dziękujemy! Wygląda bardzo, bardzo dobrze. Nie mam pod ręką win7, w Vista to działa 50% czasu, ponieważ WM_ACTIVATE nie jest uruchamiane we wszystkich sytuacjach, a może jestem teraz zbyt zmęczony. Za kilka godzin, z resztą i Win7 na rękę, spróbuję jeszcze raz. Dzięki jeszcze raz. – jachguate

+0

Wreszcie dostałem maszynę Win7 i przetestowałem ją, ale tak jak w widoku, formularz jest nadal widoczny w przypadku, gdy inne wysuwane palety są zamykane. Na przykład, jeśli przełączysz się do innej aplikacji, wybierając przycisk paska zadań, zamyka się tylko 50% razy (w przybliżeniu). Wypróbowałem kilka rzeczy, aby zrozumieć, a formularz nie otrzymuje komunikatu WM_ACTIVATE przez cały czas. Może błąd w wygranej, ale na pewno istnieje obejście problemu, ponieważ działają tryby systemowe (bateria). Po kliknięciu na inną ikonę w zasobniku plik delphi frm nie zostanie zamknięty. Czy czegoś brakuje? O ile widzę, twój pomysł jest w moim programie testowym. – jachguate

+0

Możesz także podłączyć się do zdarzenia Application.OnDeactivate. Wystarczy ustawić Application.OnDeactivate na zdarzenie powiadomienia, które również ukrywa popup, jeśli jest widoczny. Niestety nie muszę testować z Vistą. – skamradt

Powiązane problemy