如何创建一个类似于Windows 7通知弹出窗口的窗口,具有WS_THICKFRAME但不可调整大小

7
我刚刚在Delphi7中制作了一个小应用程序,模拟默认系统图标,如音量、电池、时钟、网络。

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

为了使窗口看起来像是一个弹出窗口,我使用了以下代码:

//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允许用户调整窗口大小。我该如何解决这个问题?

Resizable Window Issue


是的,WS_THICKFRAME可以使其可调整大小。WS_BORDER已经足够了,Aero也会让它变得更厚。 - Hans Passant
你可以使用类似 Spy++ 的工具来确定“电池计量器”窗口的窗口样式和扩展样式的值,然后将这些值应用于 “Params.Style” 和 “Params.ExStyle”。 - RRUZ
@RRUZ 在发帖之前我已经尝试过这个方法,但是没有成功。Style: 0x94800000 ExStyle:0x00000008,但是我的窗口在此之后变得不可见。http://img641.imageshack.us/img641/5403/prtscrcapturen.jpg - Vitim.us
@Hans Passant:如果那是解决方案,请将您的评论作为答案。 - The_Fox
我发现如果在设计时将表单BorderStyle:=bsNone,窗口就无法改变大小。 - avenmore
可能是[Delphi中的Windows 7风格通知弹出窗口]的重复问题(https://dev59.com/B3I95IYBdhLWcg3w5SSh)。 - jachguate
4个回答

6

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

然而,这并不能阻止使用调整大小光标。为此,你可以处理 WM_NCHITTEST


不是最好的解决方案,但是唯一可行的。我尝试了几乎所有的样式组合,没有一个能给我与WM_THICKFRAME相同的视觉效果。 - Vitim.us

1

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

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

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


0
使用以下代码,您将摆脱调整大小的鼠标光标。
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.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接