17

关于 Microsoft 的 Notification Area 建议,我正在寻找想法或 Delphi 组件来实现Notification Area Flyouts

替代文字

第一个“自然”的想法是使用标准的 Delphi 形式,但我面临两个问题:

  1. 我无法使用标准的“BorderStyle”属性获得表单边框行为。尝试使用 GlassFrame 属性以及将 BorderStyle 设置为 bsNone 来“模仿”边框,但是当没有边框时(至少在 Delphi 2007 中)没有 GlassFrame。
  2. 当用户单击表单本身的任何位置时,我无法弄清楚如何关闭表单。昨天我尝试了不同的消息,但没有人按预期工作。

我会感谢任何线索或组件来实现它:)

此致。

贾奇盖特。

附言。在 Win7 (Delphi) 中将通知区域图标转换为程序图标有一个相关的问题。

更新[0] 我仍在寻求建议。@skamradt 的答案看起来非常好,但不幸的是在实践中效果不佳。

update[1] 最后,在调用 SetForegroundWindog 以强制弹出“激活”之后,自动关闭行为与 WM_ACTIVATE 消息一起使用

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

现在,我正在寻找达到边框行为和视觉样式的建议,因为最接近的行为是通过样式为 WS_POPUP 或 WS_DLGFRAME 来实现的,而最接近的视觉目标是通过将样式设置为 WS_POPUP 或 WS_THICKFRAME 来实现的。

4

1 回答 1

9

我相信你的追求如下:

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 事件会被触发......但前提是您切换到同一应用程序中的另一个窗体。无论应用程序切换如何处理它,请使用消息捕获方法。

于 2010-01-21T00:06:53.910 回答