Самодельная полоса из кнопок стоила поведения: наведение на соседнее название не перекидывало туда раскрытый список, не работал переход по меню с Alt и стрелками. Подражать настоящему меню своими руками пришлось бы до бесконечности, а причина отказа была одна — цвет. Цвет решается иначе. Под gtk2 своими руками меню не рисуется, и это записано в самом LCL: OwnerDraw, OnDrawItem и OnMeasureItem там помечены как неподдерживаемые (interfaces/gtk2/issues.xml), вызывает DoDrawItem только win32. Зато gtk принимает описание стиля текстом — gtk_rc_parse_string, разбирается один раз до создания окон. Под win32 наоборот: строк стиля нет, зато отрисовка пунктов работает, в том числе для названий в самой полосе. Проверено отдельным пробником (probe/menu): настоящее TMainMenu под gtk2 берёт наши цвета и в полосе, и в раскрытом списке, включая цвет выделенного пункта. Отрисовка пунктов теперь отличает полосу от раскрытого списка: в полосе не нужно место под галочку и сочетание клавиш, иначе название разошлось бы с шириной, которую мы же и посчитали. Остаток полосы правее последнего названия под Windows по-прежнему рисует система — это уступка, а не решение.
30 lines
911 B
ObjectPascal
30 lines
911 B
ObjectPascal
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.
|