Иногда при разработке приложений на Delphi, используя многооконный интерфейс (MDI), разработчики сталкиваются с проблемой появления бордюра внутри основной формы. Этот бордюр может выглядеть неэстетично и его часто хотят убрать. Рассмотрим, как это можно сделать.
Проблема бордюра в MDI-формах
Когда основная форма становится MDI-формой, она может отображаться с бордюром (bevel) внутри. Это происходит из-за использования стиля окна WS_EX_CLIENTEDGE, который добавляет бордюр с вогнутым краем. Убрать этот бордюр не так просто, поскольку процедура окна MDI-клиента (реализована во VCL) принудительно отображает клиентский край.
Шаг 1: Попытка удаления стиля WS_EX_CLIENTEDGE
Первым шагом может быть попытка удаления стиля WS_EX_CLIENTEDGE в процедуре создания окна. Однако это не приведет к визуальным изменениям, так как процедура окна MDI-клиента перезапишет стиль.
procedure TMyMDIForm.CreateWnd;
var
ExStyle: DWORD;
begin
inherited;
ExStyle := GetWindowLongPtr(ClientHandle, GWL_EXSTYLE);
SetWindowLongPtr(ClientHandle, GWL_EXSTYLE, ExStyle and not WS_EX_CLIENTEDGE);
SetWindowPos(ClientHandle, 0, 0,0,0,0, SWP_FRAMECHANGED or
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
end;
Шаг 2: Переопределение обработчика сообщений окна
Чтобы убрать бордюр, необходимо переопределить обработчик сообщений окна для сообщения $3F, которое отвечает за отображение бордюра.
type
TMyMDIForm = class(TForm)
protected
procedure ClientWndProc(var Message: TMessage); override;
end;
procedure TMyMDIForm.ClientWndProc(var Message: TMessage);
var
ExStyle: DWORD;
begin
case Message.Msg of
$3F:
begin
ExStyle := GetWindowLongPtr(ClientHandle, GWL_EXSTYLE);
SetWindowLongPtr(ClientHandle, GWL_EXSTYLE, ExStyle and not WS_EX_CLIENTEDGE);
SetWindowPos(ClientHandle, 0, 0,0,0,0, SWP_FRAMECHANGED or
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
end;
else
inherited;
end;
end;
Шаг 3: Использование альтернативных решений
Если предыдущие шаги не работают, например, в Delphi 10.1 Berlin, можно использовать сторонние компоненты, такие как NLDExtraMDIProps, который имеет свойство ShowClientEdge для удаления бордюра.
Заключение
Удаление бордюра в MDI-формах Delphi может быть непростой задачей, но с помощью переопределения обработчика сообщений окна и, при необходимости, использования сторонних компонентов, можно добиться желаемого результата.
Руководство по устранению бордюра в многооконном интерфейсе (MDI) в среде разработки Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.