Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi中的Windows 7样式通知弹出按钮_Delphi_Windows 7_Notification Area - Fatal编程技术网

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

Delphi中的Windows 7样式通知弹出按钮,delphi,windows-7,notification-area,Delphi,Windows 7,Notification Area,关于微软的通知区建议,我正在寻找一些想法或一个Delphi组件来实现 第一个“自然”的想法是使用标准的Delphi表单,但我面临两个问题: 我无法使用标准的“BorderStyle”属性获取窗体边框行为。尝试使用GlassFrame属性以及设置为bsNone的BorderStyle“模拟”边框,但没有边框时就没有GlassFrame(至少在Delphi 2007中是这样) 我不知道当用户点击表单本身的任何地方时,如何关闭表单。昨天我尝试了不同的消息,但没有人能像预期的那样工作 我将感谢任何线索

关于微软的通知区建议,我正在寻找一些想法或一个Delphi组件来实现

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

  • 我无法使用标准的“BorderStyle”属性获取窗体边框行为。尝试使用GlassFrame属性以及设置为bsNone的BorderStyle“模拟”边框,但没有边框时就没有GlassFrame(至少在Delphi 2007中是这样)
  • 我不知道当用户点击表单本身的任何地方时,如何关闭表单。昨天我尝试了不同的消息,但没有人能像预期的那样工作
  • 我将感谢任何线索或组成部分,以实现这一点:)

    致以最良好的祝愿

    贾斯盖特

    还有一个相关的问题

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

    更新[1] 最后,自动关闭行为在调用setForeGroundIndog以强制弹出“激活”后使用WM_激活消息


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

    我相信你的目标是:

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

    感谢RRUZ的链接转换:)谢谢!看起来非常非常好。我手头上没有win7,在vista中,它50%的时间都能工作,因为WM_激活并不是在所有情况下都能启动的,或者可能我现在太累了。再过几个小时,在休息和Win7的帮助下,我会再试一次。再次感谢。我终于得到了Win7机器并进行了测试,但与vista一样,当其他弹出按钮关闭时,窗体仍然可见。例如,如果选择另一个应用程序的任务栏按钮切换到另一个应用程序,它只关闭50%的时间(大约)。我试着了解了一些事情,但是表单并没有一直收到WM_ACTIVATE消息。可能是win bug,但肯定有解决办法,因为系统弹出(电池)工作正常。如果单击另一个托盘图标,delphi frm不会关闭。我错过什么了吗?据我所知,你的想法在我的测试程序中。你也可以挂接到Application.OnDeactivate事件中。只需将Application.OnDeactivate设置为一个通知事件,如果弹出窗口可见,该事件也会隐藏该弹出窗口。不幸的是,我没有Vista可供测试。@skamradt:谢谢你的建议,但不幸的是,其行为与WM_激活消息相同。。。也许是delphi的bug。它快把我逼疯了crazy@mghie:谢谢,我一直在努力。我找到了为什么不总是得到灭活事件的原因,这是表单在Show()时不总是“激活”;呼叫现在已经修复了在节目结束后调用setforegroundindow和autoclose似乎只在WM_激活消息时工作良好。现在,我正在尝试获得正确的边界行为@skamradt建议使用WS_弹出窗口或WS_THICKFRAME,让用户调整窗口大小。我尝试了很多组合,但没有一个像预期的那样工作(厚边框,没有标题,没有移动,没有调整大小)。
    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;