2010-05-31 110 views

回答

11

當映射模式爲mm_Text(通常是),並且lfHeight字段爲正數時,它已經給出了以點爲單位的高度。當它是負值時,單位是像素。 MSDN for LogFont給你公式它們之間的轉換:

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); 

每英寸有72點。 GetDeviceCaps告訴您給定設備上每英寸的像素數。反轉公式以從點獲取像素:

PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LogPixelsY); 

這裏要實現的重要一點是您需要設備上下文。字體大小不獨立於其出現的媒體而存在。屏幕上字體的像素高度將與打印機上字體的像素高度不同。使用您計劃繪製的任何畫布的Handle屬性。

+3

>「當lfHeight字段爲正值時」 - 然後字體映射器爲單元格高度提供匹配,即字符高度+內部引導。要獲得點的大小,必須從(單元格)高度中減去內部前導,然後按照上述步驟操作。 – 2010-05-31 15:58:56

+2

我認爲我的第一條評論有點模糊,有點誤導。如果說,模糊不會; 「lfHeight」總是以像素爲單位,唯一的區別是當它是完整的單元格高度,當它的絕對值是字符高度時。如果說有誤導性;由於LOGFONT結構沒有「內部領先」信息,所以無法通過正面高度計算點的大小。必須選擇字體到DC然後使用GetTextMetrics,然後字符高度爲tmHeight-tmInternalLeading。 – 2010-06-01 21:41:14

1

我覺得這也有點混亂。 以下是我學到的一些東西。 ;)

  1. 檢查lfPitchAndFamily的兩個低位以確定字體類型。
  2. 對於固定間距字體,請使用GetTextMetricsTEXTMETRIC結構。
  3. 對於可變間距字體(真實類型等),請使用GetOutlineTextMetricsOUTLINETEXTMETRIC結構。確保你的結構正確對齊。此外,結構是可變大小的。調用一次函數來獲得大小,分配空間,然後再次調用函數來填充結構。
  4. 從那裏,你可以找到適當的上升,下降和其他尺寸相關的信息。

請記住,它們是推薦值,並非所有顯示例程都能正確使用它們。例如,我正在計算確定給定字符串文本的對話框靜態控制所需高度的正確方法。 似乎並沒有Microsoft遵循他們自己的文檔。 ;) 不是說文檔是全部清楚或完整的,首先。

相關問題