GDI 測算文字繪製範圍

2021-05-27 01:35:31 字數 1814 閱讀 8701

啥也不羅嗦,上**:

gdiplus::solidbrush		brush(gdiplus::color(124,25,28));

gdiplus::rectf bound;

size sz;

hdc hdc = gs.gethdc();

settextcharacterextra( hdc, 0 );

settextjustification( hdc, 0, 1 );

gs.releasehdc( hdc );

gs.setsmoothingmode( smoothingmodeantialias );

gs.settextrenderinghint( textrenderinghintantialiasgridfit );

int emsize = 20;

gdiplus::stringformat *strfmt = gdiplus::stringformat::generictypographic()->clone();

fontfamily fontfamily(l"微軟雅黑");

//行間距計算

real linespace = fontfamily.getlinespacing(fontstyleregular);

real ascent = fontfamily.getcellascent(fontstyleregular);

real descent = fontfamily.getcelldescent(fontstyleregular);

real emheight = fontfamily.getemheight(fontstyleregular);

font font(&fontfamily, emsize, fontstyleregular, unitpixel);

real ftheight = font.getheight(&gs);

real ftsize = font.getsize();

int16 ascentp = ftsize * ascent / emheight;

int16 descentp = ftsize * descent / emheight;

int16 linespacep = ftsize * linespace / emheight;

int16 gapline = linespacep - ascentp - descentp;

//文字外包計算

gs.measurestring( text.c_str(), text.length(), &font, org, strfmt, &bound );

//繪製外包矩形

color clr(255, 0, 0);

pen pen( clr, 1 );

gs.drawrectangle( &pen, bound );

gs.drawstring( text.c_str(), text.length(), &font, org, strfmt, &brush );

return 0;

總結一下:不能怪罪measurestirng測算的不准,如果繪製 g 字元時,發現外包框與 g 字元下部僅僅貼著。  還有其他字元如果上部有很大的公升高,也會與外包框僅僅貼著吧。

所以,measurestring,計算的是所有字元都被包含時的外包框大小,而不是當前繪製的字元。測算的機理不同罷了。

當然,這是我的猜測,沒有任何官方文件支援。

另外,font::getheight() - font::getsize()基本可以認定為是字元間垂直距離(如果,如果沒有公升高、沉降字元存在,都是漢字方塊字情況下)

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...

GDI繪製網格

網格寬300,高600 bitmap image new bitmap 300,600 建立繪圖物件graphics graphics graphics graphics.fromimage image 清除畫布,背景顏色為紅色 graphics.clear color.red 通過迴圈畫出橫線 f...