如何制作像 Windows 7 通知弹出窗口这样的窗口,(WS_THICKFRAME 但不可调整)

Posted

技术标签:

【中文标题】如何制作像 Windows 7 通知弹出窗口这样的窗口,(WS_THICKFRAME 但不可调整)【英文标题】:How to make a window like Windows 7 Notifications Flyouts, (WS_THICKFRAME but NOT-RESIZABLE) 【发布时间】:2011-11-16 13:12:05 【问题描述】:

我刚刚在 Delphi 7 中创建了一个small app here,它模拟了默认系统图标,如音量、电池、时钟、网络。

我正在尝试在http://msdn.microsoft.com/en-us/library/aa511448.aspx#flyouts这里遵循所有 Microsoft 建议

为了让一个窗口看起来像一个弹出窗口,我使用了这个代码:

//declaration

TForm1 = class(TForm)

protected
  procedure CreateParams(var Params: TCreateParams); override;
end;

实现

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_THICKFRAME;
  Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST;
end;

我的问题是 WS_THICKFRAME 允许用户调整窗口大小。我该如何解决这个问题?

【问题讨论】:

是的,WS_THICKFRAME 可以调整大小。 WS_BORDER 就够了,Aero 也让它变胖了。 您可以使用Spy++之类的工具来确定窗口样式的值和Battery Meter窗口的扩展样式,然后将这些值应用到Params.StyleParams.ExStyle @RRUZ 我在发帖之前已经尝试过了,但没有成功。样式:0x94800000 ExStyle:0x00000008 但之后我的窗口不可见。 img641.imageshack.us/img641/5403/prtscrcapturen.jpg @Hans Passant:如果这是解决方案,请将您的评论作为答案。 我发现如果你在设计时给表单 BorderStyle:=bsNone 窗口不是很大的。 【参考方案1】:

您可以通过处理WM_GETMINMAXINFO 来防止调整大小。

但是,这不会阻止使用调整大小光标。为此,您可以处理WM_NCHITTEST

【讨论】:

不是最好的解决方案,无论如何是唯一有效的解决方案。我尝试了几乎所有样式组合,没有人给我与 WM_THICKFRAME 相同的视觉效果。【参考方案2】:

只需处理WM_NCHITTEST 消息并始终返回HTCLIENT 值。

这对于操作系统来说意味着它位于应用的客户区之上。然后它不会显示调整大小的光标。

我在 WPF 应用程序中使用这种方法。

【讨论】:

【参考方案3】:

试试这种风格: WS_DLGFRAME (0x00400000)

【讨论】:

【参考方案4】:

使用以下代码,您将摆脱调整大小的鼠标光标。

unit Unit1;

interface

uses
  Windows, Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
     Private declarations 
  public
     Public declarations 
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  end;

var
  Form1: TForm1;

implementation

$R *.dfm

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_THICKFRAME;
end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  with Message do begin
    Result := HTCLIENT;
  end;
end;

end.

【讨论】:

以上是关于如何制作像 Windows 7 通知弹出窗口这样的窗口,(WS_THICKFRAME 但不可调整)的主要内容,如果未能解决你的问题,请参考以下文章

如何创建像 Stripe 结帐这样的弹出窗口

如何在浏览器中自定义推送通知的权限请求弹出窗口?

如何在android中建立一个像弹出窗口一样的facebook评论?

弹出窗口Mac OS在Qt

如何使用自定义布局创建对话框弹出窗口?

php如何制作弹出窗口