ReactOS 0.4.16-dev-1489-g8fbbb41
SHAppBarMessage.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Test for SHAppBarMessage
5 * COPYRIGHT: Copyright 2020-2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8#include "shelltest.h"
9#include <windowsx.h>
10#include <shlwapi.h>
11#include <stdio.h>
12
13/* Based on https://github.com/katahiromz/AppBarSample */
14
15//#define VERBOSE
16
17#define IDT_AUTOHIDE 1
18#define IDT_AUTOUNHIDE 2
19
20#define ID_ACTION 100
21#define ID_QUIT 999
22
23#define APPBAR_CALLBACK (WM_USER + 100)
24
25#define LEFT_DOWN() mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
26#define LEFT_UP() mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
27#define MOVE(x, y) SetCursorPos((x), (y))
28
29#define INTERVAL 250
30#define LONG_INTERVAL 2500
31
32static const TCHAR s_szName[] = TEXT("AppBarSample");
36static HWND s_hwnd1 = NULL;
37static HWND s_hwnd2 = NULL;
38
39#ifdef VERBOSE
40static LPCSTR MessageOfAppBar(DWORD dwMessage)
41{
42 static char s_buf[32];
43 switch (dwMessage)
44 {
45 case ABM_NEW: return "ABM_NEW";
46 case ABM_REMOVE: return "ABM_REMOVE";
47 case ABM_QUERYPOS: return "ABM_QUERYPOS";
48 case ABM_SETPOS: return "ABM_SETPOS";
49 case ABM_GETSTATE: return "ABM_GETSTATE";
50 case ABM_GETTASKBARPOS: return "ABM_GETTASKBARPOS";
51 case ABM_ACTIVATE: return "ABM_ACTIVATE";
52 case ABM_GETAUTOHIDEBAR: return "ABM_GETAUTOHIDEBAR";
53 case ABM_SETAUTOHIDEBAR: return "ABM_SETAUTOHIDEBAR";
54 case ABM_WINDOWPOSCHANGED: return "ABM_WINDOWPOSCHANGED";
55 }
56 wsprintfA(s_buf, "%lu", dwMessage);
57 return s_buf;
58}
59
60static UINT WINAPI
61SHAppBarMessageWrap(DWORD dwMessage, PAPPBARDATA pData)
62{
63 trace("SHAppBarMessage entered (dwMessage=%s, rc=(%ld, %ld, %ld, %ld))\n",
64 MessageOfAppBar(dwMessage),
65 pData->rc.left, pData->rc.top, pData->rc.right, pData->rc.bottom);
66 UINT ret = SHAppBarMessage(dwMessage, pData);
67 trace("SHAppBarMessage leaved (dwMessage=%s, rc=(%ld, %ld, %ld, %ld))\n",
68 MessageOfAppBar(dwMessage),
69 pData->rc.left, pData->rc.top, pData->rc.right, pData->rc.bottom);
70 return ret;
71}
72#define SHAppBarMessage SHAppBarMessageWrap
73
74#undef ARRAYSIZE
75#define ARRAYSIZE _countof
76
77void appbar_tprintf(const TCHAR *fmt, ...)
78{
79 TCHAR szText[512];
80 va_list va;
81 va_start(va, fmt);
82 wvsprintf(szText, fmt, va);
83#ifdef UNICODE
84 printf("%ls", szText);
85#else
86 printf("%s", szText);
87#endif
88 va_end(va);
89}
90
91#define MSGDUMP_TPRINTF appbar_tprintf
92#include "msgdump.h"
93
94#endif // def VERBOSE
95
97{
98#define SLIDE_HIDE 400
99#define SLIDE_SHOW 150
100 RECT rcOld, rcNew = *prc;
101 GetWindowRect(hwnd, &rcOld);
102
103 BOOL fShow = (rcNew.bottom - rcNew.top > rcOld.bottom - rcOld.top) ||
104 (rcNew.right - rcNew.left > rcOld.right - rcOld.left);
105
106 INT dx = (rcNew.right - rcOld.right) + (rcNew.left - rcOld.left);
107 INT dy = (rcNew.bottom - rcOld.bottom) + (rcNew.top - rcOld.top);
108
109 LONG dt = SLIDE_HIDE;
110 if (fShow)
111 {
112 dt = SLIDE_SHOW;
113 rcOld = rcNew;
114 OffsetRect(&rcOld, -dx, -dy);
115 SetWindowPos(hwnd, NULL, rcOld.left, rcOld.top,
116 rcOld.right - rcOld.left, rcOld.bottom - rcOld.top,
118 }
119
123
124 LONG t, t0 = GetTickCount();
125 while ((t = GetTickCount()) < t0 + dt)
126 {
127 INT x = rcOld.left + dx * (t - t0) / dt;
128 INT y = rcOld.top + dy * (t - t0) / dt;
130
133 }
134
136 SetWindowPos(hwnd, NULL, rcNew.left, rcNew.top,
137 rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
139#undef SLIDE_HIDE
140#undef SLIDE_SHOW
141}
142
143class Window
144{
145public:
146 Window(INT cx, INT cy, BOOL fAutoHide = FALSE)
147 : m_hwnd(NULL)
148 , m_fAutoHide(fAutoHide)
149 , m_cxWidth(cx)
150 , m_cyHeight(cy)
151 {
152 }
153
154 virtual ~Window() { }
155
157 {
158 WNDCLASS wc;
159 ZeroMemory(&wc, sizeof(wc));
161 wc.hInstance = hInstance;
164 wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
166 return !!RegisterClass(&wc);
167 }
168
172 BOOL fAutoHide = FALSE)
173 {
174 Window *this_ = new Window(cx, cy, fAutoHide);
175 HWND hwnd = CreateWindowEx(exstyle, s_szName, pszText, style,
177 NULL, NULL, hInstance, this_);
180 return hwnd;
181 }
182
184 {
186 }
187
188 virtual LRESULT CALLBACK
190 {
191#ifdef VERBOSE
192 MD_msgdump(hwnd, uMsg, wParam, lParam);
193#endif
194 switch (uMsg)
195 {
211
212 case APPBAR_CALLBACK:
214 break;
215
216 default:
217 return DefWindowProc(hwnd, uMsg, wParam, lParam);
218 }
219 return 0;
220 }
221
222 static LRESULT CALLBACK
224 {
225 Window *this_ = GetAppbarData(hwnd);
226 if (uMsg == WM_CREATE)
227 {
229 this_ = (Window *)pCS->lpCreateParams;
231 }
232 if (this_)
233 return this_->WindowProcDx(hwnd, uMsg, wParam, lParam);
234 return DefWindowProc(hwnd, uMsg, wParam, lParam);
235 }
236
237protected:
254
255 void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
256 {
258 switch (id)
259 {
260 case ID_ACTION:
262 break;
263 case ID_ACTION + 1:
265 if (!hThread)
266 {
267 skip("failed to create thread\n");
270 return;
271 }
273 break;
274 case ID_QUIT:
278 break;
279 }
280 }
281
283 {
284 PAINTSTRUCT ps;
285
286 TCHAR szText[64];
287 GetWindowText(hwnd, szText, 64);
288
289 RECT rc;
290 GetClientRect(hwnd, &rc);
291
292 if (HDC hdc = BeginPaint(hwnd, &ps))
293 {
294 DrawText(hdc, szText, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
295 EndPaint(hwnd, &ps);
296 }
297 }
298
299 void OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
300 {
303 }
304
305 void OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
306 {
307 if (vk == VK_ESCAPE)
309 }
310
312 {
313 static HWND s_hwndZOrder = NULL;
314
315 switch (wParam)
316 {
317 case ABN_STATECHANGE:
318 break;
319
322 if (lParam)
323 {
324 s_hwndZOrder = GetWindow(hwnd, GW_HWNDPREV);
325 SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0,
327 }
328 else
329 {
330 SetWindowPos(hwnd, m_fOnTop ? HWND_TOPMOST : s_hwndZOrder,
331 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
332 s_hwndZOrder = NULL;
333 }
334 break;
335
336 case ABN_POSCHANGED:
337 {
338 APPBARDATA abd = { sizeof(abd), hwnd };
339 AppBar_PosChanged(&abd);
340 }
341 break;
342 }
343 }
344
346 {
347 APPBARDATA abd = { sizeof(abd), hwnd, APPBAR_CALLBACK };
349 return m_fAppBarRegd;
350 }
351
353 {
354 APPBARDATA abd = { sizeof(abd), hwnd };
356 return !m_fAppBarRegd;
357 }
358
360 {
361 APPBARDATA abd = { sizeof(abd), hwnd };
362
364 return FALSE;
365 *prc = abd.rc;
366 return TRUE;
367 }
368
370 {
371 APPBARDATA abd = { sizeof(abd), hwnd };
372 abd.uEdge = uSide;
373
375 }
376
378 {
379 if (fHide)
380 return AppBar_AutoHide(hwnd);
381 else
382 return AppBar_NoAutoHide(hwnd);
383 }
384
386 {
387 APPBARDATA abd = { sizeof(abd), hwnd };
388 abd.uEdge = m_uSide;
389
390 HWND hwndAutoHide = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
391 if (hwndAutoHide)
392 return FALSE;
393
394 abd.lParam = TRUE;
396 return FALSE;
397
401
402 RECT rc = m_rcAppBar;
403 switch (m_uSide)
404 {
405 case ABE_TOP:
406 rc.bottom = rc.top + 2;
407 break;
408 case ABE_BOTTOM:
409 rc.top = rc.bottom - 2;
410 break;
411 case ABE_LEFT:
412 rc.right = rc.left + 2;
413 break;
414 case ABE_RIGHT:
415 rc.left = rc.right - 2;
416 break;
417 }
418
419 AppBar_QueryPos(hwnd, &rc);
420 abd.rc = rc;
422 rc = abd.rc;
423
424 m_fHiding = TRUE;
425 SlideWindow(hwnd, &rc);
426
428 return TRUE;
429 }
430
432 {
433 APPBARDATA abd = { sizeof(abd), hwnd };
434 abd.uEdge = m_uSide;
435 HWND hwndAutoHide = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd);
436 if (hwndAutoHide != hwnd)
437 return FALSE;
438
439 abd.lParam = FALSE;
441 return FALSE;
442
447 return TRUE;
448 }
449
451 {
452 HMONITOR hMon = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY);
453 MONITORINFO mi = { sizeof(mi) };
454 ::GetMonitorInfo(hMon, &mi);
455 RECT rc = mi.rcWork;
456
457 BOOL fAutoHide = FALSE;
458 if (m_fAutoHide)
459 {
460 fAutoHide = m_fAutoHide;
464 }
465
466 switch (uSide)
467 {
468 case ABE_TOP:
469 rc.bottom = rc.top + m_cyHeight;
470 break;
471 case ABE_BOTTOM:
472 rc.top = rc.bottom - m_cyHeight;
473 break;
474 case ABE_LEFT:
475 rc.right = rc.left + m_cxWidth;
476 break;
477 case ABE_RIGHT:
478 rc.left = rc.right - m_cxWidth;
479 break;
480 }
481
482 APPBARDATA abd = { sizeof(abd), hwnd };
483 AppBar_QuerySetPos(uSide, &rc, &abd, TRUE);
484
485 if (fAutoHide)
486 {
488 m_fHiding = TRUE;
489
493 }
494
495 return TRUE;
496 }
497
499 {
501 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
502 m_fOnTop = fOnTop;
503 }
504
506 {
507 if (!m_fAutoHide)
508 return;
509
510 RECT rc = m_rcAppBar;
511 switch (m_uSide)
512 {
513 case ABE_TOP:
514 rc.bottom = rc.top + 2;
515 break;
516 case ABE_BOTTOM:
517 rc.top = rc.bottom - 2;
518 break;
519 case ABE_LEFT:
520 rc.right = rc.left + 2;
521 break;
522 case ABE_RIGHT:
523 rc.left = rc.right - 2;
524 break;
525 }
526
527 m_fHiding = TRUE;
528 SlideWindow(hwnd, &rc);
529 }
530
532 {
535
537 }
538
540 {
541 if (m_fAutoHide)
542 {
544 }
545 }
546
548 {
549 if (m_fAutoHide && m_fHiding)
550 {
552 }
553 }
554
556 {
557 if (m_fAppBarRegd)
558 {
559 APPBARDATA abd = { sizeof(abd), hwnd };
560
561 RECT rc;
562 GetWindowRect(hwnd, &rc);
563 AppBar_QuerySetPos(m_uSide, &rc, &abd, TRUE);
564 }
565 }
566
568 {
569 APPBARDATA abd = { sizeof(abd), hwnd };
570 abd.rc = *lprc;
571 abd.uEdge = m_uSide;
572
573 INT cx = 0, cy = 0;
574 if (ABE_LEFT == abd.uEdge || ABE_RIGHT == abd.uEdge)
575 {
576 cx = abd.rc.right - abd.rc.left;
577 abd.rc.top = 0;
579 }
580 else
581 {
582 cy = abd.rc.bottom - abd.rc.top;
583 abd.rc.left = 0;
585 }
586
588
589 switch (abd.uEdge)
590 {
591 case ABE_LEFT:
592 abd.rc.right = abd.rc.left + cx;
593 break;
594 case ABE_RIGHT:
595 abd.rc.left = abd.rc.right - cx;
596 break;
597 case ABE_TOP:
598 abd.rc.bottom = abd.rc.top + cy;
599 break;
600 case ABE_BOTTOM:
601 abd.rc.top = abd.rc.bottom - cy;
602 break;
603 }
604
605 *lprc = abd.rc;
606 }
607
609 {
610 pabd->rc = *lprc;
611 pabd->uEdge = uEdge;
612 m_uSide = uEdge;
613
614 AppBar_QueryPos(pabd->hWnd, &pabd->rc);
615
617
618 if (fMove)
619 {
620 RECT rc = pabd->rc;
621 MoveWindow(pabd->hWnd, rc.left, rc.top,
622 rc.right - rc.left, rc.bottom - rc.top, TRUE);
623 }
624
625 if (!m_fAutoHide)
626 {
627 m_rcAppBar = pabd->rc;
628 }
629 }
630
632 {
633 RECT rc;
635
636 if (m_fAutoHide)
637 {
638 m_rcAppBar = rc;
639 switch (m_uSide)
640 {
641 case ABE_TOP:
643 break;
644 case ABE_BOTTOM:
646 break;
647 case ABE_LEFT:
649 break;
650 case ABE_RIGHT:
652 break;
653 }
654 }
655
656 RECT rcWindow;
657 GetWindowRect(pabd->hWnd, &rcWindow);
658 INT cx = rcWindow.right - rcWindow.left;
659 INT cy = rcWindow.bottom - rcWindow.top;
660 switch (m_uSide)
661 {
662 case ABE_TOP:
663 rc.bottom = rc.top + cy;
664 break;
665 case ABE_BOTTOM:
666 rc.top = rc.bottom - cy;
667 break;
668 case ABE_LEFT:
669 rc.right = rc.left + cx;
670 break;
671 case ABE_RIGHT:
672 rc.left = rc.right - cx;
673 break;
674 }
675 AppBar_QuerySetPos(m_uSide, &rc, pabd, TRUE);
676 }
677
679 {
680 m_hwnd = hwnd;
681 m_fOnTop = TRUE;
683
689
692
693 trace("OnCreate(%p) done\n", hwnd);
694 return TRUE;
695 }
696
697 void OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized)
698 {
699 APPBARDATA abd = { sizeof(abd), hwnd };
701
702 switch (state)
703 {
704 case WA_ACTIVE:
705 case WA_CLICKACTIVE:
708 break;
709
710 case WA_INACTIVE:
712 break;
713 }
714 }
715
717 {
718 APPBARDATA abd = { sizeof(abd), hwnd };
720
722 }
723
724 void OnSize(HWND hwnd, UINT state, int cx, int cy)
725 {
726 RECT rcWindow;
727
728 if (m_fMoving || (m_fAutoHide && m_fHiding))
729 return;
730
731 if (!m_fHiding)
732 {
733 if (!m_fAutoHide)
735
736 GetWindowRect(hwnd, &rcWindow);
737 m_rcAppBar = rcWindow;
738
739 if (m_uSide == ABE_TOP || m_uSide == ABE_BOTTOM)
740 m_cyHeight = m_cySave = rcWindow.bottom - rcWindow.top;
741 else
742 m_cxWidth = m_cxSave = rcWindow.right - rcWindow.left;
743 }
744
746 }
747
748 void OnMove(HWND hwnd, int x, int y)
749 {
750 if (m_fMoving || m_fAutoHide)
751 return;
752
753 if (!m_fHiding)
755 }
756
758 {
760
761 m_hwnd = NULL;
763 delete this;
764 }
765
767 {
768 POINT pt;
769 RECT rc;
770 HWND hwndActive;
771
772 switch (id)
773 {
774 case IDT_AUTOHIDE:
775 if (m_fAutoHide && !m_fHiding && !m_fMoving)
776 {
778 GetWindowRect(hwnd, &rc);
779 hwndActive = GetForegroundWindow();
780
781 if (!PtInRect(&rc, pt) &&
782 hwndActive != hwnd &&
783 hwndActive != NULL &&
784 GetWindowOwner(hwndActive) != hwnd)
785 {
786 KillTimer(hwnd, id);
788 }
789 }
790 break;
791
792 case IDT_AUTOUNHIDE:
793 KillTimer(hwnd, id);
794
795 if (m_fAutoHide && m_fHiding)
796 {
798 GetWindowRect(hwnd, &rc);
799 if (PtInRect(&rc, pt))
800 {
802 }
803 }
804 break;
805 }
806 }
807
809 {
811
813
814 if (m_uSide == ABE_TOP && uHitTest == HTBOTTOM)
815 return HTBOTTOM;
816
817 if (m_uSide == ABE_BOTTOM && uHitTest == HTTOP)
818 return HTTOP;
819
820 if (m_uSide == ABE_LEFT && uHitTest == HTRIGHT)
821 return HTRIGHT;
822
823 if (m_uSide == ABE_RIGHT && uHitTest == HTLEFT)
824 return HTLEFT;
825
826 return HTCLIENT;
827 }
828
829 void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
830 {
831 m_fMoving = TRUE;
835 }
836
837 void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
838 {
839 if (!m_fMoving)
840 return;
841
842 POINT pt;
846 {
848 }
849
850 INT cxScreen = GetSystemMetrics(SM_CXSCREEN);
851 INT cyScreen = GetSystemMetrics(SM_CYSCREEN);
852
853 DWORD dx, dy;
854 UINT ix, iy;
855 if (pt.x < cxScreen / 2)
856 {
857 dx = pt.x;
858 ix = ABE_LEFT;
859 }
860 else
861 {
862 dx = cxScreen - pt.x;
863 ix = ABE_RIGHT;
864 }
865
866 if (pt.y < cyScreen / 2)
867 {
868 dy = pt.y;
869 iy = ABE_TOP;
870 }
871 else
872 {
873 dy = cyScreen - pt.y;
874 iy = ABE_BOTTOM;
875 }
876
877 if (cxScreen * dy > cyScreen * dx)
878 {
879 m_rcDrag.top = 0;
880 m_rcDrag.bottom = cyScreen;
881 if (ix == ABE_LEFT)
882 {
884 m_rcDrag.left = 0;
886 }
887 else
888 {
890 m_rcDrag.right = cxScreen;
892 }
893 }
894 else
895 {
896 m_rcDrag.left = 0;
897 m_rcDrag.right = cxScreen;
898 if (iy == ABE_TOP)
899 {
901 m_rcDrag.top = 0;
903 }
904 else
905 {
907 m_rcDrag.bottom = cyScreen;
909 }
910 }
911
913
914 if (m_bDragged)
915 {
919 TRUE);
920 }
921 }
922
923 void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
924 {
925 if (!m_fMoving)
926 return;
927
928 OnMouseMove(hwnd, x, y, keyFlags);
929
931
933
934 if (m_fAutoHide)
935 {
936 switch (m_uSide)
937 {
938 case ABE_TOP:
940 break;
941 case ABE_BOTTOM:
943 break;
944 case ABE_LEFT:
946 break;
947 case ABE_RIGHT:
949 break;
950 }
951 }
952
953 if (m_bDragged)
954 {
955 if (m_fAutoHide)
956 {
958 }
959 else
960 {
961 APPBARDATA abd = { sizeof(abd), hwnd };
963 }
964 }
965
967 }
968
970 {
971 SystemParametersInfoW(SPI_GETWORKAREA, 0, prc, 0);
972 }
973
974 void Quit()
975 {
978 }
979
980public:
981 void DoAction()
982 {
983 trace("DoAction\n");
984
985 TEST_Main();
989
990 Quit();
991 }
992
994 {
995 trace("TEST_Main\n");
997
998 POINT pt;
999 RECT rc1, rc2, rcWork;
1000
1002 ok_int(ret, TRUE);
1003 ok_int(EqualRect(&rc1, &s_rcTaskBar), TRUE);
1004
1005 GetWindowRect(s_hwnd1, &rc1);
1007 GetWorkArea(&rcWork);
1011 ok_long(rc1.bottom, s_rcWorkArea.top + 80);
1013 ok_long(rc2.top, s_rcWorkArea.top + 80);
1014 ok_long(rc2.right, s_rcWorkArea.right);
1015 ok_long(rc2.bottom, s_rcWorkArea.top + 110);
1016 ok_long(rcWork.left, s_rcWorkArea.left);
1017 ok_long(rcWork.top, s_rcWorkArea.top + 110);
1022
1024 GetWorkArea(&rcWork);
1027 ok_long(rc2.right, s_rcWorkArea.right);
1028 ok_long(rc2.bottom, s_rcWorkArea.top + 30);
1029 ok_long(rcWork.left, s_rcWorkArea.left);
1030 ok_long(rcWork.top, s_rcWorkArea.top + 30);
1034 Sleep(INTERVAL);
1035
1037 GetWorkArea(&rcWork);
1040 ok_long(rc2.right, s_rcWorkArea.left + 30);
1041 ok_long(rcWork.left, s_rcWorkArea.left + 30);
1042 ok_long(rcWork.top, s_rcWorkArea.top);
1046 Sleep(INTERVAL);
1047
1049 GetWorkArea(&rcWork);
1052 ok_long(rc2.right, s_rcWorkArea.right);
1053 ok_long(rc2.bottom, s_rcWorkArea.top + 30);
1054 ok_long(rcWork.left, s_rcWorkArea.left);
1055 ok_long(rcWork.top, s_rcWorkArea.top + 30);
1059 Sleep(INTERVAL);
1060
1062 GetWorkArea(&rcWork);
1063 ok_long(rc2.left, s_rcWorkArea.right - 30);
1065 ok_long(rc2.right, s_rcWorkArea.right);
1066 ok_long(rcWork.left, s_rcWorkArea.left);
1067 ok_long(rcWork.top, s_rcWorkArea.top);
1068 ok_long(rcWork.right, s_rcWorkArea.right - 30);
1070 Sleep(INTERVAL);
1071
1073 pt.x = (rc2.left + rc2.right) / 2;
1074 pt.y = (rc2.top + rc2.bottom) / 2;
1075 MOVE(pt.x, pt.y);
1076 LEFT_DOWN();
1077 MOVE(pt.x + 64, pt.y + 64);
1078 Sleep(INTERVAL);
1079
1080 pt.x = s_rcWorkArea.left + 80;
1082 MOVE(pt.x, pt.y);
1083 LEFT_UP();
1084 Sleep(INTERVAL);
1085
1087 GetWorkArea(&rcWork);
1090 ok_long(rc2.right, s_rcWorkArea.left + 30);
1091 ok_long(rcWork.left, s_rcWorkArea.left + 30);
1092 ok_long(rcWork.top, s_rcWorkArea.top);
1095 Sleep(INTERVAL);
1096 }
1097
1099 {
1100 trace("TEST_Dragging\n");
1101
1102 RECT rc, rcWork;
1103 POINT pt;
1104
1105 GetWindowRect(s_hwnd2, &rc);
1106 pt.x = (rc.left + rc.right) / 2;
1107 pt.y = (rc.top + rc.bottom) / 2;
1108 MOVE(pt.x, pt.y);
1109 LEFT_DOWN();
1110 Sleep(INTERVAL);
1111
1113 pt.y = s_rcWorkArea.top;
1114 MOVE(pt.x, pt.y);
1115 Sleep(INTERVAL);
1116
1117 pt.x = s_rcWorkArea.right - 1;
1119 MOVE(pt.x, pt.y);
1120 LEFT_UP();
1122
1123 GetWindowRect(s_hwnd2, &rc);
1124 GetWorkArea(&rcWork);
1125 ok_long(rc.left, s_rcWorkArea.right - 30);
1128 ok_long(rcWork.left, s_rcWorkArea.left);
1129 ok_long(rcWork.top, s_rcWorkArea.top);
1130 ok_long(rcWork.right, s_rcWorkArea.right - 30);
1132 }
1133
1135 {
1136 trace("TEST_AutoHide\n");
1137
1138 RECT rc;
1139
1140 m_cxWidth = 80;
1141 m_cyHeight = 40;
1145 ok_ptr(hwndRet, s_hwnd2);
1147
1148 GetWindowRect(s_hwnd2, &rc);
1152 ok_long(rc.bottom, s_rcWorkArea.top + 2);
1153
1155 LEFT_DOWN();
1156 LEFT_UP();
1158
1159 GetWindowRect(s_hwnd2, &rc);
1163 ok_long(rc.bottom, s_rcWorkArea.top + 40);
1164
1166 LEFT_DOWN();
1167 LEFT_UP();
1169
1170 GetWindowRect(s_hwnd2, &rc);
1174 ok_long(rc.bottom, s_rcWorkArea.top + 2);
1175
1178
1179 GetWindowRect(s_hwnd2, &rc);
1183 ok_long(rc.bottom, s_rcWorkArea.top + 40);
1184
1189 ok_ptr(hwndRet, s_hwnd2);
1190
1191 GetWindowRect(s_hwnd2, &rc);
1192 ok_long(rc.left, s_rcWorkArea.right - 2);
1196
1199
1200 GetWindowRect(s_hwnd2, &rc);
1201 ok_long(rc.left, s_rcWorkArea.right - 2);
1205 }
1206
1208 {
1209 trace("TEST_FullScreen\n");
1212 MoveWindow(s_hwnd2, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
1215 MoveWindow(s_hwnd2, rc.left, rc.top, 100, 100, TRUE);
1216 }
1217
1219 {
1220 Window *this_ = (Window *)args;
1221 this_->DoAction();
1222 return 0;
1223 }
1224};
1225
1227{
1229
1230 // Check Taskbar
1231 HWND hTrayWnd = FindWindowW(L"Shell_TrayWnd", NULL);
1232 if (!IsWindowVisible(hTrayWnd))
1233 {
1234 skip("Taskbar not found\n");
1235 return;
1236 }
1237
1238 // Taskbar
1239 RECT rc;
1240 GetWindowRect(hTrayWnd, &rc);
1241 s_rcTaskBar = rc;
1242 trace("s_rcTaskBar: %ld, %ld, %ld, %ld\n", rc.left, rc.top, rc.right, rc.bottom);
1243
1244 // Work area
1245 SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, FALSE);
1246 s_rcWorkArea = rc;
1247 trace("s_rcWorkArea: %ld, %ld, %ld, %ld\n", rc.left, rc.top, rc.right, rc.bottom);
1248
1249 // Primary monitor
1251 s_rcPrimaryMonitor = rc;
1252 trace("s_rcPrimaryMonitor: %ld, %ld, %ld, %ld\n", rc.left, rc.top, rc.right, rc.bottom);
1253
1257 {
1258 // Taskbar must be bottom in this testcase
1259 skip("Taskbar was not bottom\n");
1260 return;
1261 }
1262
1263 if (!Window::DoRegisterClass(hInstance))
1264 {
1265 skip("Window::DoRegisterClass failed\n");
1266 return;
1267 }
1268
1269 trace("SM_CMONITORS: %d\n", GetSystemMetrics(SM_CMONITORS));
1271 {
1272 skip("Multi-monitor not supported yet\n");
1273 return;
1274 }
1275
1276 HWND hwnd1 = Window::DoCreateMainWnd(hInstance, TEXT("Test1"), 80, 80,
1278 if (!hwnd1)
1279 {
1280 skip("CreateWindowExW failed\n");
1281 return;
1282 }
1283
1284 HWND hwnd2 = Window::DoCreateMainWnd(hInstance, TEXT("Test2"), 30, 30,
1286 if (!hwnd2)
1287 {
1288 skip("CreateWindowExW failed\n");
1289 return;
1290 }
1291
1292 s_hwnd1 = hwnd1;
1293 s_hwnd2 = hwnd2;
1294
1295 PostMessageW(hwnd1, WM_COMMAND, ID_ACTION, 0);
1296
1297 // message loop
1298 MSG msg;
1299 while (GetMessage(&msg, NULL, 0, 0))
1300 {
1303 }
1304}
#define MOVE(x, y)
#define SLIDE_HIDE
#define LEFT_UP()
static const TCHAR s_szName[]
#define SLIDE_SHOW
#define LEFT_DOWN()
static RECT s_rcWorkArea
void SlideWindow(HWND hwnd, LPRECT prc)
#define IDT_AUTOUNHIDE
#define ID_ACTION
static RECT s_rcPrimaryMonitor
static RECT s_rcTaskBar
#define INTERVAL
#define ID_QUIT
static HWND s_hwnd2
#define LONG_INTERVAL
static HWND s_hwnd1
#define IDT_AUTOHIDE
#define APPBAR_CALLBACK
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
Arabic default style
Definition: afstyles.h:94
static int state
Definition: maze.c:121
#define ok_long(expression, result)
Definition: atltest.h:133
#define trace
Definition: atltest.h:70
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_int(expression, result)
Definition: atltest.h:134
#define ok_ptr(expression, result)
Definition: atltest.h:108
#define msg(x)
Definition: auth_time.c:54
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const WCHAR rc2[]
Definition: oid.c:1216
#define CloseHandle
Definition: compat.h:739
HANDLE HWND
Definition: compat.h:19
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:700
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
int WINAPI GetThreadPriority(IN HANDLE hThread)
Definition: thread.c:739
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
Definition: sync.c:182
UINT_PTR WINAPI SHAppBarMessage(_In_ DWORD dwMessage, _Inout_ PAPPBARDATA pData)
Definition: appbar.c:67
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define printf
Definition: freeldr.h:97
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLdouble GLdouble t
Definition: gl.h:2047
GLbitfield flags
Definition: glext.h:7161
_Check_return_ long __cdecl labs(_In_ long x)
#define TEXT(s)
Definition: k32.h:28
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
WORD vk
Definition: input.c:77
static MONITORINFO mi
Definition: win.c:7338
static int priority
Definition: timer.c:163
static __inline LRESULT MSGDUMP_API MD_msgdump(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: msgdump.h:4655
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
unsigned int UINT
Definition: ndis.h:50
HANDLE hThread
Definition: wizard.c:28
#define BOOL
Definition: nt_native.h:43
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WS_EX_TOPMOST
Definition: pedump.c:647
long LONG
Definition: pedump.c:60
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define WS_THICKFRAME
Definition: pedump.c:630
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define DefWindowProc
Definition: ros2win.h:31
#define ABM_WINDOWPOSCHANGED
Definition: shellapi.h:70
#define ABE_BOTTOM
Definition: shellapi.h:20
#define ABM_GETTASKBARPOS
Definition: shellapi.h:66
#define ABM_GETSTATE
Definition: shellapi.h:65
#define ABM_SETAUTOHIDEBAR
Definition: shellapi.h:69
#define ABE_RIGHT
Definition: shellapi.h:19
#define ABE_TOP
Definition: shellapi.h:18
#define ABN_FULLSCREENAPP
Definition: shellapi.h:74
#define ABM_SETPOS
Definition: shellapi.h:64
#define ABM_ACTIVATE
Definition: shellapi.h:67
#define ABE_LEFT
Definition: shellapi.h:17
#define ABM_REMOVE
Definition: shellapi.h:62
#define ABN_STATECHANGE
Definition: shellapi.h:72
#define ABM_NEW
Definition: shellapi.h:61
#define ABM_GETAUTOHIDEBAR
Definition: shellapi.h:68
#define ABN_POSCHANGED
Definition: shellapi.h:73
#define ABM_QUERYPOS
Definition: shellapi.h:63
Definition: window.c:28
void OnSize(HWND hwnd, UINT state, int cx, int cy)
BOOL m_fAppBarRegd
BOOL AppBar_GetTaskBarPos(HWND hwnd, PRECT prc)
void AppBar_Size(HWND hwnd)
BOOL AppBar_Register(HWND hwnd)
void AppBar_UnHide(HWND hwnd)
void AppBar_SetAlwaysOnTop(HWND hwnd, BOOL fOnTop)
POINT m_ptDragOn
BOOL AppBar_UnRegister(HWND hwnd)
void AppBar_SetAutoHideTimer(HWND hwnd)
void DoAction()
void OnTimer(HWND hwnd, UINT id)
static DWORD WINAPI ActionThreadFunc(LPVOID args)
void AppBar_QuerySetPos(UINT uEdge, LPRECT lprc, PAPPBARDATA pabd, BOOL fMove)
BOOL AppBar_SetAutoHide(HWND hwnd, BOOL fHide)
virtual ~Window()
UINT OnNCHitTest(HWND hwnd, int x, int y)
void OnMove(HWND hwnd, int x, int y)
void AppBar_PosChanged(PAPPBARDATA pabd)
void TEST_Main()
static Window * GetAppbarData(HWND hwnd)
BOOL m_fAutoHide
void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
BOOL m_bGotFullScreen
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
void OnAppBarCallback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
void TEST_AutoHide()
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
void OnNCDestroy(HWND hwnd)
void AppBar_Hide(HWND hwnd)
void GetWorkArea(LPRECT prc) const
BOOL AppBar_SetSide(HWND hwnd, UINT uSide)
BOOL AppBar_NoAutoHide(HWND hwnd)
void TEST_FullScreen()
virtual LRESULT CALLBACK WindowProcDx(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
HWND AppBar_GetAutoHideBar(HWND hwnd, UINT uSide)
void TEST_Dragging()
void OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
Window(INT cx, INT cy, BOOL fAutoHide=FALSE)
void OnWindowPosChanged(HWND hwnd, const LPWINDOWPOS lpwpos)
void OnPaint(HWND hwnd)
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
void OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized)
static BOOL DoRegisterClass(HINSTANCE hInstance)
void AppBar_QueryPos(HWND hwnd, LPRECT lprc)
static HWND DoCreateMainWnd(HINSTANCE hInstance, LPCTSTR pszText, INT cx, INT cy, DWORD style=WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN, DWORD exstyle=WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW|WS_EX_TOPMOST, BOOL fAutoHide=FALSE)
void OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
BOOL AppBar_AutoHide(HWND hwnd)
void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
void AppBar_SetAutoUnhideTimer(HWND hwnd)
LPARAM lParam
Definition: shellapi.h:222
HWND hWnd
Definition: shellapi.h:218
UINT uEdge
Definition: shellapi.h:220
HBRUSH hbrBackground
Definition: winuser.h:3272
HICON hIcon
Definition: winuser.h:3270
HINSTANCE hInstance
Definition: winuser.h:3269
HCURSOR hCursor
Definition: winuser.h:3271
LPCSTR lpszClassName
Definition: winuser.h:3274
WNDPROC lpfnWndProc
Definition: winuser.h:3266
Definition: match.c:390
Definition: dsound.c:943
LPVOID lpCreateParams
Definition: winuser.h:3042
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
#define GWLP_USERDATA
Definition: treelist.c:63
int iy
Definition: tritemp.h:491
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT
Definition: typedefs.h:58
#define ZeroMemory
Definition: winbase.h:1753
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define GetModuleHandle
Definition: winbase.h:3868
#define THREAD_PRIORITY_HIGHEST
Definition: winbase.h:310
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, fn)
Definition: windowsx.h:240
#define GetWindowOwner(hwnd)
Definition: windowsx.h:314
#define FORWARD_WM_NCHITTEST(hwnd, x, y, fn)
Definition: windowsx.h:191
#define HANDLE_MSG(hwnd, message, fn)
Definition: windowsx.h:322
#define SetWindowRedraw(hwnd, fRedraw)
Definition: windowsx.h:534
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define WM_PAINT
Definition: winuser.h:1648
HWND WINAPI SetCapture(_In_ HWND hWnd)
#define CreateWindowEx
Definition: winuser.h:5866
#define GetMonitorInfo
Definition: winuser.h:5902
#define WM_CLOSE
Definition: winuser.h:1649
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define wvsprintf
Definition: winuser.h:5977
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
CREATESTRUCTA * LPCREATESTRUCT
Definition: winuser.h:5837
#define SM_CXDRAG
Definition: winuser.h:1039
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define SM_CYSCREEN
Definition: winuser.h:971
#define DT_CENTER
Definition: winuser.h:527
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
#define HWND_TOPMOST
Definition: winuser.h:1219
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define WM_CREATE
Definition: winuser.h:1636
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define HTBOTTOM
Definition: winuser.h:2529
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define SWP_DRAWFRAME
Definition: winuser.h:1250
#define WM_SIZE
Definition: winuser.h:1639
#define DT_SINGLELINE
Definition: winuser.h:540
#define SWP_NOMOVE
Definition: winuser.h:1255
#define WM_COMMAND
Definition: winuser.h:1768
BOOL WINAPI SetForegroundWindow(_In_ HWND)
#define IDC_ARROW
Definition: winuser.h:695
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3047
#define WM_NCHITTEST
Definition: winuser.h:1714
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define SWP_NOSIZE
Definition: winuser.h:1256
#define WM_MOUSEMOVE
Definition: winuser.h:1803
#define RDW_UPDATENOW
Definition: winuser.h:1231
#define WA_INACTIVE
Definition: winuser.h:2664
#define WM_LBUTTONDOWN
Definition: winuser.h:1804
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define DrawText
Definition: winuser.h:5882
#define IDI_APPLICATION
Definition: winuser.h:712
#define WM_ACTIVATE
Definition: winuser.h:1640
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
#define WM_RBUTTONDOWN
Definition: winuser.h:1807
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
#define GetMessage
Definition: winuser.h:5901
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define RDW_ALLCHILDREN
Definition: winuser.h:1232
#define WM_TIMER
Definition: winuser.h:1770
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define HTRIGHT
Definition: winuser.h:2525
#define LoadIcon
Definition: winuser.h:5924
BOOL WINAPI UpdateWindow(_In_ HWND)
#define HTCLIENT
Definition: winuser.h:2511
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define LoadCursor
Definition: winuser.h:5923
#define WM_LBUTTONUP
Definition: winuser.h:1805
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define GetWindowText
Definition: winuser.h:5909
#define DT_VCENTER
Definition: winuser.h:543
#define PostMessage
Definition: winuser.h:5943
#define CW_USEDEFAULT
Definition: winuser.h:225
#define WA_ACTIVE
Definition: winuser.h:2665
#define WM_MOVE
Definition: winuser.h:1638
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
_In_ int _Inout_ LPRECT lprc
Definition: winuser.h:4568
#define WM_NCDESTROY
Definition: winuser.h:1712
#define HTTOP
Definition: winuser.h:2526
#define WA_CLICKACTIVE
Definition: winuser.h:2666
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define GW_HWNDPREV
Definition: winuser.h:773
#define RegisterClass
Definition: winuser.h:5947
#define SM_CXSCREEN
Definition: winuser.h:970
#define WM_KEYDOWN
Definition: winuser.h:1743
#define DispatchMessage
Definition: winuser.h:5876
HWND WINAPI FindWindowW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define SWP_NOZORDER
Definition: winuser.h:1258
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SystemParametersInfo
Definition: winuser.h:5969
#define HTLEFT
Definition: winuser.h:2523
#define SM_CYDRAG
Definition: winuser.h:1040
#define SM_CMONITORS
Definition: winuser.h:1051
#define VK_ESCAPE
Definition: winuser.h:2250
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1690
#define HWND_NOTOPMOST
Definition: winuser.h:1217
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define RDW_INVALIDATE
Definition: winuser.h:1225
#define HWND_BOTTOM
Definition: winuser.h:1216
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define COLOR_3DFACE
Definition: winuser.h:940
char TCHAR
Definition: xmlstorage.h:189
const char * LPCSTR
Definition: xmlstorage.h:183
const CHAR * LPCTSTR
Definition: xmlstorage.h:193