簡單來說就是調用Graphics對象的MeasureString函數,下面是一個簡單的例子
//創建Graphics對象
CPaintDC dc(this);
Graphics gra(dc.m_hDC);
//首先創建字體相關
FontFamily fontFamily(L"Arial"); //字體
Font font(&fontFamily, 30, FontStyleRegular, UnitPixel); //30爲字號,就是文字的大小
PontF pointF(0,0f, 0,0f); //繪畫的x、y座標
WCHAR string[256];
wcscpy(string, L"28:sdf:的"); //字符串
RectF boundRect; //作爲MeasureString的參數,調用MeasureString後會把x、y、高度和寬度填入boundRect裏
gra.MeasureString(string, wcslen(string), &font, pointF, &boundRect);
獲取相關字體的高度還有一個方法,就是調用Font對象的GetHeight()函數,如下
Font font(&fontFamily, 30, FontStyleRegular, UnitPixel);
float height = font.GetHeight(&gra);
主意:GetHeight()獲得的高度跟gra.MeasureString函數獲得的高度是不同的。GetHeight()獲得的高度是該字體剛好的像素高度,而gra.MeasureString獲得的高度是包含該字符串的區域的高度,MSDN的說明是Pointer to a RectF object that receives the rectangle that bounds the string.
還有一些其他的方法可參看codeproject裏的帖子:
http://beta.codeproject.com/answers/56071/How-to-get-the-width-of-a-fixed-width-font-at-a-sp.aspx
http://bbs.csdn.net/topics/40456323
http://www.cnblogs.com/zhjzwl/archive/2009/03/26/1422000.html
C#(C#培訓 )中以像素作爲尺寸單位,像素是一種相對的尺寸概念,與毫米的轉換與當前顯示器的分辨率有關。在不同分辨率下轉換的係數不同。
藉助GDI可以完成毫米至像素的轉換。
public static double MillimetersToPixelsWidth(double length)
{ System.Windows.Forms.Panel p = new System.Windows.Forms.Panel();
System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(p.Handle);
IntPtr hdc = g.GetHdc();
int width = GetDeviceCaps(hdc, 4); //HORZRES
int pixels = GetDeviceCaps(hdc, 8);// BITSPIXEL
g.ReleaseHdc(hdc);
return (((double)pixels / (double)width) * (double)length);
}
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int Index);
像素與毫米的轉換
轉換還需要知道另一個參數:DPI(每英寸多少點)
象素數 / DPI = 英寸數
英寸數 * 25.4 = 毫米數
對於顯示設備,不管是打印機還是屏幕,都有一種通用的方法
先用GetDeviceCaps(設備句柄,LOGPIXELSX)
或者 GetDeviceCaps(設備句柄,LOGPIXELSY)獲得設備每英寸的像素數
分別記爲:px 和 py
一英寸等於25.4mm
那麼毫米換算成像素的公式爲
水平方向的換算: x * px /25.4
垂直方向的換算: y * py /25.4
像素換算爲毫米 x * 25.4 / px
在程序中這麼寫
MyControl.Height := 10{mm} * PixelsPerInch * 10 div 254;
分子和分母同乘以10,將浮點數運算轉化爲整數運算,效率更高