Как сделать окно наподобие всплывающих уведомлений 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.