Difference between revisions of "Win32MenuStyler"
From Free Pascal wiki
Jump to navigationJump to search (→Usage) |
|||
(10 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
=About= | =About= | ||
− | This is | + | This is unit win32menustyler, which helps to theme TMainMenu/TPopupMenu for Lazarus Windows apps. |
Sometimes app has dark theme, so it's needed to make TMainMenu also dark. | Sometimes app has dark theme, so it's needed to make TMainMenu also dark. | ||
− | [[File: | + | [[File:win32menustyler_.png]] |
Author: Alexey Torgashin | Author: Alexey Torgashin | ||
Line 16: | Line 16: | ||
* background, caption, also for disabled state | * background, caption, also for disabled state | ||
* checked state, also for radio-items | * checked state, also for radio-items | ||
+ | * separator line | ||
* shortcut text right-aligned | * shortcut text right-aligned | ||
* sub-menu arrow | * sub-menu arrow | ||
− | * | + | * icons from ImageList |
+ | * icons from menuitem.Bitmap | ||
* underlines for accelerators, and only when OS requires it (not painted until menu is activated) | * underlines for accelerators, and only when OS requires it (not painted until menu is activated) | ||
What is not supported: | What is not supported: | ||
− | * | + | * menuitem.SubMenuImages |
− | * horizontal | + | * menuitem.RightJustify |
+ | * white frame is painted for PopupMenus (cannot find a way to fill it, even if I call MenuStyler.ApplyBackColor in OnPopup) | ||
+ | * horizontal white line is painted under menu bar (non-client area, must [https://stackoverflow.com/questions/57177310/how-to-paint-over-white-line-between-menu-bar-and-client-area-of-window handle WM_NCPAINT somehow]) | ||
About other OS: GitHub repo has cross-platform "lazmenustyler" unit, but it don't give any effect on gtk2 demo app. And it should not work on macOS, macOS has very special theming and menu is located on the screen top. | About other OS: GitHub repo has cross-platform "lazmenustyler" unit, but it don't give any effect on gtk2 demo app. And it should not work on macOS, macOS has very special theming and menu is located on the screen top. | ||
Line 30: | Line 34: | ||
=Usage= | =Usage= | ||
− | * add win32menustyler to "uses" | + | * add win32menustyler to "uses" section |
* in form's OnShow, call: | * in form's OnShow, call: | ||
− | ** MenuStyler.ApplyToForm(Self | + | ** MenuStyler.ApplyToForm(Self) to theme MainMenu |
** MenuStyler.ApplyToMenu() for all needed PopupMenus | ** MenuStyler.ApplyToMenu() for all needed PopupMenus | ||
* when needed to apply different colors later: | * when needed to apply different colors later: | ||
** change them in global theme var | ** change them in global theme var | ||
− | ** call MenuStyler.ApplyToForm(Self | + | ** call MenuStyler.ApplyToForm(Self) |
** not needed to call again MenuStyler.ApplyToMenu() for PopupMenus | ** not needed to call again MenuStyler.ApplyToMenu() for PopupMenus | ||
* to cancel theming, call MenuStyler.ResetForm() and MenuStyler.ResetMenu() | * to cancel theming, call MenuStyler.ResetForm() and MenuStyler.ResetMenu() | ||
Line 47: | Line 51: | ||
ColorBk: TColor; | ColorBk: TColor; | ||
ColorBkSelected: TColor; | ColorBkSelected: TColor; | ||
+ | ColorBkSelectedDisabled: TColor; //used only if <>clNone | ||
+ | ColorSelBorder: TColor; //used only if <>clNone | ||
ColorFont: TColor; | ColorFont: TColor; | ||
+ | ColorFontSelected: TColor; //used only if <>clNone | ||
ColorFontDisabled: TColor; | ColorFontDisabled: TColor; | ||
ColorFontShortcut: TColor; | ColorFontShortcut: TColor; | ||
Line 55: | Line 62: | ||
FontName: string; | FontName: string; | ||
FontSize: integer; | FontSize: integer; | ||
− | IndentMinPercents: integer; | + | //indents in percents of average char width |
− | IndentBigPercents: integer; | + | IndentMinPercents: integer; //indent from edges to separator line |
− | IndentRightPercents: integer; | + | IndentBigPercents: integer; //indent from left edge to caption |
− | IndentSubmenuArrowPercents: integer; | + | IndentIconPercents: integer; //indents around the icon |
+ | IndentRightPercents: integer; //indent from right edge to end of shortcut text | ||
+ | IndentSubmenuArrowPercents: integer; //indent from right edge to submenu '>' char | ||
end; | end; | ||
Latest revision as of 22:21, 8 June 2022
This article applies to Windows only.
See also: Multiplatform Programming Guide
About
This is unit win32menustyler, which helps to theme TMainMenu/TPopupMenu for Lazarus Windows apps. Sometimes app has dark theme, so it's needed to make TMainMenu also dark.
Author: Alexey Torgashin
License: MPL 2.0 or LGPL
Detailed info
What it paints for menu items:
- background, caption, also for disabled state
- checked state, also for radio-items
- separator line
- shortcut text right-aligned
- sub-menu arrow
- icons from ImageList
- icons from menuitem.Bitmap
- underlines for accelerators, and only when OS requires it (not painted until menu is activated)
What is not supported:
- menuitem.SubMenuImages
- menuitem.RightJustify
- white frame is painted for PopupMenus (cannot find a way to fill it, even if I call MenuStyler.ApplyBackColor in OnPopup)
- horizontal white line is painted under menu bar (non-client area, must handle WM_NCPAINT somehow)
About other OS: GitHub repo has cross-platform "lazmenustyler" unit, but it don't give any effect on gtk2 demo app. And it should not work on macOS, macOS has very special theming and menu is located on the screen top.
Usage
- add win32menustyler to "uses" section
- in form's OnShow, call:
- MenuStyler.ApplyToForm(Self) to theme MainMenu
- MenuStyler.ApplyToMenu() for all needed PopupMenus
- when needed to apply different colors later:
- change them in global theme var
- call MenuStyler.ApplyToForm(Self)
- not needed to call again MenuStyler.ApplyToMenu() for PopupMenus
- to cancel theming, call MenuStyler.ResetForm() and MenuStyler.ResetMenu()
Unit gives global var to change all theming details:
type
TWin32MenuStylerTheme = record
ColorBk: TColor;
ColorBkSelected: TColor;
ColorBkSelectedDisabled: TColor; //used only if <>clNone
ColorSelBorder: TColor; //used only if <>clNone
ColorFont: TColor;
ColorFontSelected: TColor; //used only if <>clNone
ColorFontDisabled: TColor;
ColorFontShortcut: TColor;
CharCheckmark: WideChar;
CharRadiomark: WideChar;
CharSubmenu: WideChar;
FontName: string;
FontSize: integer;
//indents in percents of average char width
IndentMinPercents: integer; //indent from edges to separator line
IndentBigPercents: integer; //indent from left edge to caption
IndentIconPercents: integer; //indents around the icon
IndentRightPercents: integer; //indent from right edge to end of shortcut text
IndentSubmenuArrowPercents: integer; //indent from right edge to submenu '>' char
end;
var
MenuStylerTheme: TWin32MenuStylerTheme;