vcl-styles-utils icon indicating copy to clipboard operation
vcl-styles-utils copied to clipboard

Menus DPI

Open justapps opened this issue 8 years ago • 2 comments

Hi

I use Delphi Berlin and use the High DPI setting in my applications. To overcome the Delphi issue of not showing the top level menu with the right font size when switching between displays with different resolutions, I use a TToolBar and assign my menu to that. Today I included your units so I could using styles. It works but the font size isn't right when moving the forms between different dpi displays. I added this line below. That fixes the font but the MenuItem but I cannot figure out how to extend the menuitem width to accommodate the new size.

procedure TSysPopupStyleHook.MNSELECTITEM(var Message: TMessage); .. if Assigned(Font) then begin Canvas.Font := Font; Canvas.Font.Size := MulDiv(9, Application.ActiveForm.PixelsPerInch , 96); // here end;

justapps avatar Dec 08 '16 21:12 justapps

I also did this in Vcl.Menus but others may not need to because I'm using the ImageList components from AlphaSkins to scale based on DPI:

function TMenuItem.GetDevicePPI: Integer;
begin
  Result := Screen.ActiveForm.PixelsPerInch;
end;
 procedure MeasureThemedMenuItem;
  const
    CheckMarkStates: array[Boolean {Enabled}, Boolean {RadioItem}] of TThemedMenu =
      ((tmPopupCheckDisabled, tmPopupBulletDisabled), (tmPopupCheckNormal, tmPopupBulletNormal));
    CAlignments: array[TPopupAlignment] of TTextFormats = (tfLeft, tfRight, tfCenter);
  var
    LMargins: TElementMargins;
    LSize, GlyphSize: TSize;
    LDrawStyle: TTextFormat;
  begin
    Height := 0;
    //Width := 0; //brent commented out

    // brent
    if (Screen.ActiveForm.PixelsPerInch = 96) then
      Width := 0
    else
      Width := MulDiv(30, LPPI, 96);
    // end brent

justapps avatar Dec 13 '16 14:12 justapps

You can try the fix in #205

pyscripter avatar Nov 13 '17 14:11 pyscripter