ReactOS 0.4.16-dev-1146-gc477928
trayntfy.cpp
Go to the documentation of this file.
1/*
2 * ReactOS Explorer
3 *
4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5 * Copyright 2018 Ged Murphy <gedmurphy@reactos.org>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "precomp.h"
23#include <commoncontrols.h>
24
25static const WCHAR szTrayNotifyWndClass[] = L"TrayNotifyWnd";
26
27#define TRAY_NOTIFY_WND_SPACING_X 1
28#define TRAY_NOTIFY_WND_SPACING_Y 1
29#define CLOCK_TEXT_HACK 4
30
31/*
32 * TrayNotifyWnd
33 */
34
36 public CComCoClass<CTrayNotifyWnd>,
37 public CComObjectRootEx<CComMultiThreadModelNoCS>,
38 public CWindowImpl < CTrayNotifyWnd, CWindow, CControlWinTraits >,
39 public IOleWindow
40{
44
48
55
56public:
62 {
67 }
69
71 {
72 if (TrayTheme)
74
75 if (IsThemeActive())
76 TrayTheme = OpenThemeData(m_hWnd, L"TrayNotify");
77 else
79
80 if (TrayTheme)
81 {
83
85 NULL,
87 0,
89 NULL,
91 }
92 else
93 {
95
100 }
101
102 return TRUE;
103 }
104
106 {
107 return OnThemeChanged();
108 }
109
111 {
112 HRESULT hr;
113
116 return FALSE;
117
120 return FALSE;
121
124 return FALSE;
125
128 return FALSE;
129
130 /* Create the 'Show Desktop' button */
133
134 return TRUE;
135 }
136
138 {
139 SIZE clockSize = { 0, 0 };
140 SIZE traySize = { 0, 0 };
141 SIZE showDesktopSize = { 0, 0 };
142 BOOL bHideClock = GetHideClock();
143
144 if (!bHideClock)
145 {
146 if (IsHorizontal)
147 {
148 clockSize.cy = pSize->cy;
149 if (clockSize.cy <= 0)
150 goto NoClock;
151 }
152 else
153 {
154 clockSize.cx = pSize->cx;
155 if (clockSize.cx <= 0)
156 goto NoClock;
157 }
158
160
161 trayClockMinSize = clockSize;
162 }
163 else
164 NoClock:
165 trayClockMinSize = clockSize;
166
167 if (IsHorizontal)
168 {
169 traySize.cy = pSize->cy - 2 * TRAY_NOTIFY_WND_SPACING_Y;
170 }
171 else
172 {
173 traySize.cx = pSize->cx - 2 * TRAY_NOTIFY_WND_SPACING_X;
174 }
175
177
178 trayNotifySize = traySize;
179
180 INT showDesktopButtonExtent = 0;
182 {
183 showDesktopButtonExtent = m_ShowDesktopButton.WidthOrHeight();
184 if (IsHorizontal)
185 {
186 showDesktopSize.cx = showDesktopButtonExtent;
187 showDesktopSize.cy = pSize->cy;
188 }
189 else
190 {
191 showDesktopSize.cx = pSize->cx;
192 showDesktopSize.cy = showDesktopButtonExtent;
193 }
194 }
195 trayShowDesktopSize = showDesktopSize;
196
197 if (IsHorizontal)
198 {
199 pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X;
200
201 if (!bHideClock)
203
205 pSize->cx += showDesktopButtonExtent;
206
207 pSize->cx += traySize.cx;
209 }
210 else
211 {
212 pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y;
213
214 if (!bHideClock)
216
218 pSize->cy += showDesktopButtonExtent;
219
220 pSize->cy += traySize.cy;
222 }
223
224 return TRUE;
225 }
226
227 VOID Size(IN OUT SIZE *pszClient)
228 {
229 RECT rcClient = {0, 0, pszClient->cx, pszClient->cy};
230 AlignControls(&rcClient);
231 pszClient->cx = rcClient.right - rcClient.left;
232 pszClient->cy = rcClient.bottom - rcClient.top;
233 }
234
236 {
237 RECT rcClient;
238 if (prcClient != NULL)
239 rcClient = *prcClient;
240 else
241 GetClientRect(&rcClient);
242
243 rcClient.left += ContentMargin.cxLeftWidth;
244 rcClient.top += ContentMargin.cyTopHeight;
245 rcClient.right -= ContentMargin.cxRightWidth;
247
249
251 {
252 POINT ptShowDesktop =
253 {
254 rcClient.left,
255 rcClient.top
256 };
257 SIZE showDesktopSize =
258 {
259 rcClient.right - rcClient.left,
260 rcClient.bottom - rcClient.top
261 };
262
263 INT cxyShowDesktop = m_ShowDesktopButton.WidthOrHeight();
264 if (IsHorizontal)
265 {
266 if (!TrayTheme)
267 {
268 ptShowDesktop.y -= ContentMargin.cyTopHeight;
270 }
271
272 rcClient.right -= (cxyShowDesktop - ContentMargin.cxRightWidth);
273
274 ptShowDesktop.x = rcClient.right;
275 showDesktopSize.cx = cxyShowDesktop;
276
277 // HACK: Clock has layout problems - remove this once addressed.
278 rcClient.right -= CLOCK_TEXT_HACK;
279 }
280 else
281 {
282 if (!TrayTheme)
283 {
284 ptShowDesktop.x -= ContentMargin.cxLeftWidth;
286 }
287
288 rcClient.bottom -= (cxyShowDesktop - ContentMargin.cyBottomHeight);
289
290 ptShowDesktop.y = rcClient.bottom;
291 showDesktopSize.cy = cxyShowDesktop;
292
293 // HACK: Clock has layout problems - remove this once addressed.
294 rcClient.bottom -= CLOCK_TEXT_HACK;
295 }
296
297 /* Resize and reposition the button */
299 NULL,
300 ptShowDesktop.x,
301 ptShowDesktop.y,
302 showDesktopSize.cx,
303 showDesktopSize.cy,
304 swpFlags);
305 }
306
307 if (!GetHideClock())
308 {
309 POINT ptClock = { rcClient.left, rcClient.top };
310 SIZE clockSize = { rcClient.right - rcClient.left, rcClient.bottom - rcClient.top };
311
312 if (IsHorizontal)
313 {
314 rcClient.right -= trayClockMinSize.cx;
315
316 ptClock.x = rcClient.right;
317 clockSize.cx = trayClockMinSize.cx;
318 }
319 else
320 {
321 rcClient.bottom -= trayClockMinSize.cy;
322
323 ptClock.y = rcClient.bottom;
324 clockSize.cy = trayClockMinSize.cy;
325 }
326
328 NULL,
329 ptClock.x,
330 ptClock.y,
331 clockSize.cx,
332 clockSize.cy,
333 swpFlags);
334 }
335
336 POINT ptPager;
337 if (IsHorizontal)
338 {
339 ptPager.x = ContentMargin.cxLeftWidth;
340 ptPager.y = ((rcClient.bottom - rcClient.top) - trayNotifySize.cy) / 2;
342 ptPager.y += ContentMargin.cyTopHeight;
343 }
344 else
345 {
346 ptPager.x = ((rcClient.right - rcClient.left) - trayNotifySize.cx) / 2;
348 ptPager.x += ContentMargin.cxLeftWidth;
349 ptPager.y = ContentMargin.cyTopHeight;
350 }
351
353 NULL,
354 ptPager.x,
355 ptPager.y,
358 swpFlags);
359
360 if (prcClient != NULL)
361 {
362 prcClient->left = rcClient.left - ContentMargin.cxLeftWidth;
363 prcClient->top = rcClient.top - ContentMargin.cyTopHeight;
364 prcClient->right = rcClient.right + ContentMargin.cxRightWidth;
365 prcClient->bottom = rcClient.bottom + ContentMargin.cyBottomHeight;
366 }
367 }
368
370 {
371 HDC hdc = (HDC) wParam;
372
373 if (!TrayTheme)
374 {
375 bHandled = FALSE;
376 return 0;
377 }
378
379 RECT rect;
383
385
386 return TRUE;
387 }
388
390 {
391 BOOL Horizontal = (BOOL) wParam;
392
393 if (Horizontal != IsHorizontal)
394 IsHorizontal = Horizontal;
395
397 IsHorizontal ? L"TrayNotifyHoriz" : L"TrayNotifyVert",
398 NULL);
400
402 }
403
405 {
406 if (wParam == NULL)
407 return 0;
408
411 {
412 *ptr = NULL;
413 return 0;
414 }
415
417 bHandled = TRUE;
418 return 0;
419 }
420
422 {
423 SIZE clientSize;
424
425 clientSize.cx = LOWORD(lParam);
426 clientSize.cy = HIWORD(lParam);
427
428 Size(&clientSize);
429
430 return TRUE;
431 }
432
434 {
435 POINT pt;
438
440 return HTCLIENT;
441
442 return HTTRANSPARENT;
443 }
444
446 {
447 POINT pt;
449
452
453 return TRUE;
454 }
455
457 {
458 bHandled = TRUE;
459
460 if (reinterpret_cast<HWND>(wParam) == m_hwndClock)
461 return GetParent().SendMessage(uMsg, wParam, lParam);
462 else
463 return 0;
464 }
465
467 {
468 return SendMessageW(m_hwndClock, uMsg, wParam, lParam);
469 }
470
472 {
473 TaskbarSettings* newSettings = (TaskbarSettings*)lParam;
474
475 /* Toggle show desktop button */
477 {
480
481 /* Ask the parent to resize */
482 NMHDR nmh = {m_hWnd, 0, NTNWM_REALIGN};
483 SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
484 }
485
487
488 return OnClockMessage(uMsg, wParam, lParam, bHandled);
489 }
490
492 {
493 return SendMessageW(m_hwndPager, uMsg, wParam, lParam);
494 }
495
496 LRESULT OnRealign(INT uCode, LPNMHDR hdr, BOOL& bHandled)
497 {
498 hdr->hwndFrom = m_hWnd;
500 }
501
502 // *** IOleWindow methods ***
503
505 GetWindow(HWND* phwnd) override
506 {
507 if (!phwnd)
508 return E_INVALIDARG;
509 *phwnd = m_hWnd;
510 return S_OK;
511 }
512
514 ContextSensitiveHelp(BOOL fEnterMode) override
515 {
516 return E_NOTIMPL;
517 }
518
520 {
522 Create(hwndParent, 0, NULL, dwStyle, WS_EX_STATICEDGE);
523 return m_hWnd ? S_OK : E_FAIL;
524 }
525
527
532
534
537 MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
553};
554
556{
557 return ShellObjectCreatorInit<CTrayNotifyWnd>(hwndParent, riid, ppv);
558}
@ Create
Definition: registry.c:563
HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
Definition: trayclock.cpp:783
HRESULT CSysPagerWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
Definition: syspager.cpp:1614
#define TNWM_GETMINIMUMSIZE
Definition: precomp.h:378
TaskbarSettings g_TaskbarSettings
Definition: settings.cpp:23
#define TWM_SETTINGSCHANGED
Definition: precomp.h:134
#define TNWM_GETSHOWDESKTOPBUTTON
Definition: precomp.h:380
#define NTNWM_REALIGN
Definition: precomp.h:382
static BOOL GetHideClock()
Definition: precomp.h:372
#define STDMETHODIMP
Definition: basetyps.h:43
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
Definition: atlwin.h:1116
CWindow GetParent() const
Definition: atlwin.h:700
HWND m_hWnd
Definition: atlwin.h:273
LRESULT OnRealign(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: trayntfy.cpp:496
SIZE trayShowDesktopSize
Definition: trayntfy.cpp:51
SIZE trayNotifySize
Definition: trayntfy.cpp:52
CComPtr< IUnknown > m_pager
Definition: trayntfy.cpp:43
VOID Size(IN OUT SIZE *pszClient)
Definition: trayntfy.cpp:227
SIZE trayClockMinSize
Definition: trayntfy.cpp:50
LRESULT OnClockMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:466
BOOL GetMinimumSize(IN OUT PSIZE pSize)
Definition: trayntfy.cpp:137
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:369
BOOL IsHorizontal
Definition: trayntfy.cpp:54
LRESULT OnPagerMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:491
LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:433
LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:389
CComPtr< IUnknown > m_clock
Definition: trayntfy.cpp:41
HTHEME TrayTheme
Definition: trayntfy.cpp:49
LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:471
LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:445
LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:456
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: trayntfy.cpp:514
HRESULT Initialize(IN HWND hwndParent)
Definition: trayntfy.cpp:519
HWND m_hwndShowDesktop
Definition: trayntfy.cpp:46
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:421
LRESULT OnThemeChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:105
LRESULT OnThemeChanged()
Definition: trayntfy.cpp:70
HWND m_hwndClock
Definition: trayntfy.cpp:45
VOID AlignControls(IN CONST PRECT prcClient OPTIONAL)
Definition: trayntfy.cpp:235
HWND m_hwndPager
Definition: trayntfy.cpp:47
LRESULT OnGetShowDesktopButton(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:404
CTrayShowDesktopButton m_ShowDesktopButton
Definition: trayntfy.cpp:42
MARGINS ContentMargin
Definition: trayntfy.cpp:53
STDMETHODIMP GetWindow(HWND *phwnd) override
Definition: trayntfy.cpp:505
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: trayntfy.cpp:110
BOOL PtInButton(LPPOINT pt) const
HRESULT DoCreate(HWND hwndParent)
Definition: traydeskbtn.cpp:62
INT WidthOrHeight() const
Definition: traydeskbtn.cpp:33
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static HWND hwndParent
Definition: cryptui.c:300
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:68
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1336
HRESULT WINAPI DrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
Definition: draw.c:128
BOOL WINAPI IsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, int iStateId)
Definition: draw.c:1927
HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
Definition: draw.c:72
HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, RECT *prc, MARGINS *pMargins)
Definition: property.c:216
HTHEME WINAPI OpenThemeData(HWND hwnd, LPCWSTR classlist)
Definition: system.c:850
BOOL WINAPI IsThemeActive(void)
Definition: system.c:621
HRESULT WINAPI CloseThemeData(HTHEME hTheme)
Definition: system.c:965
#define pt(x, y)
Definition: drawing.c:79
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
char hdr[14]
Definition: iptest.cpp:33
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1926
#define NOTIFY_CODE_HANDLER(cd, func)
Definition: atlwin.h:1980
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1898
#define END_MSG_MAP()
Definition: atlwin.h:1917
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
Definition: atlwin.h:2004
#define SetWindowExStyle(h, val)
Definition: utility.h:154
static PVOID ptr
Definition: dispmode.c:27
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
static HTHEME(WINAPI *pOpenThemeDataEx)(HWND
unsigned int UINT
Definition: ndis.h:50
#define BOOL
Definition: nt_native.h:43
#define L(x)
Definition: ntvdm.h:50
const GUID IID_IOleWindow
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define CONST
Definition: pedump.c:81
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define REFIID
Definition: guiddef.h:118
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_NOTIFY
Definition: richedit.h:61
HRESULT hr
Definition: shlfolder.c:183
& rect
Definition: startmenu.cpp:1413
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
BOOL bShowDesktopButton
Definition: precomp.h:225
BOOL bHideInactiveIcons
Definition: precomp.h:222
BOOL UseCompactTrayIcons()
Definition: precomp.h:230
Definition: misc.c:279
int cyBottomHeight
Definition: misc.c:283
int cyTopHeight
Definition: misc.c:282
int cxRightWidth
Definition: misc.c:281
int cxLeftWidth
Definition: misc.c:280
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
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
static const WCHAR szTrayNotifyWndClass[]
Definition: trayntfy.cpp:25
#define TRAY_NOTIFY_WND_SPACING_Y
Definition: trayntfy.cpp:28
#define TRAY_NOTIFY_WND_SPACING_X
Definition: trayntfy.cpp:27
#define CLOCK_TEXT_HACK
Definition: trayntfy.cpp:29
HRESULT CTrayNotifyWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
Definition: trayntfy.cpp:555
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
#define HIWORD(l)
Definition: typedefs.h:247
#define OUT
Definition: typedefs.h:40
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
#define TMT_CONTENTMARGINS
Definition: vssym32.h:324
@ TNP_BACKGROUND
Definition: vssym32.h:543
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define ZeroMemory
Definition: winbase.h:1743
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define WM_ERASEBKGND
Definition: winuser.h:1636
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define SW_HIDE
Definition: winuser.h:779
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define WM_CREATE
Definition: winuser.h:1619
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_DRAWFRAME
Definition: winuser.h:1250
#define WM_SIZE
Definition: winuser.h:1622
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3032
#define WM_NCHITTEST
Definition: winuser.h:1697
#define WM_MOUSEMOVE
Definition: winuser.h:1786
#define CS_DBLCLKS
Definition: winuser.h:659
#define WM_NCLBUTTONDBLCLK
Definition: winuser.h:1705
#define WM_SETTINGCHANGE
Definition: winuser.h:1640
#define WM_NCMOUSEMOVE
Definition: winuser.h:1702
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define SWP_NOCOPYBITS
Definition: winuser.h:1254
#define WM_SETFONT
Definition: winuser.h:1661
#define HTCLIENT
Definition: winuser.h:2486
#define WM_COPYDATA
Definition: winuser.h:1675
#define SendMessage
Definition: winuser.h:5863
#define HTTRANSPARENT
Definition: winuser.h:2484
#define SW_SHOW
Definition: winuser.h:786
#define SWP_NOZORDER
Definition: winuser.h:1258
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define COLOR_3DFACE
Definition: winuser.h:940
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180