Word 2007/2010中有各种显示尺寸单位,要想写好VSTO程序我们必须得了解在各种尺寸单位间的转换。
以下是我写的转换函数,希望对大家有帮助。
/// <summary> /// Caculate Height in Pixel /// </summary> /// <param name="height">User Input Height Value</param> /// <param name="mode">Measurement Unit</param> /// <param name="dpi">Appliced DPI</param> /// <returns>Pixel value caculated</returns> public virtual int CaculateHeightInPixel(int height, MeasurementUnitType mode, int dpi) { int retVal = height; switch (mode) { case MeasurementUnitType.Inches: retVal = height * dpi; break; case MeasurementUnitType.Centimeters: retVal = Convert.ToInt32((float)height / 2.54 * dpi); break; case MeasurementUnitType.Millimeters: retVal = Convert.ToInt32((float)height / 25.4 * dpi); break; case MeasurementUnitType.Pixel: retVal = height; break; case MeasurementUnitType.Picas: retVal = Convert.ToInt32((float)height / 6 * dpi); break; case MeasurementUnitType.Points: retVal = Convert.ToInt32((float)height / 72 * dpi); break; } return retVal; } public virtual int CaculateHeightInMeasurementUnit(int heightInPixel, MeasurementUnitType mode, int dpi) { int retVal = heightInPixel; switch (mode) { case MeasurementUnitType.Inches: retVal = heightInPixel / dpi; break; case MeasurementUnitType.Centimeters: retVal = Convert.ToInt32((float)heightInPixel/dpi * 2.54 ); break; case MeasurementUnitType.Millimeters: retVal = Convert.ToInt32((float)heightInPixel/dpi * 25.4 ); break; case MeasurementUnitType.Pixel: retVal = heightInPixel; break; case MeasurementUnitType.Picas: retVal = Convert.ToInt32((float)heightInPixel / dpi * 6); break; case MeasurementUnitType.Points: retVal = Convert.ToInt32((float)heightInPixel/ dpi * 72); break; } return retVal; }
需要解决的问题:
1.如何得到当前的显示单位
a.Word 2007/2010中以Word AddIn项目为例,我们可以通过Application.Options.MeasurementUnit得到当前显示单位的设置
b.Excel 2007/2010中同样也已AddIn项目为例,我们可以通过Application.MeasurementUnit得到我们要的单位设置
注意:从Word和Excel中返回的单位设置类型是不一样的,我的建议是我们定义我们自己的单位类型去同时适应两种项目类型。
以下是我做的定义,
/// <summary> /// Measurement Unit Used In Office /// </summary> public enum MeasurementUnitType { /// <summary> /// Pixels = Inches * DPI /// </summary> /// <remarks> /// Minumum unit /// </remarks> Pixel = 1, /// <summary> /// Point = Inch / 72 /// </summary> /// <remarks> /// Available in word /// </remarks> Points = 2, /// <summary> /// MM = Inch / 25.4 /// </summary> /// <remarks> /// Available in word and excel /// </remarks> Millimeters = 3, /// <summary> /// Pica = Inch / 6 /// </summary> /// <remarks> /// Available in word /// </remarks> Picas = 4, /// <summary> /// CM = Inch / 2.54 /// </summary> /// <remarks> /// Available in word and excel /// </remarks> Centimeters = 5, /// <summary> /// Inch is comment measure unit in EU and US /// </summary> /// <remarks> /// Available in word and excel /// </remarks> Inches = 6, }
2.怎么得到对应的DPI
待续。。。
在ZInt条码系统中的应用,
//input_height: 用户输入的高度数值
//mod: 用户选择的显示单位
//border_pix_offset : 边框宽度
//shr: 是否显示可读文本, 9是内置文本的字体高度
symbology_pix_Height = caculate_pix_height(input_height,mod)/2 - 2*border_pix_offset - shr?9:0
参考:
1.http://auctionrepair.com/pixels.html
2.http://stackoverflow.com/questions/604203/twips-pixels-and-points-oh-my
3.http://en.wikipedia.org/wiki/Centimetre