代码之家  ›  专栏  ›  技术社区  ›  jachguate

Delphi中的Windows 7样式通知弹出按钮

  •  14
  • jachguate  · 技术社区  · 16 年前

    Notification Area Flyouts .

    alt text

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

    1. 我无法使用标准的“BorderStyle”属性获取窗体边框行为。尝试使用GlassFrame属性以及BorderStyle设置为bsNone来“模拟”边框,但是没有边框时就没有GlassFrame(至少在delphi2007中是这样)。

    我将感谢任何线索或组成部分使它发生:)

    谨致问候。

    杰奎特。

    converting notification area icon to Program icon in Win7 (Delphi) .

    我仍在寻求建议。@斯卡姆拉特的答案看起来很好,但不幸的是,在实践中效果并不好。

    最后,auto-close行为在调用setForeGroundIndog后使用WM_ACTIVATE消息强制弹出“activation”

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

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

    1 回复  |  直到 9 年前
        1
  •  9
  •   skamradt    16 年前

    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事件将被触发…但仅当您切换到同一应用程序中的另一个窗体时。要处理它而不管应用程序切换了什么,请使用消息捕获方法。