我有一个带文本框的应用程序,屏幕上文本框的宽度必须始终为用户屏幕上的17.5厘米。
这是我到目前为止所尝试的:
const double centimeter = 17.5; // the width I need
const double inches = centimeter * 0.393700787; // convert centimeter to inches
float dpi = GetDpiX(); // get the dpi. 96 in my case.
var pixels = dpi*inches; // this should give me the amount of pixels
textbox1.Width = Convert.ToInt32(pixels); // set it. Done.
private float GetDpiX()
{
floar returnValue;
Graphics graphics = CreateGraphics();
returnValue = graphics.DpiX;
graphics.Dispose(); // don’t forget to release the unnecessary resources
return returnValue;
}
但这给了我不同尺寸和不同分辨率。
它给我 13 cm 1680 x 1050 和 21,5 cm 1024 x 768 。
我做错了什么?
答案 0 :(得分:7)
方法graphics.DpiX不会给出显示器每英寸的真实点数。它返回Windows显示属性中设置的DPI,主要是96或120 DPI。
无法读取显示器的实际DPI。微软确实对Windows Vista / 7进行了研究,但只要显示器制造商不提供从显示器硬件读取值的标准方法,就不可能。
答案 1 :(得分:3)
是的,不幸的是Xenan是对的。 要解决此问题,您可以通过手动校准,由用户完成。
e.g。在屏幕上绘制一条400像素的线,要求用户在屏幕上测量它并设置结果。现在计算校准的PPI(每英寸像素数)非常简单。
答案 2 :(得分:0)
Size结构的Width属性取决于Graphics类的PageUnit和PageScale设置。尝试使用这些设置来获得所需的效果。由于您很可能需要在控件的Paint事件上修改这些设置,因此我建议您创建自己的自定义TextBox控件。