2011-02-25 132 views
3

Dpi點與我的應用程序正在運行的任何顯示器的像素有關嗎?DPI圖形屏幕分辨率像素WinForm PrintPageEventArgs

int points; 
Screen primary; 

public Form1() { 
    InitializeComponent(); 
    points = -1; 
    primary = null; 
} 

void OnPaint(object sender, PaintEventArgs e) { 
    if (points < 0) { 
    points = (int)(e.Graphics.DpiX/72.0F); // There are 72 points per inch 
    } 
    if (primary == null) { 
    primary = Screen.PrimaryScreen; 
    Console.WriteLine(primary.WorkingArea.Height); 
    Console.WriteLine(primary.WorkingArea.Width); 
    Console.WriteLine(primary.BitsPerPixel); 
    } 
} 

我現在是否擁有我需要的所有信息?

我可以使用上面的任何信息來找出1200像素是多長時間?

+0

注意:一旦我學會了如何通用地顯示我的表單,表單上的數據將被髮送到打印機 - 因此標題中的PrintPageEventArgs。 – jp2code 2011-02-25 20:05:48

回答

1

我意識到它已經幾個月了,但是在讀一本書,WPF,我通過這個答案來了:

如果使用標準的Windows DPI設置(96 DPI),每一個與設備無關的單位對應一個真實的物理像素。

[Physical Unit Size] = [Device-Independent Unit Size] x [System DPI] 
        = 1/96 inch x 96 dpi 
        = 1 pixel 

因此,96像素可以通過Windows系統的DPI設置來製作一英寸。

但是,這實際上取決於您的顯示器尺寸。

對於設置爲1600×1200分辨率的19英寸LDC顯示器,使用畢達哥拉斯定理有助於計算像素密度顯示屏:

[Screen DPI] = Math.Sqrt(Math.Pow(1600, 2) + Math.Pow(1200, 2))/19 

利用這些數據,我寫了一個小靜工具,我現在請我的工具類我所有的項目:

/// <summary> 
/// Calculates the Screen Dots Per Inch of a Display Monitor 
/// </summary> 
/// <param name="monitorSize">Size, in inches</param> 
/// <param name="resolutionWidth">width resolution, in pixels</param> 
/// <param name="resolutionHeight">height resolution, in pixels</param> 
/// <returns>double presision value indicating the Screen Dots Per Inch</returns> 
public static double ScreenDPI(int monitorSize, int resolutionWidth, int resolutionHeight) { 
    //int resolutionWidth = 1600; 
    //int resolutionHeight = 1200; 
    //int monitorSize = 19; 
    if (0 < monitorSize) { 
    double screenDpi = Math.Sqrt(Math.Pow(resolutionWidth, 2) + Math.Pow(resolutionHeight, 2))/monitorSize; 
    return screenDpi; 
    } 
    return 0; 
} 

我希望別人得到一些使用了這個漂亮的小工具。

3

DPI字面意思是「每英寸點數」 - 其中dots ==像素。因此,要確定1200個像素多久是:

int inchesLong = (1200/e.Graphics.DpiX); 
+0

視頻dpi設置永遠不會準確。無論顯示器尺寸如何,它們都固定爲96或120或144。 – 2011-02-25 20:17:07

+0

@Hans不正確。例如,我測試了192DPI的應用程序。它確實看起來很時髦,但它的尺度很好! – 2011-02-25 20:34:55

+0

@大衛 - 你買了另一臺顯示器來匹配那個dpi設置嗎?要求英制尺寸相同。 – 2011-02-25 20:40:43

1

對於屏幕:像素= Graphics.DpiY *點/ 72

對於打印機,在你的問題受試者提到的,映射是1「像素」 =默認= 0.010英寸。這非常接近每英寸96點的默認視頻dpi,使得紙張的副本大小與您在顯示器上看到的大小相同。

製作表單並打印它們的屏幕截圖是一個壞主意。打印機具有更高的分辨率,典型值爲600 dpi。當屏幕上的每個像素成爲紙上的6x6斑點時,打印輸出會看起來很粗糙。對於反鋸齒文本尤其顯着和富有感染力。

+0

實際上,表單只是在將數據發送到打印機之前呈現數據的「打印預覽」。該項目應將所有數據繪製到表單中,以便將其發送到打印機。清除泥漿? :) – jp2code 2011-02-25 20:45:40

+1

確實很渾濁。使用PrintPreviewDialog,無需工作。 – 2011-02-25 20:48:29

+0

但是,最先出現雞還是雞蛋?大聲笑 - 我必須繪製對象到SOMETHING,然後才能使用MS的PrintPreviewDialog ...除非我錯過了一些東西。 – jp2code 2011-02-25 21:08:30