Icons in MainMenu und PopupMenu positionieren.

Antworten
Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Icons in MainMenu und PopupMenu positionieren.

Beitrag von Ally »

Der vertikale Abstand zwischen den Menüpunkten in MainMenu und PopupMenu ist unter Windows etwas knapp bemessen.
Insbesondere unter Windows 11 sieht das nicht besonders gut aus. (Unter Linux sind die Abstände übrigens ok)
Mit Hilfe von OnMeasureItem kann man das leicht korrigieren (siehe beiliegendes Beispiel).

Bleibt noch das Problem mit der Position des Icons.
Unter Windows 11 ist das Icon so weit links, dass es, wenn man mit der Maus darauf zeigt, außerhalb der Markierung liegt.
-
Windows 11 ohne optimiertem Abstand.png
Windows 11 ohne optimiertem Abstand.png (11.12 KiB) 1808 mal betrachtet
Windows 11 mit optimiertem Abstand.png
Windows 11 mit optimiertem Abstand.png (11.26 KiB) 1808 mal betrachtet
-
Die Frage ist jetzt also, wie kann man die Position des Icons beeinflussen?

Gruß Roland
Dateianhänge
OnMeasureItem.zip
(12.15 KiB) 76-mal heruntergeladen

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von sstvmaster »

Ich würde eher sagen das die Komponenten nicht richtig Scalieren. Bei 100% sieht der Abstand gut aus bei 125% sehr eingeengt.

Getestet mit Windows 10.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von Ally »

Hallo sstvmaster,
Bei 100% sieht der Abstand gut aus bei 125% sehr eingeengt.
Das kann ich so nicht bestätigen.

Die Bildschirmfotos oben sind bei 125% entstanden.
Auf einem Bildschirm mit 96 DPI (100%) sieht das dann so aus:
-
Windows 11 - 96 DPI - Lazarus.png
Windows 11 - 96 DPI - Lazarus.png (3.98 KiB) 1748 mal betrachtet
Die Skalierung scheint also richtig zu funktionieren.
Die blaue Hinterlegung ist generell zu niedrig und das Icon ist zu weit links.

In Programmen die mit Windows geliefert werden, wie z.B. Paint oder dem Explorer sehen Listen und Menüs etwa so aus.
-
Windows 11 - 96 DPI - Explorer.png
Windows 11 - 96 DPI - Explorer.png (3.32 KiB) 1748 mal betrachtet

Gruß Roland

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von Thandor »

Irgendwie gefällt mir die "falsche" Darstellung optisch besser als die "richtige" Darstellung :lol:

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von wp_xyz »

Meiner Meinung nach ist die Menü-Darstellung von Win11 genau so beabsichtigt, wie ja schon die blaue Unterstreichung bei TEdit, TCombobox und TMemo. Die Menüs von Notepad++ und LibreOffice sind genau schmal wie die von der LCL, und diese Programme sind mit Sicherheit nicht mit Lazarus geschrieben (wobei zugegebenermaßen die Icons bei LibreOffice weiter rechts sitzen - man müsste das win32-Widgetset in der LCL durchsuchen, ob die Icon-Position aus dem Widgetset kommt, oder im Code festgelegt wird).

Dass Microsoft bei anderen Programmen wie ihrem "Editor" oder "Paint" die Menüs anders darstellt, liegt daran, dass diese Anwendungen für den "Kachel-Modus" geschrieben sind (ich bin jetzt zu faul, den richtigen Ausdruck dafür zu suchen...).

Wenn jemand mit der Menüdarstellung nicht einverstanden ist, gibt es immer noch die Möglichkeit, die Menüs selbst zu zeichnen (OnDrawItem, OnMeasureItem), und viele Programme machen das auch so.

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von Ally »

Hallo Thandor, hallo wp_xyz,

sicherlich ist das auch ein Stück weit Geschmackssache.
Aber so wie die Darstellung im Moment ist, sieht das für meinen Geschmack schon ziemlich verunglückt aus.
Insbesondere das zu weit links angeordnete Icon, das dann schon nach links über den Hintergrund hinausragt, fällt da besonders ins Auge.

@wp_xyz
Das Problem mit der Höhe konnte ich ja mit OnMeasureItem lösen (siehe oben).
Aber wie man das Icon einige Pixel nach rechts verschiebt, konnte ich bis jetzt noch nicht herausfinden.

Gruß Roland

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von wp_xyz »

