亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

NET 中,使用 GDI 來精確測量文本的實際繪出尺寸(C#)

2024-07-21 02:18:59
字體:
來源:轉載
供稿:網友
閱讀要求:了解 c# 調用 win32api 的基本原理和操作方式
--------------------------------------------------------------------------------


在開發 winform 控件時,通常需要測量文本繪出時的實際尺寸。
.net fcl 中的 gdi+ 類——system.drawing.graphics 提供了用于上述需要的 measurestring 方法,該方法返回了一個 sizef 結構的浮點數表示的結果,從表面上看起來似乎很精確,但在實際使用中發現有時此方法并不能精確測量出文本的實際寬度。
也曾反編譯 system.drawing.dll,但沒看出什么名堂來。
如果使用 gdi 卻能很好地測量出文本的實際繪出寬度,下面提供了調用 gdi win32api 來測量的 c# 實現源代碼,以供參考。

注: 代碼中的 windowsapi 是一個自定義類,包裝了大部分 win32api 調用的 c# 定義。

/// <summary>
/// 在指定的矩形區域內,按照指定的格式,測量文本的實際繪出尺寸。
/// </summary>
/// <param name="graphics">繪圖對象</param>
/// <param name="text">被測量的文本</param>
/// <param name="font">測量所用字體</param>
/// <param name="rc">以矩形表示的要繪制區域</param>
/// <param name="drawflags">文本格式</param>
/// <returns>尺寸</returns>
public static size gettextsize(graphics graphics, string text, font font, rectangle rc, drawtextformatflags drawflags)
{
// 一個記錄設備上下文句柄的變量
intptr hdc = intptr.zero;

if ( graphics != null )
{
// 獲取與提供的 graphics 關聯的設備上下文句柄
hdc = graphics.gethdc();
}
else
{
// 如果未提供 graphics,使用屏幕作為設備上下文
hdc = windowsapi.getdc(intptr.zero);
}

// 測量所用字體的句柄
intptr fonthandle = font.tohfont();

// 將測量所用字體添加到設備上下文
// 并記錄原來所使用的字體
intptr oldhfont = windowsapi.selectobject(hdc, fonthandle);


// rect 用于 win32api 調用,.net fcl 中的 retangle 不適用于 win32api 調用。
// 其定義如下:
//
// [structlayout(layoutkind.sequential)] // 這是必須的。
// public struct rect
// {
// public int left;
// public int top;
// public int right;
// public int bottom;
// }


// 創建一個 gdi win32api 調用所需的 rect 實例
rect rect = new rect();
rect.left = rc.left;
rect.right = rc.right;
rect.top = rc.top;
rect.bottom = rc.bottom;


// 文本繪制格式標志的枚舉定義:
// public enum drawtextformatflags
// {
// dt_top = 0x00000000,
// dt_left = 0x00000000,
// dt_center = 0x00000001,
// dt_right = 0x00000002,
// dt_vcenter = 0x00000004,
// dt_bottom = 0x00000008,
// dt_wordbreak = 0x00000010,
// dt_singleline = 0x00000020,
// dt_expandtabs = 0x00000040,
// dt_tabstop = 0x00000080,
// dt_noclip = 0x00000100,
// dt_externalleading = 0x00000200,
// dt_calcrect = 0x00000400,
// dt_noprefix = 0x00000800,
// dt_internal = 0x00001000,
// dt_editcontrol = 0x00002000,
// dt_path_ellipsis = 0x00004000,
// dt_end_ellipsis = 0x00008000,
// dt_modifystring = 0x00010000,
// dt_rtlreading = 0x00020000,
// dt_word_ellipsis = 0x00040000
// }

// 調用 gdi win32api 以測量文本的實際繪出時尺寸。
windowsapi.drawtext(hdc, text, text.length, ref rect,
(int)(drawflags | drawtextformatflags.dt_calcrect));

// 重設為原來的字體,這是 gdi 必須的。
windowsapi.selectobject(hdc, oldhfont);

// 刪除創建的測量用字體的句柄
windowsapi.deleteobject(fonthandle);

// 釋放已獲取的設備上下文句柄
if ( graphics != null )
graphics.releasehdc(hdc);
else
windowsapi.releasedc(intptr.zero, hdc);

// 返回實測結果
return new size(rect.right - rect.left, rect.bottom - rect.top);
}


以下是三個有用的重載方法:

public static size gettextsize(string text, font font, rectangle rc, drawtextformatflags drawflags)
{
return gettextsize(null, text, font, rc, drawflags);
}

public static size gettextsize(graphics graphics, string text, font font)
{
// 設置一個文本繪制格式,以單行左對齊方式來測量。
drawtextformatflags drawflags =
drawtextformatflags.dt_singleline |
drawtextformatflags.dt_left |
drawtextformatflags.dt_calcrect; // 這個標志表示要測量

rectangle rect = rectangle.empty;

return gettextsize(graphics, text, font, rect, drawflags) ;
}

public static size gettextsize(string text, font font)
{
return gettextsize(null, text, font);
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性生交大片免费| 欧洲亚洲免费在线| 色噜噜狠狠色综合网图区| 日韩在线免费视频| 色播久久人人爽人人爽人人片视av| 国产综合色香蕉精品| 国产精品国产自产拍高清av水多| 精品中文字幕久久久久久| 日本高清视频精品| 国产精品电影一区| 久久综合色影院| 久久精品色欧美aⅴ一区二区| 色综合色综合网色综合| www.精品av.com| 久久久久久久久久久国产| 欧美交受高潮1| 日韩av观看网址| 亚洲人成绝费网站色www| 亚洲伊人久久大香线蕉av| 91精品久久久久久久久青青| 国产不卡av在线免费观看| 午夜欧美大片免费观看| 国产又爽又黄的激情精品视频| 中文字幕少妇一区二区三区| 精品成人69xx.xyz| 日韩欧美中文字幕在线观看| 91精品免费视频| 久久在线视频在线| 日韩精品日韩在线观看| 亚洲色图35p| 久久精品国产成人| 一区二区中文字幕| 欧美裸体xxxx极品少妇| 日韩av在线一区| 久久精品国产v日韩v亚洲| 日韩精品在线免费| 少妇激情综合网| 精品久久久久久久久久| 欧美日韩国产精品专区| 北条麻妃99精品青青久久| 日韩精品在线观看视频| 高清欧美一区二区三区| 国产精品成av人在线视午夜片| 欧美日韩国产专区| 91在线视频成人| 欧美成人高清视频| 成人在线精品视频| 亚洲免费一在线| 国产精品视频久久久| 久久精品亚洲94久久精品| 亚洲伊人久久大香线蕉av| 日韩av影片在线观看| 欧美性xxxx极品hd满灌| 亚洲精品天天看| 国产一区二区三区在线视频| 亚洲色图17p| 中文字幕一精品亚洲无线一区| 亚洲欧美日韩国产中文| 欧美日韩国产在线看| 国外成人在线直播| 亚洲精品91美女久久久久久久| 亚洲成人亚洲激情| 成人午夜两性视频| 久久久久久久久久久网站| 欧美日韩久久久久| 91精品视频大全| 亚洲精品狠狠操| 亚洲欧美在线播放| 日韩av在线网站| 亚洲成人激情在线观看| 成人国产精品av| 亚洲精品久久久久久下一站| 欧美精品一区二区三区国产精品| 亚洲精品久久久久久下一站| 国产精品久久久久99| 国产成人自拍视频在线观看| 国产ts人妖一区二区三区| 久久亚洲精品一区二区| 日韩av在线资源| 国产自产女人91一区在线观看| 国产精品盗摄久久久| 亚洲精品ady| 欧美视频中文字幕在线| 色悠久久久久综合先锋影音下载| 韩国欧美亚洲国产| 国产成一区二区| 中文字幕亚洲一区二区三区五十路| 国产精品成人av在线| 中国日韩欧美久久久久久久久| 欧美成人精品h版在线观看| 日韩美女主播视频| 美女av一区二区三区| 国产精品精品视频一区二区三区| xxx一区二区| 国产91精品网站| 亚洲欧美另类中文字幕| 亚洲女性裸体视频| 国产精品嫩草视频| 国产精品视频999| 久久久久久免费精品| 热99精品只有里视频精品| 97在线观看免费| 欧美日韩国产成人在线观看| 亚洲国产精品悠悠久久琪琪| 久热在线中文字幕色999舞| 亚洲国产婷婷香蕉久久久久久| 在线看日韩欧美| 亚洲国产精久久久久久久| 欧美日韩国产综合视频在线观看中文| 久久精彩免费视频| 91久久嫩草影院一区二区| 亲爱的老师9免费观看全集电视剧| 国产精品自产拍高潮在线观看| 欧美第一黄色网| 成人精品久久久| 91久久久久久久久久久| 国产亚洲视频在线观看| 成人春色激情网| 国产成人综合精品| 黄色一区二区在线观看| 国产精品亚发布| 狠狠色香婷婷久久亚洲精品| 亚洲免费一在线| 精品人伦一区二区三区蜜桃免费| 国产成人精品免费久久久久| 国产成人精品一区| 久久久免费高清电视剧观看| 亚洲精品wwwww| 91精品久久久久久久久久久久久| 久久亚洲精品毛片| 青青草原成人在线视频| 成人精品一区二区三区电影黑人| 精品毛片三在线观看| 日韩av最新在线观看| 欧美成人精品在线观看| 在线免费观看羞羞视频一区二区| 97超级碰碰碰久久久| 久久成人综合视频| 欧美性生交xxxxx久久久| 97精品国产97久久久久久免费| 国产精品久久视频| 久久伊人精品视频| 久久露脸国产精品| 日韩欧美在线一区| 国产精品久久久亚洲| 国产欧美久久久久久| 久久久久国产精品免费| 国产亚洲视频在线| 91天堂在线观看| 欧美激情aaaa| 亚洲激情自拍图| 精品久久久久久久大神国产| 国产成人激情视频| 国产色综合天天综合网| 成人网在线免费观看| 自拍亚洲一区欧美另类| 国产精品成人国产乱一区| 日韩免费在线播放| 欧美色另类天堂2015| 国产精品网红直播| 成人h视频在线观看播放| 欧美一区二区三区免费视| 中文字幕国产亚洲| 国产欧美一区二区三区在线|