如何创建一个像Windows 7通知弹出窗口的窗口,(WS_THICKFRAME但不可调整)

时间:2011-09-13 21:28:31

标签: delphi winapi windows-7 resizable flyout

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

我正在尝试关注此处的所有Microsoft推荐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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

我在WPF app中使用这种方法。

答案 2 :(得分:0)

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

答案 3 :(得分: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.