2009-02-21 38 views
9

Làm cách nào để có được UserDrawn UserControl để tôn trọng người dùng dpi (96/120/xxx) và/hoặc kích thước phông chữ (bình thường, lớn, cực lớn)?C# Mở rộng nội dung UserControl để phù hợp với người dùng Dpi/Kích thước phông chữ

Một số người đề xuất sử dụng thuộc tính DpiX và DpiY trên đối tượng Đồ họa, nhưng điều đó dường như không có gì trong tầm kiểm soát của tôi (nghĩa là chúng luôn được đặt là 96, bất kể cỡ phông hoặc dpi tôi chọn).

Có một câu hỏi tương tự khác ở đây trên StackOverflow nơi nó gợi ý sử dụng các thuộc tính AutoScale, nhưng các giải pháp được đề xuất cũng không thực sự làm gì cả.

Không có cách nào để thực hiện việc này trong .NET trừ khi dựa vào WPF?

Trả lời

3

Tôi có cùng một vấn đề, tôi đã thử sử dụng GetDC + GetDeviceCaps + ReleaseDC, ngoại trừ việc sử dụng Đồ họa hoạt động, ít nhất trên Vista32. Tôi chưa có kinh nghiệm với DPI, nhưng không ai trả lời điều này và ít nhất điều này có thể hữu ích cho người khác.

Khám phá Creating a DPI-Aware Application. Điều này đề cập đến lý do tại sao nó luôn có thể trả về 96 bất kể thiết lập DPI thực tế.

Trích từ trên cao liên kết:

DPI trong một ứng dụng Win32

Trong các ứng dụng Win32, làm như sau:

  • Sử dụng chức năng SetProcessDPIAware hủy rộng dpi.
  • Khi định kích thước các phần tử giao diện được vẽ, hãy sử dụng các phép đo vật lý, chẳng hạn như cm. Bằng cách sử dụng kích thước vật lý thay vì pixel, bạn đảm bảo kích thước nhất quán trên tất cả các loại màn hình.
  • Để nhận cài đặt dpi hệ thống, hãy sử dụng chức năng CDC :: GetDeviceCaps với cờ LOGPIXELSX. Nếu bạn không hủy kích thước dpi, cuộc gọi này sẽ trả về giá trị mặc định là 96 dpi.
  • Sử dụng chức năng GetSystemMetrics để nhận các kích thước ưa thích của các yếu tố giao diện người dùng, chẳng hạn như đường viền cửa sổ. Khi chia tỷ lệ dpi bị vô hiệu hóa, các giá trị đo được trả về cho các phần tử giao diện được chia tỷ lệ cho cài đặt dpi đã chọn. Nếu tỷ lệ dpi đang hoạt động, hàm trả về các phép đo dựa trên 96 dpi, bất kể cài đặt dpi của hệ thống là gì.

đã trả lời từ: Mã About DPI Issue

Mẫu viết lại với sử dụng -statement (original source):

float dpiX = 96, dpiY = 96; 
using(Graphics graphics = this.CreateGraphics()) 
{ 
    dpiX = graphics.DpiX; 
    dpiY = graphics.DpiY; 
} 
11

Bạn sẽ cần phải thiết lập thuộc tính AutoScaleMode của usercontrol để AutoScaleMode. Dpi và không đặt thuộc tính AutoScale thành true. Nếu bạn làm như vậy, nó sẽ đặt lại AutoScaleMode trở về None. Thuộc tính AutoScale đã lỗi thời và chỉ có khả năng tương thích ngược (xem Lưu ý quan trọng trong số MSDN article) này.

Ngoài ra, trong Windows Vista/7, trừ khi bạn xác định rõ ràng ứng dụng của bạn là DPI, Windows sẽ mô phỏng môi trường DPI mặc định để ứng dụng của bạn hiển thị 96 DPI, sau đó chia tỷ lệ bitmap thành kích thước phù hợp. Để tránh điều đó, bạn có thể thay đổi tệp kê khai ứng dụng của mình để thông báo cho Windows rằng bạn đang thực sự nhận thức được DPI - xem Sử dụng tệp kê khai để khai báo nhận thức DPI trong this article.

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