2016-03-23 15 views
7

Cài đặt của tôi Windows được thiết lập để có một DPI của 96. Tuy nhiên khi tôi tạo sau Window nó sẽ nhỏ hơn một chút sau đó màn hình của tôi (được thiết lập để độ phân giải 1920 * 1080):Tại sao 1920 thiết bị độc lập không phải là 1920 pixel với 96 DPI?

<Window x:Class="WPF_Sandbox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WPF_Sandbox" 
     mc:Ignorable="d" 
     Title="MainWindow" 
     Width="1920"> 
</Window> 

Theo tới this msdn bài đăng blog:

1 thiết bị độc lập pixel = 1/96 inch.
1 pixel vật lý = 1/DPI (phụ thuộc vào hệ thống DPI)

Cài đặt hệ thống mặc định thường chọn DPI 96 để hai loại pixel này có cùng kích thước.

Tuy nhiên, điều này có vẻ không phải là trường hợp kể từ khi số Window của tôi rõ ràng ít hơn 1920 pixel rộng.
Nếu tôi tối đa hóa số Window và kiểm tra ActualWidth nó có vẻ như là 1936.

Tại sao lại xảy ra trường hợp này?

Trả lời

3

Câu hỏi đặt ra là hơn dọc theo dòng:

Tại sao Window.ActualWidth báo cáo một chiều rộng mà không xuất hiện là 'thực tế' chiều rộng của cửa sổ?

Câu trả lời là những gì trông giống như toàn bộ chiều rộng của cửa sổ là không chính xác đầy đủ chiều rộng.

Khi bạn đặt Width, truy vấn ActualWidth, hoặc thậm chí sử dụng GetWindowRect để có được "no-nằm những gì hiện cửa sổ nghĩ chiều rộng của tôi là", bạn đang đặt hoặc nhận độ rộng của cửa sổ bao gồm phần vô hình .

Những phần vô hình, đặc biệt là trên Windows 10, bao gồm một chút không gian thêm để làm cho nó dễ dàng cho người dùng để thay đổi kích thước cửa sổ ngay cả khi họ là một chút tắt của biên giới:

resize off of the window

(lưu ý rằng chuột của tôi không nằm trên đường viền mà là một chút ở bên phải)

Điều này có nghĩa là khi bạn phóng to cửa sổ, chiều rộng của bạn vẫn được "đệm" với không gian ẩn và do đó cửa sổ của bạn kích thước sẽ lớn hơn kích thước màn hình của bạn.

Làm cách nào bạn có thể truy xuất chiều rộng của khoảng trống thừa? GetSystemMetrics với SM_CXSIZEFRAMESM_CXPADDEDBORDER là bạn của bạn ở đây (ví dụ bao gồm mã từ pinvoke.net):

int extraBorderStuff = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME) 
         + GetSystemMetrics(SystemMetric.SM_CXPADDEDBORDER); 
double realWidthForSure = ActualWidth - borderSize * 2; 

Nếu bạn sau đó phóng to cửa sổ của bạn, bạn nên chú ý rằng realWidthForSure phải bằng 1920px mà bạn mong muốn của bạn.

+0

Vì vậy, về cơ bản, khi tôi phóng to 'Window', nó sẽ lớn hơn màn hình (do đó' Width' là '1936') vì đường viền vô hình. Gotcha. –

+0

@TimPohlmann có; thêm một chút nữa vào câu trả lời để nói rõ điều đó. – FriendlyGuy

-1

Thông số màn hình của bạn là gì? ví dụ: màn hình của tôi có độ cao = 0,282 mm; bằng 90.0709 ... ppi. Một cửa sổ rộng 1920 pixel sẽ có chiều rộng thực tế 2.046 đơn vị trong WPF.

xác định DPI của màn hình của bạn (25,4/sân nếu bạn có sân trong mm)

96/DPI * 1920 => Thực tế Chiều rộng

+0

WPF biết DPI vật lý của màn hình như thế nào? Theo bài đăng trên blog được liên kết, nó sử dụng hệ thống DPI của Windows, được đặt thành 96. –

3

Cửa sổ thực sự có chiều rộng năm 1936 pixels!

Khi cửa sổ được phóng to, đường viền xung quanh cửa sổ sẽ bị cắt. Mặc dù nó không thể nhìn thấy nữa, nó vẫn được coi là một phần của cửa sổ. Trong chủ đề Aero, biên giới này có chiều rộng của 8px mỗi bên, vì thế mà 16px thêm:

Window chrome in Aero theme

Nếu bạn chuyển sang chủ đề cổ điển, nó chỉ 4px mỗi bên, vì vậy cửa sổ của bạn sẽ được Rộng 1928 pixel.

+0

Nhưng màn hình của tôi chỉ có 1920 pixel. –

+0

Cửa sổ rộng hơn màn hình của bạn. –

+0

Nhưng nó không phải là. Có không gian còn lại trên cả hai mặt. –

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