程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> [函數] Firemonkey Windows 重新計算 Font Baseline,firemonkeybaseline

[函數] Firemonkey Windows 重新計算 Font Baseline,firemonkeybaseline

編輯:Delphi

[函數] Firemonkey Windows 重新計算 Font Baseline,firemonkeybaseline


  計算字型 Baseline 是一個不常用的函數,但如果想要顯示不同大小文字下方對齊,就得用它來計算字型的 Baseline 才行,如果計算不准,顯示的文字就會高高低低不整齊。

  在 Firemonkey 的 Windows 平台下(其它平台沒有問題),取得字型文字的 Baseline 總有些不對勁(因為並不是所有的字型都有問題,約 5% 的字型取得的 Baseline 位置會不對)。

  其實官方提供的計算函數 TFontGlyphManager.Current.GetBaseline 沒什麼問題,主要是與 Canvas.TextHeight 搭配運用所產的問題,簡單的說就是:使用 Canvas.TextHeight 計算的高度與 GetBaseline 裡計算的 Metrics.tmHeight 高度不同造成的,只要使這二個高度匹配,問題就解決了

 

測試工程下載:

[函數]TestFontBaseline_重新計算Baseline_Aone.zip

 

重新計算 Baseline 函數(無需修改官方代碼,需要計算時請自行調用下列函數):

uses
  Winapi.Windows,
  FMX.Helpers.Win;

// 計算正確的 Font Baseline for Windows by Aone (2016/11/09)
// 函數改自: FMX.Helpers.Win.pas 內的 TWinFontGlyphManager.LoadResource; 函數
// 參數 Font, Scale 與原來的 GetBaseline 相同,第3個參數 TextHeight1 請代入由 Canvas.TextHeight 取得的文字高度

function GetBaseline(const Font: TFont; const Scale: Single; const TextHeight1: Single): Single; var Height: Integer; Metrics: TTextMetric; CurrentSettings: TFontSettings; FFont: HFONT; DC: HDC; begin Result := 0; CurrentSettings.Family := Font.Family; CurrentSettings.Size := Font.Size; CurrentSettings.Style := Font.StyleExt; CurrentSettings.Scale := Scale; Height := -Round(CurrentSettings.Size * CurrentSettings.Scale); FFont := CreateFont(Height, 0, 0, 0, FontWeightToWinapi(CurrentSettings.Style.Weight), Cardinal(not CurrentSettings.Style.Slant.IsRegular), 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, PChar(CurrentSettings.Family)); if FFont = 0 then Exit; DC := CreateCompatibleDC(0); SelectObject(DC, FFont); GetTextMetrics(DC, Metrics); DeleteDC(DC); Result := TextHeight1 * (Metrics.tmAscent / Metrics.tmHeight); end;

 

修正前:

 

修正後:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved