2012-02-21 36 views
37

Tôi đã tạo một ứng dụng hoạt động hoàn hảo cho đến khi người dùng chọn 125% hoặc 150%. Nó sẽ phá vỡ ứng dụng của tôi. Sau đó tôi tìm thấy một cách để tìm kích thước phông chữ bằng cách phát hiện DPI.Phát hiện kích thước phông chữ của cửa sổ (100%, 125%, 150%)

Điều này hoạt động tốt cho đến khi những người có phiên bản Windows 7 của Trung Quốc bắt đầu sử dụng ứng dụng của tôi. Toàn bộ các ứng dụng tôi có thể nói (Tôi không thể kiểm tra nó vì tôi chỉ có phiên bản tiếng Anh và cài đặt các gói ngôn ngữ không gây ra vấn đề) Các ký tự Trung Quốc đang gây ra một DPI kỳ lạ làm hỏng ứng dụng của tôi.

mã hiện tại của tôi làm việc như thế này:

if (dpi.DpiX == 120) //For 125% fonts 
{ 
    //Resize form and set default font to correct problems 
} 
else if (dpi.DpiX == 96) //For 100 and 150% fonts 
{ 
    //Resize form and set default font to correct problems 
} 

Mở phiên bản tiếng Anh của windows 7 mà làm việc tuyệt vời, nhưng các phiên bản bằng cách nào đó Trung Quốc bỏ qua ngay bằng cách này, và hình thức hủy hoại bản thân, với các điều khiển thậm chí không hiển thị, phông chữ cực lớn và đẩy qua vấn đề, hộp hình được di chuyển xung quanh.

Vì vậy, cách tốt nhất để phát hiện quy mô phông chữ của cửa sổ (100%, 125% và 150%) mà không phát hiện API là gì? Tôi cần một cái gì đó rắn sẽ làm việc trên tất cả các cửa sổ 7 hệ điều hành và ngôn ngữ.

+0

Tôi đã nhập rất nhanh và thực hiện một vài lỗi chính tả. Tôi muốn nói "DPI" không phải là "API". Xin lỗi –

+0

Những gì bạn mô tả âm thanh giống như một vấn đề với trình điều khiển video và/hoặc cài đặt phông chữ ... – Yahia

+0

Chỉ cần suggession: nếu bạn có số lượng lớn các khách hàng Trung Quốc, bạn nên đầu tư một chút thời gian để tạo ít nhất 'VirtualMachine' cho 'VirtualBox' hoặc' VmWare', vì vậy bạn có thể kiểm tra ứng dụng của mình trên đó với sự liên kết gần nhất với hệ điều hành thực, vì điều đó là có thể. – Tigran

Trả lời

16

Cách chính xác để xử lý các cài đặt DPI biến không phải là để phát hiện chúng và điều chỉnh kích thước của điều khiển theo cách thủ công trong câu lệnh switch (cho người mới bắt đầu, có nhiều khả năng hơn những gì bạn hiển thị trong câu lệnh mẫu if).

Thay vào đó, bạn nên đặt AutoScaleMode property biểu mẫu của mình thành AutoScaleMode.Dpi và để khung làm việc chăm sóc điều này cho bạn.

Thêm mã sau đây để xây dựng trên form (hoặc thiết lập thuộc tính này lúc thiết kế):

this.AutoScaleMode = AutoScaleMode.Dpi; 

Mặc dù bạn có thể muốn sử dụng AutoScaleMode.Font. Để biết thêm thông tin về chia tỷ lệ tự động, hãy xem the MSDN documentation.

+1

Tôi đã thử làm điều đó, nhưng vấn đề là ứng dụng của tôi lộn xộn với điều đó –

+1

@user "messes up" nghĩa là gì? Chính xác thì điều gì sai? Bạn đã thử gỡ lỗi nó như thế nào?Bạn có sử dụng vị trí tương đối cho các điều khiển của bạn, như bằng cách đặt chúng trong các thùng chứa và thiết lập thuộc tính 'Anchor' và' Dock'? Định vị tuyệt đối sẽ không bao giờ hoạt động, ngay cả khi người dùng thay đổi khuôn mặt/kích thước phông chữ mặc định của họ, ít hơn nhiều khi DPI tham gia. –

+8

sử dụng AutoScaleMode.none đã khắc phục sự cố của tôi! –

5

Đối với người dùng C++/Win32, đây là một tài liệu tham khảo tốt: Writing High-DPI Win32 Applications.

+0

Dưới đây là một số tham chiếu khác http://technet.microsoft.com/en-us/library/dn528846.aspx –

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