Вопрос пользователя заключается в поиске способа конфигурации плоской кнопки без рамки в Delphi 7, используя стандартные компоненты и возможности DevExpress, без необходимости изменения внешнего вида через LookAndFeel или создания кастомной темы. Пользователь уже пробовал различные подходы, но столкнулся с ограничениями стандартных компонентов.
Подходы, которые были испробованы:
TButton и TSpeedButton имеют табуляцию и фокус, но не поддерживают отсутствие рамки.
TLabel и TPanel имеют возможность отсутствия рамки, но не поддерживают табуляцию и фокус.
TcxButton и TcxLabel из DevExpress также имеют ограничения по функционалу.
Альтернативные методы:
Использование перехвата (interposing) класса TButton для изменения его стиля на BS_OWNERDRAW, что позволяет полностью контролировать внешний вид кнопки.
Решение проблемы:
Для создания плоской кнопки без рамки можно использовать переопределение стандартного компонента TButton с помощьюowner draw. Ниже приведен пример кода, который изменяет стандартный вид кнопки, делая её плоской и без рамки.
type
TButton = class(stdctrls.TButton)
protected
procedure SetButtonStyle(ADefault: Boolean); override;
procedure CNCtlcolorbtn(var Message: TMessage); message CN_CTLCOLORBTN;
procedure CNDrawitem(var Message: TWMDrawItem); message CN_DRAWITEM;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
procedure TButton.SetButtonStyle(ADefault: Boolean);
begin
if HandleAllocated then
Perform(BM_SETSTYLE, BS_OWNERDRAW, 1);
end;
procedure TButton.CNCtlcolorbtn(var Message: TMessage);
begin
DWORD(Message.Result) := CreateSolidBrush($79FF); // Цвет фона кнопки
end;
procedure TButton.CNDrawitem(var Message: TWMDrawItem);
var
DC: HDC;
SaveObj: HGDIOBJ;
R: TRect;
begin
R := ClientRect;
DC := Message.DrawItemStruct.hDC;
SaveObj := SelectObject(DC, Font.Handle);
SetBkMode(DC, TRANSPARENT);
DrawText(DC, PChar(Caption), -1, R, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
SelectObject(DC, SaveObj);
Message.Result := 1;
end;
procedure TButton.WMPaint(var Message: TWMPaint);
var
DC: HDC;
R: TRect;
begin
inherited;
if GetFocus = Handle then begin
DC := GetDC(Handle);
SelectObject(DC, GetStockObject(DC_BRUSH));
SetDCBrushColor(DC, $FF); // Цвет границы кнопки при фокусе
R := ClientRect;
InflateRect(R, -2, -2);
FrameRect(DC, R, DC_BRUSH);
ReleaseDC(Handle, DC);
end;
end;
Этот код должен быть размещен в единице, которая включается в проект после stdctrls, чтобы переопределение класса TButton сработало корректно.
Важные замечания:
Пользователь отметил, что у него есть небольшая команда разработчиков, и распространение обновленных компонентов может быть заметным усилием.
В комментариях обсуждается возможность использования стиля bsCommandLink для создания кнопки, похожей на CommandLink Button, который был введен в Windows Vista.
Также обсуждается возможность создания собственного компонента, который можно будет использовать многократно, вместо создания нового компонента каждый раз при необходимости.
Заключение:
Создание плоской кнопки без рамки в Delphi 7 возможно с использованием переопределения стандартного компонента TButton и owner draw. Это позволит настроить внешний вид кнопки в дизайневре, без необходимости изменения внешнего вида через LookAndFeel или создания кастомной темы, что соответствует требованиям пользователя.
Создание плоской кнопки без рамки в Delphi 7 путем переопределения стандартного компонента TButton с использованием owner draw.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.