2014-10-16 41 views
2

我想根據從系統中提取的字體來確定真正的字體線條高度。我使用的字體是系統圖標字體。如何確定給定字體的像素間距(對於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; 

似乎對我已經測試了所有字體大小工作確定(較大的字體是一個有點緊,但沒關係)。

+0

我猜你不想使用GDI +,或...? (因爲在MSDN文章中使用的方法可以很容易地提取出來,例如['GetLineSpacing'](http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/FontFamily.cs# 518),但它們是GDI +)。 – TLama 2014-10-16 12:59:15

+0

我只需要測量行間距,如果它與Windows XP兼容或更高版本,那麼我很好。 – Coder12345 2014-10-16 14:45:22

+0

如果你想要字體的實際高度,你可以嘗試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

回答

1

我已經使用這個代碼來計算,以顯示文本塊所需的矩形,它可能是some你有幫助:

這是從我的原代碼的改型,但它應該給你的想法:DT_CALCRECT是要設置的標誌,因此它返回所需的rect。

RECT rc_ancho_en_gui; 
int height = 0; 

rc_ancho_en_gui.left = 0; 
rc_ancho_en_gui.right = 100; 
rc_ancho_en_gui.top = 0; 
rc_ancho_en_gui.bottom = 100; 

height = DrawText(BitmapHandle, "Wq", 2, &rc_ancho_en_gui, DT_CALCRECT | DT_WORDBREAK); 

我在TextHeight之前使用,但它沒有正常工作,要麼給我多或少的真正需要。這樣我就沒有任何問題產生的高度。

+0

我檢查了這一點,似乎這確實給了很好的價值......我會進一步檢查它,這可能是它! – Coder12345 2014-10-16 18:12:52

+0

我在想,你可能會傳遞一些多行文本,比如說'Wq \njÑ',然後在行數之間劃分結果,你將得到平均行高。我對TextHeight的問題實際上是用多行文本,因爲它給出的計算總是關閉。使用這種方法,高度正確對應於用戶的期望值,但是可能傳遞一個字符或兩個字符不允許考慮行間距。 – 2014-10-16 18:18:09

+0

經過進一步測試,我發現'DrawText'和'TextHeight'返回相同的值。不需要用多行分割,即使將文本「AA」或「Wq」放在同一高度,單行返回的值始終相同。我在原始文章中修改了公式,似乎可行。即使Windows資源管理器也會在Windows 8.1上剪裁帶有大DPI的字體,這很奇怪,上述公式比Windows資源管理器更好。 – Coder12345 2014-10-16 21:52:03

相關問題