我想根據從系統中提取的字體來確定真正的字體線條高度。我使用的字體是系統圖標字體。如何確定給定字體的像素間距(對於TVirtualTreeView)
這是我的代碼到目前爲止。
LOGFONTW lf;
ZeroMemory(&lf, sizeof(lf));
// Get icon font size from the system
if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
{
int H = 7;
{
// Create TBitmap and TFont
boost::scoped_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
boost::scoped_ptr<TFont> fnt(new TFont);
// Assign font from the system
fnt->Name = lf.lfFaceName;
fnt->Height = lf.lfHeight;
bmp->Canvas->Font->Assign(fnt.get());
// Calc height (returns 13 for default font size, 96 DPI but should be more like 18)
H = bmp->Canvas->TextHeight("Wq");
}
VST->DefaultNodeHeight = H;
VST->Font->Name = lf.lfFaceName;
VST->Font->Height = lf.lfHeight;
}
現在是這個問題。以上計算文字高度爲96 DPI時的默認字體大小爲13像素。但它應該是18,實際上是爲了很好的音高和線距。隨着DPI放大或字體放大,差異會增大。如果VirtualTreeView DefaultNoteHeight設置爲13像素,則它看起來非常緊密,線條彼此距離太近。
我需要知道其實是行間距爲解釋在這裏: http://msdn.microsoft.com/en-us/library/xwf9s90b%28v=VS.71%29.aspx
請解釋我如何提取從系統給定的字體行距。
我相信GetTextMetrics
是關鍵,但我只是想念一小塊拼圖,把它放在一起如何與上述一起使用它。
德爾福的例子也歡迎不必在C++ Builder中。
更新:
我已經加入了一點修改後的公式:
H = bmp->Canvas->TextHeight("Wq");
// Take care of smaller heights to make them minimum 18 pixels
H = (H < 18)? 18 : H;
似乎對我已經測試了所有字體大小工作確定(較大的字體是一個有點緊,但沒關係)。
我猜你不想使用GDI +,或...? (因爲在MSDN文章中使用的方法可以很容易地提取出來,例如['GetLineSpacing'](http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/FontFamily.cs# 518),但它們是GDI +)。 – TLama 2014-10-16 12:59:15
我只需要測量行間距,如果它與Windows XP兼容或更高版本,那麼我很好。 – Coder12345 2014-10-16 14:45:22
如果你想要字體的實際高度,你可以嘗試http://stackoverflow.com/questions/6804929/how-do-i-determine-the-height-of-a-line-of-text-in-a -tmemo-programmatically – fuchs777 2014-10-16 15:10:53