标准主菜单/弹出菜单中包含图像时,我遇到字体高度问题。看起来像这样。
当没有图像时,没有上面显示的问题。主菜单使用TImageList
,图像宽度/高度设置为16。
所以我想保留16x16的图像大小并将其居中,以获得类似的结果:
如何读取主菜单的字体高度并相应调整TImageList
中的图像?我的一个想法是将图像从一个TImageList
复制到另一个具有更大图像宽度/高度的图像,但我仍然需要根据字体大小确定合适的大小。我该怎么做?
更新
我通过检查SystemParametersInfo
- SPI_GETNONCLIENTMETRICS
值并使用iMenuHeight
宽度/高度TImageList
值来解决此问题。在更改宽度/高度后删除图像,我将另一个复制到另一个TImageList
。完全按照预期工作。谢谢大家的最有帮助的答案。
更新2
在进一步检查问题之后,我标记为正确的解决方案会给出更好的结果,所以我切换到那个。在Win7和XP上测试过,似乎工作正常。
答案 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;
}