Как сделать окно наподобие всплывающих уведомлений Windows 7 (WS_THICKFRAME, но NOT-RESIZABLE)

Я только что сделал небольшое приложение в Delphi 7, которое имитирует системные значки по умолчанию, такие как громкость, батарея, часы, сеть.

Я пытаюсь следовать всем рекомендациям Microsoft здесь http://msdn.microsoft.com/en-us/library/aa511448.aspx

Чтобы окно выглядело как всплывающее окно, я использую этот код:

//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 позволяет пользователю изменять размер окна. Как я могу это исправить?

Изменение размера окна

4 ответа

Вы можете предотвратить изменение размера, обрабатывая WM_GETMINMAXINFO.

Однако это не помешает использованию курсора изменения размера. Для этого вы можете справиться WM_NCHITTEST,

Просто справиться с WM_NCHITTEST сообщение и всегда возвращаюсь HTCLIENT значение.

Что для ОС будет означать, что она находится над клиентской областью приложения. Он не будет отображать курсор изменения размера.

Я использую этот подход в приложении WPF.

Используйте следующий код, и вы избавитесь от изменения размера курсора мыши.

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.

Попробуйте этот стиль: WS_DLGFRAME (0x00400000)

Другие вопросы по тегам