Das Menü-Icon wird von DrawMenuItemIcon in win32wsmenus gezeichnet, das bei ge-theme-tem Win11 wiederrum von DrawVistaPopupMenu und DrawVistaMenuBar aufgerufen wird. Dort wird auch das an DrawMenuItemIcon übergebene ImageRect festgelegt. Wenn ich in DrawVistaPopupMenuItem CheckRect.Left auf 6 setze (CheckRect ist das Rechteck für die Checkbox, das später als ImageRect wiederverwendet wird), rutscht das Icon tatsächlich nach rechts.

Da die DrawVista*-Funktionen anscheinend für alle Windows-Versionen seit Vista verwendet werden, müsste man so eine Änderung mit einer Versionsprüfung versehen... Wenn es dir wichtig ist, solltest du einen Bugreport erstellen. Aber ob sich jemand dieses Problems annehmen wird? Habe gerade eine Test-Anwendung mit Delphi gemacht, und da sind die Icons genauso positioniert wie in Lazarus (Und in Delphi ist der Menütext nicht einmal invertiert, was (schwarz auf dunkelblauem Hintergrund) richtig bescheuert aussieht).

Oder du führst, analog zu OnMeasureItem, ein OnPositionIcon Event ein, das die Icon-Position festlegt, aber das müsstest du durch alle Widgetsets schleifen, und das wird dann eine Sch... Arbeit, wenn du nicht alle Widgetset testen kannst, da der Compiler nur das aktelle Widgetset prüft.

P.S.
In DrawVistaMenuBar gibt es anscheinend eine Stelle mit hart-kodierter Icon-Größe, die Probleme beim LCLScaling machen wird:

Code: Alles auswählen

            DrawIconEx(AHDC, ItemRect.Left + (ItemRect.Width - 16) div 2, ItemRect.Top + (ItemRect.Height - 16) div 2,
              GetClassLong(ActiveChild, GCL_HICONSM),
              16, 16, 0, 0,
              DI_NORMAL); 

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Icons in MainMenu und PopupMenu positionieren.

Beitrag von Ally »

Hallo wp_xyz,

vielen Dank, das hat mir sehr weitergeholfen.
Ich habe CheckRect.Left auf 1/4 der Iconbreite gesetzt. So entsteht, auch bei höheren Auflösungen, immer der richtige Abstand.

Die Änderungen in Lazarus\lcl\interfaces\win32\win32wsmenus.pp sehen wie folgt aus:

Code: Alles auswählen

  // calc check/image rect
  CheckRect := ARect;
  // neu ---------------------------------------
  IconWidth := MenuIconWidth(AMenuItem, AHDC);   // verschoben
  CheckRect.Left := IconWidth div 4;
  // -------------------------------------------
  CheckRect.Right := CheckRect.Left + Metrics.CheckSize.cx + Metrics.CheckMargins.cxRightWidth + Metrics.CheckMargins.cxLeftWidth;
  CheckRect.Bottom := CheckRect.Top + Metrics.CheckSize.cy + Metrics.CheckMargins.cyTopHeight + Metrics.CheckMargins.cyBottomHeight;
  if AMenuItem.HasIcon then
  begin
    IconSize := AMenuItem.GetIconSize(AHDC);
    CheckRect.Bottom := Max(CheckRect.Bottom, CheckRect.Top+IconSize.y);
  end;
  // verschoben IconWidth := MenuIconWidth(AMenuItem, AHDC);
  CheckRect.Right := Max(CheckRect.Right, CheckRect.Left+IconWidth);
Getestet habe ich auf vier verschiedenen Rechnern mit Win10-100%, Win10-150%, Win11-100% und Win11-125%.

Zusätzlich setze ich in MeasureItem den Wert von AHeight auf 24 bis 28 je nach Geschmack (siehe oben - OnMeasureItem.zip). Das vergrößert nicht nur die "Trefferfläche" und somit die Usability, sondern sieht auch moderner aus.

Ob diese Lösung bei den Entwicklern mehrheitsfähig ist und sich dann jemand findet der das einbaut, ist sicherlich schwer zu sagen.
Wer, so wie ich, das aktuelle Aussehen der Menüs (insbesondere unter Windows 11) eher nicht so toll findet, kann ja selbst mal die zwei Zeilen ändern und testen.
Über Feedback würde ich mich natürlich freuen.

Gruß Roland

Antworten