Для начала, давайте разберёмся с тем, что такое неподвижные окна в стиле Windows 7 Notifications Flyouts. Это такое поведение окон, при котором они выглядят как стандартные уведомления операционной системы Windows 7, например, как индикаторы громкости, батареи, времени или сети. Они имеют специальный дизайн с рамкой, но при этом не могут быть изменены пользователем в размерах.
Разработчик, создавший приложение в Delphi 7, столкнулся с проблемой, что использование стиля окна WS_THICKFRAME позволяет пользователю изменять размеры окна, что не соответствует требованиям дизайна Windows 7. Найти решение этой проблемы можно, обратив внимание на несколько моментов.
Подтвержденный ответ:
Для начала, чтобы окно не было изменяемым по размеру, можно установить свойство BorderStyle формы в bsNone на этапе проектирования, что сделает окно неразмерным.
Также, можно переопределить обработчик сообщения WM_NCHITTEST, который отвечает за реакцию системы на попытки изменения размера окна. В этом обработчике всегда возвращается значение HTCLIENT, что указывает системе, что все действия выполняются внутри клиентской области приложения и курсор изменения размера не отображается.
Вот пример кода на Object Pascal (Delphi), который демонстрирует, как это можно реализовать:
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;
// Убираем WS_THICKFRAME, если он установлен, и не устанавливаем WS_POPUP
Params.Style := Params.Style and not WS_THICKFRAME;
Params.Style := Params.Style and not WS_POPUP;
end;
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
// Возвращаем HTCLIENT для всех точек окна
Message.Result := HTCLIENT;
end;
end.
Альтернативный ответ:
Также, для создания окна в стиле flyout, рекомендуется использовать стиль WS_DLGFRAME вместо WS_THICKFRAME, который также предотвратит возможность изменения размера окна пользователем.
Пример использования WS_DLGFRAME:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or WS_DLGFRAME;
end;
Следуя этим рекомендациям, разработчик сможет создать неподвижные окна в Delphi 7, которые будут выглядеть и вести себя как стандартные уведомления Windows 7.
Статья:
В этой статье мы рассмотрели, как создать окна в стиле Windows 7 Notifications Flyouts, используя Delphi 7. Мы столкнулись с проблемой, что использование стиля WS_THICKFRAME позволяет изменять размер окна, что не соответствует дизайну Windows 7. Мы предложили решение, установив BorderStyle в bsNone и переопределив обработчик сообщения WM_NCHITTEST, чтобы предотвратить изменение размера окна пользователем. Также, мы рассмотрели альтернативный подход с использованием стиля WS_DLGFRAME, который позволяет достичь аналогичного результата. Приведённые примеры кода на Object Pascal помогут разработчикам интегрировать эти решения в свои проекты.
Разработчик использует Delphi 7 для создания окон в стиле уведомлений Windows 7, которые не должны изменяться пользователем по размеру.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.