Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сделаем углы формы Delphi VCL круглыми: инструкция по использованию `SetWindowRgn`

Delphi , Программа и Интерфейс , Диалоги и Фреймы

Сделаем углы формы 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;

Существуют проекты на GitHub, которые реализуют этот функционал различными способами. Например, https://github.com/checkdigits/rounded_corners предоставляет функцию, которая оборачивает вышеуказанный вызов функции, и https://github.com/marcocantu/DelphiSessions/tree/master/Win11_Delphi11/Win11Round, который содержит модуль "Win11Forms", добавляющий функциональность к классу TForm для установки круглого угла окна.


Приведенные примеры кода можно использовать в вашем проекте Delphi для реализации скругленных углов окон форм. Обратите внимание, что для различных версий Windows и версий Delphi подходы к решению могут отличаться, поэтому всегда полезно проверять актуальность совета и доступность функций API для вашего случая.

Создано по материалам из источника по ссылке.

Разработчики в среде Delphi используют функцию `SetWindowRgn` для создания скругленных углов окон форм, но сталкиваются с проблемами в реализации, которые решаются через использование определенных методов создания окна и обработки событий.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 15:45:08/0.0038409233093262/0