Всплывающие уведомления в стиле Windows 7 в Delphi - PullRequest
15 голосов
/ 21 января 2010

Что касается рекомендаций области уведомлений от Microsoft, я ищу идеи или компонент Delphi для реализации всплывающих уведомлений области уведомлений .

alt text

Первая "естественная" идея - использовать стандартную форму Delphi, но я сталкиваюсь с двумя проблемами:

  1. Я не могу получить поведение границы формы, используя стандартное свойство "BorderStyle". Попытка «имитировать» границу с помощью свойства GlassFrame вместе с BorderStyle, установленным в bsNone, но при отсутствии границы GlassFrame отсутствует (по крайней мере, в Delphi 2007).
  2. Я не могу понять, как сделать форму закрытой, когда пользователь щелкает повсюду из самой формы. Вчера я пытался с разными сообщениями, но никто не работает, как ожидалось.

Я буду благодарен любой подсказке или компоненту, чтобы это произошло:)

С уважением.

jachguate.

пс. Есть связанный вопрос в преобразовании значка области уведомлений в значок программы в Win7 (Delphi) .

обновление [0] Я все еще ищу совет. Ответ @skamradt выглядит очень хорошо, но, к сожалению, на практике не работает.

обновление [1] Наконец, поведение автоматического закрытия работает с сообщением WM_ACTIVATE после вызова SetForegroundWindog, чтобы вызвать всплывающую «активацию»

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

Теперь я ищу совет для достижения поведения границы и визуального стиля, потому что самое близкое поведение достигается с помощью стиля как WS_POPUP или WS_DLGFRAME, тогда как ближайшая визуальная цель достигается установкой стиля как WS_POPUP или WS_THICKFRAME.

1 Ответ

8 голосов
/ 21 января 2010

Я верю в то, что вы после:

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;

Это даст вам большое всплывающее окно со стеклянной рамкой. Вы не можете переместить окно без дополнительного программирования, так как отсутствует стандартная заголовок окна. Когда другое окно получает фокус, событие FormDeactivate вызывается ... но только если вы переключаетесь на другую форму в том же приложении. Чтобы справиться с этим независимо от того, какое приложение переключено, используйте метод захвата сообщения.

...