Уведомления о стиле Windows 7 Flyouts в Delphi

Относительно рекомендаций области уведомлений Microsoft я ищу идеи или компонент Delphi для реализации области уведомлений Flyouts.

alt text

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

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

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

С уважением.

jachguate.

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

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

обновление [1] Наконец, автоблизкое поведение работает с сообщением WM_ACTIVATE после вызова SetForegroundWindog для принуждения flyout "активации"

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

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

16
задан Community 23 May 2017 в 11:48
поделиться

1 ответ

Я верю, что ваш после следующего:

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;

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

9
ответ дан 30 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: