C 使用GDI根據文字規格繪製基準線

2021-10-11 16:22:01 字數 1839 閱讀 4007

由於根據需求需要繪製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...