调整主菜单的大小以获得高DPI /字体大小

时间:2013-12-29 12:50:25

标签: delphi user-interface fonts c++builder dpi

标准主菜单/弹出菜单中包含图像时,我遇到字体高度问题。看起来像这样。

Large Font Issue

当没有图像时,没有上面显示的问题。主菜单使用TImageList,图像宽度/高度设置为16。

所以我想保留16x16的图像大小并将其居中,以获得类似的结果:

Large Font Issue corrected

如何读取主菜单的字体高度并相应调整TImageList中的图像?我的一个想法是将图像从一个TImageList复制到另一个具有更大图像宽度/高度的图像,但我仍然需要根据字体大小确定合适的大小。我该怎么做?

更新

我通过检查SystemParametersInfo - SPI_GETNONCLIENTMETRICS值并使用iMenuHeight宽度/高度TImageList值来解决此问题。在更改宽度/高度后删除图像,我将另一个复制到另一个TImageList。完全按照预期工作。谢谢大家的最有帮助的答案。

更新2

在进一步检查问题之后,我标记为正确的解决方案会给出更好的结果,所以我切换到那个。在Win7和XP上测试过,似乎工作正常。

5 个答案:

答案 0 :(得分:3)

嗯,Canvas.GetTextHeight('gh')通常有助于获得文字的高度。但是如果DPI不同,您只需按Screen.PixelsPerInch / 96.0进行缩放。

答案 1 :(得分:3)

您可以通过选择临时DC来获得Screen.MenuFont的高度:

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;

答案 2 :(得分:1)

文本高度可能不是您需要使用的。我建议你使用方形尺寸等于普遍的小图标尺寸的图标。这是系统指标,其ID为SM_CXSMICON。通过调用传递该ID的GetSystemMetrics来检索该值。

答案 3 :(得分:1)

您可以将Power Menu Component与许多高级功能配合使用 从这里下载:http://elvand.com/downloads/DELPHI/PowerMenu.zip

Delphi7的-XE2 大小= 193 KB

答案 4 :(得分:0)

 #include <windows.h>

 int GetMainMenuHeight(void)
 {
   NONCLIENTMETRICS Rec;

   Rec.cbSize = sizeof(Rec);
   if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Rec.cbSize, &Rec.cbSize, 0))
    return Rec.iMenuHeight;
   else return -1;
 }