nlve/nlve.lpr
4aiman 71e9292885 Полоса меню снова настоящая, цвет задаётся по-своему на каждой системе
Самодельная полоса из кнопок стоила поведения: наведение на соседнее
название не перекидывало туда раскрытый список, не работал переход по
меню с Alt и стрелками. Подражать настоящему меню своими руками пришлось
бы до бесконечности, а причина отказа была одна — цвет.

Цвет решается иначе. Под gtk2 своими руками меню не рисуется, и это
записано в самом LCL: OwnerDraw, OnDrawItem и OnMeasureItem там помечены
как неподдерживаемые (interfaces/gtk2/issues.xml), вызывает DoDrawItem
только win32. Зато gtk принимает описание стиля текстом —
gtk_rc_parse_string, разбирается один раз до создания окон. Под win32
наоборот: строк стиля нет, зато отрисовка пунктов работает, в том числе
для названий в самой полосе.

Проверено отдельным пробником (probe/menu): настоящее TMainMenu под gtk2
берёт наши цвета и в полосе, и в раскрытом списке, включая цвет
выделенного пункта.

Отрисовка пунктов теперь отличает полосу от раскрытого списка: в полосе
не нужно место под галочку и сочетание клавиш, иначе название разошлось
бы с шириной, которую мы же и посчитали.

Остаток полосы правее последнего названия под Windows по-прежнему рисует
система — это уступка, а не решение.
2026-08-21 10:44:31 +03:00

30 lines
911 B
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

program nlve;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Interfaces,
Forms,
uTheme,
uMainForm;
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Title := 'nlve';
Application.Scaled := True;
Application.Initialize;
{ Цвета меню задаются до создания окон: под gtk2 это строка стиля, а её
разбирают один раз — уже созданные виджеты о ней не узнают. }
ApplyMenuStyle;
{ Подписка на появление окон: своим окнам цвета задаются в их же
обработчике создания, а это подстраховка на случай окна, созданного
самой библиотекой. }
HookNewForms;
Application.CreateForm(TMainForm, MainFormInstance);
Application.Run;
end.