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
|
/*
* Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "modules/desktop_capture/win/test_support/test_window.h"
namespace webrtc {
namespace {
const WCHAR kWindowClass[] = L"DesktopCaptureTestWindowClass";
const int kWindowHeight = 200;
const int kWindowWidth = 300;
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM w_param,
LPARAM l_param) {
switch (msg) {
case WM_PAINT:
PAINTSTRUCT paint_struct;
HDC hdc = BeginPaint(hwnd, &paint_struct);
// Paint the window so the color is consistent and we can inspect the
// pixels in tests and know what to expect.
FillRect(hdc, &paint_struct.rcPaint,
CreateSolidBrush(RGB(kTestWindowRValue, kTestWindowGValue,
kTestWindowBValue)));
EndPaint(hwnd, &paint_struct);
}
return DefWindowProc(hwnd, msg, w_param, l_param);
}
} // namespace
WindowInfo CreateTestWindow(const WCHAR* window_title,
const int height,
const int width,
const LONG extended_styles) {
WindowInfo info;
::GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
reinterpret_cast<LPCWSTR>(&WindowProc),
&info.window_instance);
WNDCLASSEXW wcex;
memset(&wcex, 0, sizeof(wcex));
wcex.cbSize = sizeof(wcex);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.hInstance = info.window_instance;
wcex.lpfnWndProc = &WindowProc;
wcex.lpszClassName = kWindowClass;
info.window_class = ::RegisterClassExW(&wcex);
// Use the default height and width if the caller did not supply the optional
// height and width parameters, or if they supplied invalid values.
int window_height = height <= 0 ? kWindowHeight : height;
int window_width = width <= 0 ? kWindowWidth : width;
info.hwnd =
::CreateWindowExW(extended_styles, kWindowClass, window_title,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
window_width, window_height, /*parent_window=*/nullptr,
/*menu_bar=*/nullptr, info.window_instance,
/*additional_params=*/nullptr);
::ShowWindow(info.hwnd, SW_SHOWNORMAL);
::UpdateWindow(info.hwnd);
return info;
}
void ResizeTestWindow(const HWND hwnd, const int width, const int height) {
::SetWindowPos(hwnd, HWND_TOP, /*x-coord=*/0, /*y-coord=*/0, width, height,
SWP_SHOWWINDOW);
::UpdateWindow(hwnd);
}
void MinimizeTestWindow(const HWND hwnd) {
::ShowWindow(hwnd, SW_MINIMIZE);
}
void UnminimizeTestWindow(const HWND hwnd) {
::OpenIcon(hwnd);
}
void DestroyTestWindow(WindowInfo info) {
::DestroyWindow(info.hwnd);
::UnregisterClass(MAKEINTATOM(info.window_class), info.window_instance);
}
} // namespace webrtc
|