Search code examples
delphiuser-interfacefontsc++builderdpi

Resizing main menu for high DPI/font size


I have an issue with font height in standard main menu/popup menu when it contains images. Looks like this.

Large Font Issue

When there are no images, there are no problems as displayed above. Main menu uses TImageList with image width/height set to 16.

So I want to preserve image size at 16x16 and center it, to get something like this:

Large Font Issue corrected

How can I read the font height of the main menu and adjust images in TImageList accordingly? One idea I have is to copy images from one TImageList to another with larger image width/height but I still need to determine proper size from the font size. How do I do that?

UPDATE

I solved this by examining SystemParametersInfo - SPI_GETNONCLIENTMETRICS value and using the iMenuHeight value for TImageList Width/Height. As images are deleted after changing Width/Height, I copied another to another TImageList. Works exactly as it should. Thank you everyone for your most helpful answers.

UPDATE 2

After examining the problem futher the solution which I marked as correct down there is giving better result so I switched to that one instead. Tested on Win7 and XP, appears to be working properly.


Solution

  • You can get the height of Screen.MenuFont by selecting it to a temporary DC:

    function GetMenuFontHeight: Integer;
    var
      DC: HDC;
      SaveObj: HGDIOBJ;
      Size: TSize;
    begin
      DC := GetDC(HWND_DESKTOP);
      try
        SaveObj := SelectObject(DC, Screen.MenuFont.Handle);
        GetTextExtentPoint32(DC, '|', 1, Size); // the character doesn't really matter
        Result := Size.cy;
        SelectObject(DC, SaveObj);
      finally
        ReleaseDC(HWND_DESKTOP, DC);
      end;
    end;