Delphi 中的 Windows 7 样式通知浮出控件
Posted
技术标签:
【中文标题】Delphi 中的 Windows 7 样式通知浮出控件【英文标题】:Windows 7 style Notifications Flyouts in Delphi 【发布时间】:2011-01-07 11:32:39 【问题描述】:关于 Microsoft 的通知区域建议,我正在寻找想法或 Delphi 组件来实现Notification Area Flyouts。
第一个“自然”的想法是使用标准的 Delphi 表单,但我面临两个问题:
-
我无法使用标准的“BorderStyle”属性获得表单边框行为。尝试使用 GlassFrame 属性以及将 BorderStyle 设置为 bsNone 来“模仿”边框,但是当没有边框时没有 GlassFrame(至少在 Delphi 2007 中)。
当用户单击表单本身的任何位置时,我无法弄清楚如何关闭表单。昨天我尝试了不同的消息,但没有一个按预期工作。
我会感谢任何线索或组件来实现它:)
最好的问候。
jachguate。
ps。 converting notification area icon to Program icon in Win7 (Delphi)有一个相关的问题。
更新[0] 我还在寻求建议。 @skamradt 的答案看起来非常好,但不幸的是在实践中效果不佳。
更新[1] 最后,自动关闭行为是在调用 SetForegroundWindog 后使用 WM_ACTIVATE 消息强制弹出“激活”
begin
FlyoutForm.Show;
SetForegroundWindow(FlyoutForm.Handle);
end;
现在,我正在寻找达到边框行为和视觉样式的建议,因为最接近的行为是通过样式为 WS_POPUP 或 WS_DLGFRAME 来实现的,而最接近的视觉目标是通过将样式设置为 WS_POPUP 或 WS_THICKFRAME 来实现的。
【问题讨论】:
感谢RRUZ的链接转换:) 【参考方案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;
这将为您提供一个带有玻璃框架的相当大的弹出窗口。由于缺少标准窗口标题,因此您无法在没有额外编程的情况下移动窗口。当另一个窗口获得焦点时,FormDeactivate 事件会被触发……但前提是您切换到同一应用程序中的另一个窗体。无论应用程序切换如何处理,请使用消息捕获方法。
【讨论】:
谢谢!它看起来非常非常好。我手头没有win7,在vista中它有50%的时间工作,因为WM_ACTIVATE并不是在所有情况下都被触发,或者我现在太累了。几个小时后,稍作休息,手头有 Win7,我会再试一次。再次感谢。 我终于拿到了 Win7 机器并对其进行了测试,但与 vista 一样,在其他弹出窗口关闭的情况下,表单仍然可见。例如,如果您切换到另一个应用程序并选择它的任务栏按钮,它只会关闭 50% 的时间(大约)。我尝试了几件事来理解,并且表单始终没有收到 WM_ACTIVATE 消息。也许是一个胜利错误,但肯定有一个解决方法,因为系统弹出(电池)有效。如果单击另一个托盘图标,delphi frm 不会关闭。我错过了什么吗?据我所知,你的想法在我的测试程序中。 您也可以挂钩 Application.OnDeactivate 事件。只需将 Application.OnDeactivate 设置为一个通知事件,如果它可见,它也会隐藏弹出窗口。不幸的是,我没有可以测试的 Vista。 @skamradt:感谢您的建议,但不幸的是,行为与 WM_ACTIVATE 消息相同...可能是一个 delphi 错误。快把我逼疯了 @mghie:谢谢,我一直在努力。我找到了为什么不总是得到 inactivate 事件的原因,这是表单在 Show() 中并不总是“激活”;称呼。现在已修复在显示后调用 SetForegroundWindow 并且自动关闭似乎仅适用于 WM_ACTIVATE 消息。现在,我正在尝试获得正确的边框行为。 @skamradt 建议 WS_POPUP 或 WS_THICKFRAME 让用户调整窗口大小。我尝试了很多组合,但没有一个按预期工作(粗边框,没有标题,没有移动,没有调整大小)。以上是关于Delphi 中的 Windows 7 样式通知浮出控件的主要内容,如果未能解决你的问题,请参考以下文章
Windows 7 上 Delphi 6 中的“特定于平台”警告
Vs Blend + Windows 8:如何为应用程序中的元素设置系统通知主题的样式?
如何制作像 Windows 7 通知弹出窗口这样的窗口,(WS_THICKFRAME 但不可调整)