1 /* 2 * PROJECT: ReactOS API tests 3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+) 4 * PURPOSE: Test for DM_REPOSITION 5 * COPYRIGHT: Copyright 2019 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 */ 7 8 #include "precomp.h" 9 #include <windowsx.h> 10 11 static BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) 12 { 13 RECT rc, rc2, rcWork; 14 INT cx, cy, nBitsPixel; 15 HMONITOR hMon; 16 MONITORINFO mi = { sizeof(mi) }; 17 HDC hdc; 18 19 /* get monitor info */ 20 hMon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); 21 ok(hMon != NULL, "hMon is NULL\n"); 22 ok_int(GetMonitorInfoW(hMon, &mi), TRUE); 23 rcWork = mi.rcWork; 24 25 /* get size */ 26 GetWindowRect(hwnd, &rc); 27 cx = rc.right - rc.left; 28 cy = rc.bottom - rc.top; 29 30 /* move */ 31 ok_int(SetWindowPos(hwnd, NULL, rcWork.left - 80, rcWork.top - 80, 0, 0, 32 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOOWNERZORDER | 33 SWP_NOZORDER), TRUE); 34 ok_int(GetWindowRect(hwnd, &rc), TRUE); 35 ok_long(rc.left, rcWork.left - 80); 36 ok_long(rc.top, rcWork.top - 80); 37 ok_long(rc.right, rc.left + cx); 38 ok_long(rc.bottom, rc.top + cy); 39 40 /* reposition */ 41 ok_int(SendMessageW(hwnd, DM_REPOSITION, 0, 0), 0); 42 ok_int(GetWindowRect(hwnd, &rc), TRUE); 43 ok_long(rc.left, rcWork.left); 44 ok_long(rc.top, rcWork.top); 45 ok_long(rc.right, rc.left + cx); 46 ok_long(rc.bottom, rc.top + cy); 47 48 /* move */ 49 ok_int(SetWindowPos(hwnd, NULL, 50 rcWork.right - cx + 80, rcWork.bottom - cy + 80, 0, 0, 51 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOOWNERZORDER | 52 SWP_NOZORDER), TRUE); 53 ok_int(GetWindowRect(hwnd, &rc), TRUE); 54 ok_long(rc.left, rcWork.right - cx + 80); 55 ok_long(rc.top, rcWork.bottom - cy + 80); 56 ok_long(rc.right, rc.left + cx); 57 ok_long(rc.bottom, rc.top + cy); 58 59 /* reposition */ 60 ok_int(SendMessageW(hwnd, DM_REPOSITION, 0, 0), 0); 61 ok_int(GetWindowRect(hwnd, &rc), TRUE); 62 ok_long(rc.left, rcWork.right - cx); 63 ok_long(rc.top, rcWork.bottom - cy - 4); 64 ok_long(rc.right, rc.left + cx); 65 ok_long(rc.bottom, rc.top + cy); 66 67 /* minimize */ 68 ShowWindow(hwnd, SW_MINIMIZE); 69 ok_int(GetWindowRect(hwnd, &rc), TRUE); 70 71 /* reposition */ 72 ok_int(SendMessageW(hwnd, DM_REPOSITION, 0, 0), 0); 73 ok_int(GetWindowRect(hwnd, &rc2), TRUE); 74 ok_int(EqualRect(&rc, &rc2), TRUE); 75 76 /* restore */ 77 ShowWindow(hwnd, SW_RESTORE); 78 79 /* move */ 80 ok_int(SetWindowPos(hwnd, NULL, 81 rcWork.right - cx + 80, rcWork.bottom - cy + 80, 0, 0, 82 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOOWNERZORDER | 83 SWP_NOZORDER), TRUE); 84 ok_int(GetWindowRect(hwnd, &rc), TRUE); 85 ok_long(rc.left, rcWork.right - cx + 80); 86 ok_long(rc.top, rcWork.bottom - cy + 80); 87 ok_long(rc.right, rc.left + cx); 88 ok_long(rc.bottom, rc.top + cy); 89 90 /* WM_DISPLAYCHANGE */ 91 hdc = GetWindowDC(hwnd); 92 nBitsPixel = GetDeviceCaps(hdc, BITSPIXEL); 93 ReleaseDC(hwnd, hdc); 94 SendMessageW(hwnd, WM_DISPLAYCHANGE, nBitsPixel, 95 MAKELONG(GetSystemMetrics(SM_CXSCREEN), 96 GetSystemMetrics(SM_CYSCREEN))); 97 ok_int(GetWindowRect(hwnd, &rc), TRUE); 98 ok_long(rc.left, rcWork.right - cx + 80); 99 ok_long(rc.top, rcWork.bottom - cy + 80); 100 ok_long(rc.right, rc.left + cx); 101 ok_long(rc.bottom, rc.top + cy); 102 103 /* quit */ 104 PostMessage(hwnd, WM_COMMAND, IDOK, 0); 105 return TRUE; 106 } 107 108 static void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 109 { 110 switch (id) 111 { 112 case IDOK: 113 case IDCANCEL: 114 EndDialog(hwnd, id); 115 break; 116 } 117 } 118 119 static INT_PTR CALLBACK 120 DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 121 { 122 switch (uMsg) 123 { 124 HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog); 125 HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); 126 } 127 return 0; 128 } 129 130 START_TEST(DM_REPOSITION) 131 { 132 HMODULE hMod = GetModuleHandle(NULL); 133 ok(hMod != NULL, "\n"); 134 DialogBox(hMod, TEXT("REPOSITION"), NULL, DialogProc); 135 } 136