由於根據需求需要繪製4線3格顯示字母,所以需要知道字型規格的基線(baseline),這裡記錄下,下面部分摘錄自msdn:
c#獲取文字規格的方法在fontfamily類中,對於winform提供以下幾個函式:
這些方法返回的數字使用的是字型設計單位,因此,它們與特定的 font物件的大小和單位無關。
下面的插圖顯示了各種規格。
下面的示例顯示 arial 字型系列常規字形的規格。 該**還建立乙個大小為 16 畫素的 font物件(基於 arial 系列),並顯示該特定 font物件的規格(以畫素為單位)。
請注意上面的插圖中的前兩行輸出。 font物件返回的大小為 16, fontfamily物件返回的 em 高度為 2,048。 這兩個數字(16 和 2,048)對於在字型設計單位和 font物件的單位(在本例中為畫素)之間進行轉換很關鍵。
例如,您可按照以下方法將公升高值從設計單位轉換為畫素:
下面的**通過設定 pointf物件的 y 資料成員來在垂直方向上定位文字。 每新增加一行文字,y 座標就增加 font.height。 font物件的 height屬性返回該特定 font物件的行距(以畫素為單位)。 在此示例中, height返回的數值是 19。 請注意,這與通過將行距單位轉換為畫素而得到的數字(向上捨入為乙個整數)是相同的。
注意 em 高度(也叫大小或 em 大小)不是公升高值與降低值之和。 公升高值與降低值之和稱為單元格高度。 單元格高度減去內部間隙等於 em 高度。 單元格高度加外部間隙等於行距。
這裡我們建立乙個例項,來做測試:
fontfamily fontfamily = new fontfamily("arial");
font font = new font( fontfamily,76.8f,fontstyle.regular, graphicsunit.pixel);
pointf pointf = new pointf(10, 10);
solidbrush solidbrush = new solidbrush(color.black);
int ascent = fontfamily.getcellascent(fontstyle.regular);
float ascentpixel = font.size * ascent / fontfamily.getemheight(fontstyle.regular);
//下基線
e.graphics.drawline(pens.red, 100 , 500 + ascentpixel, 800, 500 + ascentpixel);
//上基線
e.graphics.drawline(pens.red, 100, 500 + ascentpixel - font.size / 2, 800, 500 + ascentpixel - font.size / 2);
e.graphics.drawstring("abcdefghijklmnopqrstuvwxyz", font, brushes.black, 100, 500);
繪製結果如下:
基本符合要求!下基線沒問題,上基線為我估算值,可酌情進行調整!
注意紅色部分,構建字型時需要和計算時的fontstyle保持一致,同時資料的度量單位一定要為pixel,預設情況下,font的graphicsunit為point.
GDI 測算文字繪製範圍
啥也不羅嗦,上 gdiplus solidbrush brush gdiplus color 124,25,28 gdiplus rectf bound size sz hdc hdc gs.gethdc settextcharacterextra hdc,0 settextjustificatio...
7 利用GDI 繪製文字
s 要繪製的字串。它定義字串的文字格式。它確定所繪製文字的顏色和紋理。結構,它指定所繪製文字的左上角。drawstring string s,font font,brush brush,pointf point drawstring string s,font font,brush brush,fl...
九 利用GDI 繪製文字
繪製文字在gdi 是非常廣泛的應用。就像常見的驗證碼。在gdi 中使用drawstring drawstring string,font,brush,pointf drawstring string,font,brush,rectanglef drawstring string,font,brush...