Сделаем углы формы Delphi VCL круглыми: инструкция по использованию SetWindowRgn
Разработчики, использующие среду Delphi для создания приложений, часто сталкиваются с необходимостью добавления эффектов современного дизайна, таких как скругленные углы окон. В данной статье мы рассмотрим, как можно применить функцию SetWindowRgn для создания скругленных углов у окон форм, используя Object Pascal (Delphi).
Описание проблемы
Задача состоит в том, чтобы сделать углы стандартной формы VCL Delphi круглыми, как показано на изображении ниже:
На данный момент тень не требуется, необходимо только добавить скругление углов.
Проблема с кодом
Разработчик пытался внедрить скругленные углы с помощью следующего кода, но изменения не отображаются:
unit UMainWindow;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TFMainWindow = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
FMainWindow: TFMainWindow;
implementation
procedure TFMainWindow.FormCreate(Sender: TObject);
var
rgn: HRGN;
begin
rgn := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight, 40, 40);
SetWindowRgn(Handle, rgn, True);
end;
end.
Результатом работы этого кода стало изображение, на котором углы остались прямыми:
Подтвержденный ответ
Для успешного применения скругленных углов необходимо использовать виртуальный метод CreateWnd или CreateWindowHandle вместо события OnCreate. Это позволит пересоздать HWND формы после события OnCreate. Кроме того, если форма является изменяемой, следует использовать событие OnResize для повторного создания HRGN с новыми размерами.
Также важно проверять возвращаемые значения функций API на предмет ошибок, что описано в документации по API.
Альтернативный ответ для Windows 11
С появлением Windows 11 появилась возможность использовать следующие методы для скругления углов окон:
uses
Winapi.Dwmapi, Vcl.Dialogs, System.SysUtils;
const
DWMWCP_DEFAULT = 0; // Пусть система решит, круглить углы или нет (по умолчанию)
DWMWCP_DONOTROUND = 1; // Никогда не круглить углы
DWMWCP_ROUND = 2; // Круглая форма углов, если это уместно
DWMWCP_ROUNDSMALL = 3; // Круглая форма углов с малым радиусом, если это уместно
DWMWA_WINDOW_CORNER_PREFERENCE = 33; // WINDOW_CORNER_PREFERENCE управляет политикой округления углов верхнего уровня окон
var
CornerPreference: Cardinal; // задать значение 0..3 из констант DWMWCP выше
begin
Winapi.Dwmapi.DwmSetWindowAttribute(Handle, DWMWA_WINDOW_CORNER_PREFERENCE, @CornerPreference, SizeOf(CornerPreference));
end;
Приведенные примеры кода можно использовать в вашем проекте Delphi для реализации скругленных углов окон форм. Обратите внимание, что для различных версий Windows и версий Delphi подходы к решению могут отличаться, поэтому всегда полезно проверять актуальность совета и доступность функций API для вашего случая.
Разработчики в среде Delphi используют функцию `SetWindowRgn` для создания скругленных углов окон форм, но сталкиваются с проблемами в реализации, которые решаются через использование определенных методов создания окна и обработки событий.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.