2010-10-24 39 views
8

Tôi có một ứng dụng WinForm lưu trữ nhiều hình ảnh. Khi tôi đặt ứng dụng trên một máy Win7 có DPI là 120, nó hoàn toàn làm hỏng giao diện của biểu mẫu. Có cách nào để vô hiệu hóa tỷ lệ cho biểu mẫu của tôi không?C# WinForms vô hiệu hóa quy mô DPI

Tôi biết rằng đây là điều không được thông báo và DPI phải liền mạch và được xử lý bởi HĐH. Nhưng khi nói đến một ứng dụng da, các hình ảnh không có quy mô tốt. Tôi không có sự sáng tạo của việc tạo ra hình ảnh cho tất cả các biến thể DPI, vì vậy xin vui lòng không cho rằng đó là một câu trả lời.

Trả lời

10

Bạn sẽ có vấn đề lớn hơn khi bạn thay đổi thuộc tính AutoScaleMode. Tăng DPI cũng thay đổi kích thước phông chữ hệ thống. Nhất thiết như vậy, kích thước phông chữ được thể hiện bằng các điểm, 1/72 inch. Các phông chữ cần phải lớn hơn để có cùng kích thước điểm khi DPI tăng và giữ cho văn bản cũng dễ đọc khi được xem từ cùng một khoảng cách.

Vì các điều khiển không được thu nhỏ lại nữa, văn bản trên, một nút không còn phù hợp nữa. Một cách để chiến đấu này là thay đổi kích thước phông chữ trên các điều khiển theo tỷ lệ. Dễ dàng nếu bạn cho phép tất cả các điều khiển kế thừa phông chữ biểu mẫu, chỉ cần thay đổi thuộc tính Phông chữ của biểu mẫu cũng tự động cập nhật các điều khiển. Những bất lợi rõ ràng là người dùng sẽ có một thời gian khó đọc văn bản. Điều này đặc biệt xấu khi DPI đi tới 150 điểm trên mỗi inch và hơn thế nữa, giao diện người dùng của bạn biến thành một con tem bưu chính không sử dụng được.

Có, hình nền cần được thu nhỏ để vừa với điều khiển hoặc biểu mẫu lớn hơn. Một điểm ảnh trong ảnh bây giờ không còn bản đồ một-một trong một điểm ảnh của màn hình nữa. Giá trị Graphics.InterpolationMode mặc định làm một công việc khá tốt để lọc hình ảnh. Nhưng nó phụ thuộc vào loại hình ảnh như thế nào mà hóa ra. Một bức ảnh hầu như luôn luôn vảy rất tốt. Dòng nghệ thuật chi tiết và văn bản không có chi tiết. Chọn đúng loại hình ảnh sẽ mất nhiều thời gian để tránh phải tạo những hình ảnh riêng biệt.

Sự cố này sẽ không biến mất cho đến khi màn hình bắt đầu có loại độ phân giải mà máy in có. Chúng tôi vẫn còn cách 600 dpi cho màn hình máy tính để bàn. Điện thoại sẽ là đầu tiên.

+1

600 màn hình DPI đang trở thành hiện thực. Chỉ cần nhìn vào điện thoại của bạn (ok, không phải 600 nhưng 480 ở đây). Tương lai là ở đây. – Hooch

3

Bạn có thể đặt thuộc tính AutoScaleMode của biểu mẫu thành None.

+7

Tôi cố gắng này với thành công hạn chế. – MarkP

+0

Kết hợp việc này bằng cách chia tỷ lệ phông chữ của các điều khiển theo cách thủ công (như được đề xuất trong giải pháp khác tại đây) đã giải quyết được vấn đề cho tôi. – Zarat

3

Thêm một dòng mã trước khi cuộc gọi tự động tạo ra để InitializeComponent trong Form1-constructor giải quyết nó cho tôi:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // Make the GUI ignore the DPI setting 
     Font = new Font(Font.Name, 8.25f * 96f/CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont); 
     InitializeComponent(); 
    } 
} 
+0

Không hoạt động ở tất cả trên Windows 10 với màn hình 4K có tỷ lệ 150% – SlapY

+0

Kết hợp việc này với cài đặt AutoScaleMode thành Không giải quyết được sự cố cho tôi – Zarat

Các vấn đề liên quan