Windows 7风格通知在德尔福 [英] Windows 7 style Notifications Flyouts in Delphi

查看:226
本文介绍了Windows 7风格通知在德尔福的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于Microsoft的通知区域建议,我正在寻找想法或Delphi组件来实现。



更新[0]
我还在寻找建议。 @skamradt的答案看起来很不错,但不幸的是在实践中效果不佳。



更新[1]
最后,自动关闭行为在调用SetForegroundWindog后强制弹出窗口中的WM_ACTIVATE消息激活

  begin 
FlyoutForm.Show;
SetForegroundWindow(FlyoutForm.Handle);
结束

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

解决方案

我相信你以后是以下内容:

  TForm1 = class(TForm)

protected
procedure CreateParams(var Params:TCreateParams);覆盖
procedure WMActivate(var msg:tMessage);消息WM_ACTIVATE;
结束

procedure TForm1.CreateParams(var Params:TCreateParams);
开始
继承;
Params.Style:= WS_POPUP或WS_THICKFRAME;
结束

procedure TForm4.WMActivate(var msg:tMessage);
begin
如果Msg.WParam = WA_INACTIVE then
隐藏; //或关闭
end;

这将为您提供一个具有玻璃框架的大型弹出窗口。由于缺少标准的窗口标题,因此无需额外的编程即可移动窗口。当另一个窗口获得焦点时,FormDeactivate事件将被触发...但只有当您切换到同一个应用程序中的另一个窗体时。要处理它,无论应用程序切换,请使用消息捕获方法。


Regarding Notification Area recommendations by Microsoft, I'm looking for ideas or a Delphi component to implement Notification Area Flyouts.

The first "natural" idea is to use a standard Delphi form, but I'm facing two issues with it:

  1. I can't get the form border behavior using the standard "BorderStyle" property. Tried to "mimic" the border using the GlassFrame property along with BorderStyle set to bsNone, but there's no GlassFrame when there's no border (at least, in Delphi 2007).
  2. I can't figure out how to make the form close when the user clicks everywhere out of the form itself. Yesterday I was trying with different messages, but no one works as expected.

I will thank any clue or component to make it happen :)

Best regards.

jachguate.

ps. There's a related question in converting notification area icon to Program icon in Win7 (Delphi).

update[0] I'm still looking for advise. @skamradt answer looks very good, but unfortunately doesn't work well in practice.

update[1] Finally, The auto-close behavior is working with the WM_ACTIVATE message after a calling SetForegroundWindog to force flyout "activation"

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

Now, I'm looking for advise to reach the border behavior and visual style, because the closest behavior is achieved with style as WS_POPUP or WS_DLGFRAME, while the closest visual goal is achieved setting style as WS_POPUP or WS_THICKFRAME.

解决方案

I believe what your after is the following:

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;

This will give you a sizeable popup window with a glass frame. You can't move the window without additional programming, since the standard windows caption is missing. When another window gets focus, the FormDeactivate event gets fired...but only if you switch to another form in the same application. To handle it regardless of the application switched, use the message capture method.

这篇关于Windows 7风格通知在德尔福的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