2016-03-29 12 views
6

Tôi có biểu mẫu in chính xác trên máy nhưng khi triển khai ứng dụng trên máy khác, biểu mẫu không vừa trên trang và nền màn hình xuất hiện trên bản in tài liệu. Sự khác biệt chính giữa hai máy là một thiết bị có cài đặt DPI ở mức 150%. Tôi đã thay đổi tỉ lệ tự động nhiều lần nhưng không có gì thay đổi. Biểu mẫu trông ok trên màn hình nhưng không in chính xác. Dưới đây là mã tôi đang sử dụng.Biểu mẫu của tôi không in chính xác khi DPI là 150%

private void btnPrint_Click(object sender, EventArgs e) 
    { 
     CaptureScreen(); 
     printPreviewDialog1.Document = printDocument1; 
     printPreviewDialog1.ShowDialog();    
    } 

    Bitmap memoryImage; 

    private void CaptureScreen() 
    { 
     Graphics myGraphics = this.CreateGraphics(); 
     Size s = this.Size; 
     memoryImage = new Bitmap(s.Width, s.Height, myGraphics); 
     Graphics memoryGraphics = Graphics.FromImage(memoryImage); 
     memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s); 
    } 

    private void printDocument1_PrintPage(System.Object sender, 
      System.Drawing.Printing.PrintPageEventArgs e) 
    {    
     e.Graphics.DrawImage(memoryImage, 0, 0); 
    } 
+0

Tại sao bạn đang cố gắng in biểu mẫu web? Và bạn có chắc chắn sự khác biệt không có trong cài đặt in giữa hai máy không? –

+0

Người dùng cần điền, lưu và in biểu mẫu Windows. Biểu mẫu được in chính xác khi DPI ở mức 100% hoặc 125% nhưng không ở mức 150%. Tôi có một người dùng có vấn đề về thị lực nên anh ấy chạy cài đặt DPI cao nhất. – wsb

+0

Bạn có hình ảnh về bản in bị lỗi không? – NineBerry

Trả lời

4

Các dpi rộng cao hơn không phải là (như cũ 125% tỉ lệ) làm bằng cách tăng kích thước phông chữ Windows và có ứng dụng xử lý rộng, nhưng do có hệ điều hành thực hiện mở rộng quy mô cho bạn. Trong chế độ này, hệ điều hành nằm ở ứng dụng về các thiết lập dpi thực tế và tự nó mở rộng quy mô ứng dụng khi vẽ bề mặt của nó.

Kết quả là bên trong ứng dụng của bạn, vị trí pixel và kích thước không phải là những thực tế được sử dụng trên màn hình. Nhưng phương thức CopyFromScreen() yêu cầu tọa độ và kích thước pixel thực tế. Bạn cần phải tìm hiểu quy mô pixel mà ứng dụng của bạn trải qua và sau đó áp dụng tỷ lệ này cho các tọa độ bạn sử dụng.

Đây là mã hoạt động (Phương pháp getScalingFactor() đã bị đánh cắp từ this answer).

[DllImport("gdi32.dll")] 
static extern int GetDeviceCaps(IntPtr hdc, int nIndex); 
public enum DeviceCap 
{ 
    VERTRES = 10, 
    DESKTOPVERTRES = 117, 
} 

private float getScalingFactor() 
{ 
    using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
    { 
     IntPtr desktop = g.GetHdc(); 
     try 
     { 
      int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); 
      int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); 
      float ScreenScalingFactor = (float)PhysicalScreenHeight/(float)LogicalScreenHeight; 
      return ScreenScalingFactor; 
     } 
     finally 
     { 
      g.ReleaseHdc(); 
     } 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (Graphics myGraphics = this.CreateGraphics()) 
    { 
     var factor = getScalingFactor(); 
     Size s = new Size((int)(this.Size.Width * factor), (int)(this.Size.Height * factor)); 

     using (Bitmap memoryImage = new Bitmap(s.Width, s.Height, myGraphics)) 
     { 
      using (Graphics memoryGraphics = Graphics.FromImage(memoryImage)) 
      { 
       memoryGraphics.CopyFromScreen((int)(Location.X * factor), (int)(Location.Y * factor), 0, 0, s); 
       memoryImage.Save(@"D:\x.png", ImageFormat.Png); 
      } 
     } 
    } 
} 
Các vấn đề liên quan