1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use winapi::shared::windef::HWND;
use winapi::um::winuser::{GetSystemMetrics, MonitorFromWindow, GetMonitorInfoW, MONITORINFO,
SM_CXSCREEN, SM_CYSCREEN, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN, MONITOR_DEFAULTTONEAREST};
use crate::ControlHandle;
use std::mem;
pub struct Monitor;
impl Monitor {
fn monitor_info_from_window(handle: HWND) -> MONITORINFO {
unsafe {
let m = MonitorFromWindow(handle, MONITOR_DEFAULTTONEAREST);
let mut info: MONITORINFO = mem::zeroed();
info.cbSize = mem::size_of::<MONITORINFO>() as _;
GetMonitorInfoW(m, &mut info);
info
}
}
pub fn width_from_window<H: Into<ControlHandle>>(window: H) -> i32 {
let handle = window.into().hwnd().expect("Window to be a window-like control");
let info = Self::monitor_info_from_window(handle);
(info.rcMonitor.right - info.rcMonitor.left) as _
}
pub fn height_from_window<H: Into<ControlHandle>>(window: H) -> i32 {
let handle = window.into().hwnd().expect("Window to be a window-like control");
let info = Self::monitor_info_from_window(handle);
(info.rcMonitor.bottom - info.rcMonitor.top) as _
}
pub fn monitor_rect_from_window<H: Into<ControlHandle>>(window: H) -> [i32; 4] {
let handle = window.into().hwnd().expect("Window to be a window-like control");
let info = Self::monitor_info_from_window(handle);
let m = info.rcMonitor;
[
m.left,
m.top,
m.right,
m.bottom
]
}
pub fn width() -> i32 {
unsafe {
GetSystemMetrics(SM_CXSCREEN) as _
}
}
pub fn height() -> i32 {
unsafe {
GetSystemMetrics(SM_CYSCREEN) as _
}
}
pub fn virtual_width() -> i32 {
unsafe {
GetSystemMetrics(SM_CXVIRTUALSCREEN) as _
}
}
pub fn virtual_height() -> i32 {
unsafe {
GetSystemMetrics(SM_CYVIRTUALSCREEN) as _
}
}
}