ReactOS 0.4.17-dev-484-g30b02d0
window.c
Go to the documentation of this file.
1/*
2 * Copyright 2014 Piotr Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#define COBJMACROS
20
21#include "oleacc_private.h"
22#include "commctrl.h"
23
24#include "wine/debug.h"
25#include "wine/heap.h"
26
28
29typedef struct {
34
36
38} Window;
39
40static inline Window* impl_from_Window(IAccessible *iface)
41{
42 return CONTAINING_RECORD(iface, Window, IAccessible_iface);
43}
44
46{
48
49 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
50
51 if(IsEqualIID(riid, &IID_IAccessible) ||
54 *ppv = iface;
55 }else if(IsEqualIID(riid, &IID_IOleWindow)) {
56 *ppv = &This->IOleWindow_iface;
57 }else if(IsEqualIID(riid, &IID_IEnumVARIANT)) {
58 *ppv = &This->IEnumVARIANT_iface;
59 }else if(IsEqualIID(riid, &IID_IServiceProvider)) {
60 *ppv = &This->IServiceProvider_iface;
61 }else {
62 WARN("no interface: %s\n", debugstr_guid(riid));
63 *ppv = NULL;
64 return E_NOINTERFACE;
65 }
66
67 IAccessible_AddRef(iface);
68 return S_OK;
69}
70
72{
75
76 TRACE("(%p) ref = %lu\n", This, ref);
77 return ref;
78}
79
81{
84
85 TRACE("(%p) ref = %lu\n", This, ref);
86
87 if(!ref)
89 return ref;
90}
91
93{
95 FIXME("(%p)->(%p)\n", This, pctinfo);
96 return E_NOTIMPL;
97}
98
100 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
101{
102 Window *This = impl_from_Window(iface);
103 FIXME("(%p)->(%u %lx %p)\n", This, iTInfo, lcid, ppTInfo);
104 return E_NOTIMPL;
105}
106
108 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
109{
110 Window *This = impl_from_Window(iface);
111 FIXME("(%p)->(%s %p %u %lx %p)\n", This, debugstr_guid(riid),
112 rgszNames, cNames, lcid, rgDispId);
113 return E_NOTIMPL;
114}
115
116static HRESULT WINAPI Window_Invoke(IAccessible *iface, DISPID dispIdMember,
117 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
118 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
119{
120 Window *This = impl_from_Window(iface);
121 FIXME("(%p)->(%lx %s %lx %x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
122 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
123 return E_NOTIMPL;
124}
125
127{
128 Window *This = impl_from_Window(iface);
129 FIXME("(%p)->(%p)\n", This, ppdispParent);
130 return E_NOTIMPL;
131}
132
134{
135 Window *This = impl_from_Window(iface);
136 FIXME("(%p)->(%p)\n", This, pcountChildren);
137 return E_NOTIMPL;
138}
139
141 VARIANT varChildID, IDispatch **ppdispChild)
142{
143 Window *This = impl_from_Window(iface);
144 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varChildID), ppdispChild);
145 return E_NOTIMPL;
146}
147
149{
150 Window *This = impl_from_Window(iface);
151 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszName);
152 return E_NOTIMPL;
153}
154
156{
157 Window *This = impl_from_Window(iface);
158 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszValue);
159 return E_NOTIMPL;
160}
161
163 VARIANT varID, BSTR *pszDescription)
164{
165 Window *This = impl_from_Window(iface);
166 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDescription);
167 return E_NOTIMPL;
168}
169
171{
172 Window *This = impl_from_Window(iface);
173 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarRole);
174 return E_NOTIMPL;
175}
176
178{
179 Window *This = impl_from_Window(iface);
180 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pvarState);
181 return E_NOTIMPL;
182}
183
185{
186 Window *This = impl_from_Window(iface);
187 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszHelp);
188 return E_NOTIMPL;
189}
190
192 BSTR *pszHelpFile, VARIANT varID, LONG *pidTopic)
193{
194 Window *This = impl_from_Window(iface);
195 FIXME("(%p)->(%p %s %p)\n", This, pszHelpFile, debugstr_variant(&varID), pidTopic);
196 return E_NOTIMPL;
197}
198
200 VARIANT varID, BSTR *pszKeyboardShortcut)
201{
202 Window *This = impl_from_Window(iface);
203 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszKeyboardShortcut);
204 return E_NOTIMPL;
205}
206
208{
209 Window *This = impl_from_Window(iface);
210 FIXME("(%p)->(%p)\n", This, pvarID);
211 return E_NOTIMPL;
212}
213
215{
216 Window *This = impl_from_Window(iface);
217 FIXME("(%p)->(%p)\n", This, pvarID);
218 return E_NOTIMPL;
219}
220
222 VARIANT varID, BSTR *pszDefaultAction)
223{
224 Window *This = impl_from_Window(iface);
225 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&varID), pszDefaultAction);
226 return E_NOTIMPL;
227}
228
229static HRESULT WINAPI Window_accSelect(IAccessible *iface, LONG flagsSelect, VARIANT varID)
230{
231 Window *This = impl_from_Window(iface);
232 FIXME("(%p)->(%lx %s)\n", This, flagsSelect, debugstr_variant(&varID));
233 return E_NOTIMPL;
234}
235
237 LONG *pyTop, LONG *pcxWidth, LONG *pcyHeight, VARIANT varID)
238{
239 Window *This = impl_from_Window(iface);
240 FIXME("(%p)->(%p %p %p %p %s)\n", This, pxLeft, pyTop,
241 pcxWidth, pcyHeight, debugstr_variant(&varID));
242 return E_NOTIMPL;
243}
244
246 LONG navDir, VARIANT varStart, VARIANT *pvarEnd)
247{
248 Window *This = impl_from_Window(iface);
249 FIXME("(%p)->(%ld %s %p)\n", This, navDir, debugstr_variant(&varStart), pvarEnd);
250 return E_NOTIMPL;
251}
252
254{
255 Window *This = impl_from_Window(iface);
256 IDispatch *disp;
257 POINT pt;
258 HRESULT hr;
259 RECT rect;
260
261 TRACE("(%p)->(%ld %ld %p)\n", This, x, y, v);
262
263 V_VT(v) = VT_EMPTY;
264 if (!GetClientRect(This->hwnd, &rect))
265 return E_FAIL;
266 if (!ClientToScreen(This->hwnd, (POINT*)&rect) ||
267 !ClientToScreen(This->hwnd, &((POINT*)&rect)[1]))
268 return E_FAIL;
269 pt.x = x;
270 pt.y = y;
271 if (PtInRect(&rect, pt))
272 {
274 if (FAILED(hr))
275 return hr;
276 if (!disp)
277 return E_FAIL;
278
279 V_VT(v) = VT_DISPATCH;
280 V_DISPATCH(v) = disp;
281 return S_OK;
282 }
283
284 FIXME("non-client area not handled yet\n");
285 return E_NOTIMPL;
286}
287
289{
290 Window *This = impl_from_Window(iface);
291 FIXME("(%p)->(%s)\n", This, debugstr_variant(&varID));
292 return E_NOTIMPL;
293}
294
296{
297 Window *This = impl_from_Window(iface);
298 FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszName));
299 return E_NOTIMPL;
300}
301
303{
304 Window *This = impl_from_Window(iface);
305 FIXME("(%p)->(%s %s)\n", This, debugstr_variant(&varID), debugstr_w(pszValue));
306 return E_NOTIMPL;
307}
308
309static const IAccessibleVtbl WindowVtbl = {
338};
339
341{
342 return CONTAINING_RECORD(iface, Window, IOleWindow_iface);
343}
344
346{
348 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
349}
350
352{
354 return IAccessible_AddRef(&This->IAccessible_iface);
355}
356
358{
360 return IAccessible_Release(&This->IAccessible_iface);
361}
362
364{
366
367 TRACE("(%p)->(%p)\n", This, hwnd);
368
369 *hwnd = This->hwnd;
370 return S_OK;
371}
372
374{
376 FIXME("(%p)->(%x)\n", This, fEnterMode);
377 return E_NOTIMPL;
378}
379
380static const IOleWindowVtbl WindowOleWindowVtbl = {
386};
387
389{
390 return CONTAINING_RECORD(iface, Window, IEnumVARIANT_iface);
391}
392
394{
396 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
397}
398
400{
402 return IAccessible_AddRef(&This->IAccessible_iface);
403}
404
406{
408 return IAccessible_Release(&This->IAccessible_iface);
409}
410
412 ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
413{
415 FIXME("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched);
416 return E_NOTIMPL;
417}
418
420{
422 FIXME("(%p)->(%lu)\n", This, celt);
423 return E_NOTIMPL;
424}
425
427{
429 FIXME("(%p)\n", This);
430 return E_NOTIMPL;
431}
432
434{
436 FIXME("(%p)->(%p)\n", This, ppEnum);
437 return E_NOTIMPL;
438}
439
440static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl = {
448};
449
451{
452 return CONTAINING_RECORD(iface, Window, IServiceProvider_iface);
453}
454
456{
458 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
459}
460
462{
464 return IAccessible_AddRef(&This->IAccessible_iface);
465}
466
468{
470 return IAccessible_Release(&This->IAccessible_iface);
471}
472
474 REFIID riid, void **ppv)
475{
477
478 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guid_service), debugstr_guid(riid), ppv);
479
480 *ppv = NULL;
481 if (IsEqualIID(guid_service, &IIS_IsOleaccProxy))
482 return IAccessible_QueryInterface(&This->IAccessible_iface, riid, ppv);
483
484 return E_INVALIDARG;
485}
486
487static const IServiceProviderVtbl WindowServiceProviderVtbl = {
492};
493
494static const struct win_class_data classes[] = {
495 {WC_LISTBOXW, 0x10000, TRUE},
496 {L"#32768", 0x10001, TRUE}, /* menu */
497 {NULL}
498};
499
501{
502 Window *window;
504
505 if(!IsWindow(hwnd))
506 return E_FAIL;
507
508 window = heap_alloc_zero(sizeof(Window));
509 if(!window)
510 return E_OUTOFMEMORY;
511
513
514 window->IAccessible_iface.lpVtbl = &WindowVtbl;
515 window->IOleWindow_iface.lpVtbl = &WindowOleWindowVtbl;
516 window->IEnumVARIANT_iface.lpVtbl = &WindowEnumVARIANTVtbl;
517 window->IServiceProvider_iface.lpVtbl = &WindowServiceProviderVtbl;
518 window->ref = 1;
519 window->hwnd = hwnd;
520
521 hres = IAccessible_QueryInterface(&window->IAccessible_iface, iid, obj);
522 IAccessible_Release(&window->IAccessible_iface);
523 return hres;
524}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
RECT rect
Definition: combotst.c:67
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
LCID lcid
Definition: locale.c:5660
HRESULT WINAPI AccessibleObjectFromWindow(HWND hwnd, DWORD dwObjectID, REFIID riid, void **ppvObject)
Definition: main.c:386
const struct win_class_data * find_class_data(HWND hwnd, const struct win_class_data *classes)
Definition: main.c:59
static HRESULT WINAPI Window_get_accSelection(IAccessible *iface, VARIANT *pvarID)
Definition: window.c:214
static HRESULT WINAPI Window_QueryInterface(IAccessible *iface, REFIID riid, void **ppv)
Definition: window.c:45
static Window * impl_from_Window_OleWindow(IOleWindow *iface)
Definition: window.c:340
static HRESULT WINAPI Window_OleWindow_QueryInterface(IOleWindow *iface, REFIID riid, void **ppv)
Definition: window.c:345
static const IOleWindowVtbl WindowOleWindowVtbl
Definition: window.c:380
static HRESULT WINAPI Window_put_accName(IAccessible *iface, VARIANT varID, BSTR pszName)
Definition: window.c:295
static Window * impl_from_Window_EnumVARIANT(IEnumVARIANT *iface)
Definition: window.c:388
static HRESULT WINAPI Window_accSelect(IAccessible *iface, LONG flagsSelect, VARIANT varID)
Definition: window.c:229
static HRESULT WINAPI Window_accNavigate(IAccessible *iface, LONG navDir, VARIANT varStart, VARIANT *pvarEnd)
Definition: window.c:245
static HRESULT WINAPI Window_accHitTest(IAccessible *iface, LONG x, LONG y, VARIANT *v)
Definition: window.c:253
static const IServiceProviderVtbl WindowServiceProviderVtbl
Definition: window.c:487
static ULONG WINAPI Window_ServiceProvider_AddRef(IServiceProvider *iface)
Definition: window.c:461
static const IAccessibleVtbl WindowVtbl
Definition: window.c:309
static ULONG WINAPI Window_ServiceProvider_Release(IServiceProvider *iface)
Definition: window.c:467
static ULONG WINAPI Window_AddRef(IAccessible *iface)
Definition: window.c:71
static HRESULT WINAPI Window_EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
Definition: window.c:393
static ULONG WINAPI Window_OleWindow_Release(IOleWindow *iface)
Definition: window.c:357
static HRESULT WINAPI Window_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
Definition: window.c:419
static HRESULT WINAPI Window_get_accDescription(IAccessible *iface, VARIANT varID, BSTR *pszDescription)
Definition: window.c:162
static HRESULT WINAPI Window_EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
Definition: window.c:411
static HRESULT WINAPI Window_OleWindow_ContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode)
Definition: window.c:373
static HRESULT WINAPI Window_get_accValue(IAccessible *iface, VARIANT varID, BSTR *pszValue)
Definition: window.c:155
static ULONG WINAPI Window_EnumVARIANT_Release(IEnumVARIANT *iface)
Definition: window.c:405
static HRESULT WINAPI Window_get_accKeyboardShortcut(IAccessible *iface, VARIANT varID, BSTR *pszKeyboardShortcut)
Definition: window.c:199
static HRESULT WINAPI Window_get_accChildCount(IAccessible *iface, LONG *pcountChildren)
Definition: window.c:133
static HRESULT WINAPI Window_ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: window.c:455
static const struct win_class_data classes[]
Definition: window.c:494
static HRESULT WINAPI Window_OleWindow_GetWindow(IOleWindow *iface, HWND *hwnd)
Definition: window.c:363
static HRESULT WINAPI Window_get_accHelpTopic(IAccessible *iface, BSTR *pszHelpFile, VARIANT varID, LONG *pidTopic)
Definition: window.c:191
static HRESULT WINAPI Window_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
Definition: window.c:433
static HRESULT WINAPI Window_get_accHelp(IAccessible *iface, VARIANT varID, BSTR *pszHelp)
Definition: window.c:184
static HRESULT WINAPI Window_accDoDefaultAction(IAccessible *iface, VARIANT varID)
Definition: window.c:288
static HRESULT WINAPI Window_get_accRole(IAccessible *iface, VARIANT varID, VARIANT *pvarRole)
Definition: window.c:170
static HRESULT WINAPI Window_put_accValue(IAccessible *iface, VARIANT varID, BSTR pszValue)
Definition: window.c:302
static HRESULT WINAPI Window_get_accParent(IAccessible *iface, IDispatch **ppdispParent)
Definition: window.c:126
static Window * impl_from_Window(IAccessible *iface)
Definition: window.c:40
static HRESULT WINAPI Window_get_accName(IAccessible *iface, VARIANT varID, BSTR *pszName)
Definition: window.c:148
HRESULT create_window_object(HWND hwnd, const IID *iid, void **obj)
Definition: window.c:500
static Window * impl_from_Window_ServiceProvider(IServiceProvider *iface)
Definition: window.c:450
static ULONG WINAPI Window_EnumVARIANT_AddRef(IEnumVARIANT *iface)
Definition: window.c:399
static HRESULT WINAPI Window_Invoke(IAccessible *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: window.c:116
static HRESULT WINAPI Window_get_accDefaultAction(IAccessible *iface, VARIANT varID, BSTR *pszDefaultAction)
Definition: window.c:221
static HRESULT WINAPI Window_GetIDsOfNames(IAccessible *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: window.c:107
static HRESULT WINAPI Window_ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guid_service, REFIID riid, void **ppv)
Definition: window.c:473
static ULONG WINAPI Window_OleWindow_AddRef(IOleWindow *iface)
Definition: window.c:351
static HRESULT WINAPI Window_get_accFocus(IAccessible *iface, VARIANT *pvarID)
Definition: window.c:207
static HRESULT WINAPI Window_get_accChild(IAccessible *iface, VARIANT varChildID, IDispatch **ppdispChild)
Definition: window.c:140
static HRESULT WINAPI Window_accLocation(IAccessible *iface, LONG *pxLeft, LONG *pyTop, LONG *pcxWidth, LONG *pcyHeight, VARIANT varID)
Definition: window.c:236
static ULONG WINAPI Window_Release(IAccessible *iface)
Definition: window.c:80
static HRESULT WINAPI Window_GetTypeInfoCount(IAccessible *iface, UINT *pctinfo)
Definition: window.c:92
static HRESULT WINAPI Window_GetTypeInfo(IAccessible *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: window.c:99
static HRESULT WINAPI Window_get_accState(IAccessible *iface, VARIANT varID, VARIANT *pvarState)
Definition: window.c:177
static HRESULT WINAPI Window_EnumVARIANT_Reset(IEnumVARIANT *iface)
Definition: window.c:426
static const IEnumVARIANTVtbl WindowEnumVARIANTVtbl
Definition: window.c:440
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
#define pt(x, y)
Definition: drawing.c:79
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
const GLdouble * v
Definition: gl.h:2040
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
HRESULT hres
Definition: protocol.c:465
static IHTMLWindow2 * window
Definition: events.c:77
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define V_VT(A)
Definition: oleauto.h:211
#define V_DISPATCH(A)
Definition: oleauto.h:239
const GUID IID_IOleWindow
const GUID IID_IDispatch
long LONG
Definition: pedump.c:60
#define WC_LISTBOXW
Definition: commctrl.h:4716
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
Definition: shlwapi.h:783
DWORD LCID
Definition: nls.h:13
#define TRACE(s)
Definition: solgame.cpp:4
Definition: window.c:29
IAccessible IAccessible_iface
Definition: window.c:30
IEnumVARIANT IEnumVARIANT_iface
Definition: window.c:32
LONG ref
Definition: window.c:35
IServiceProvider IServiceProvider_iface
Definition: window.c:33
IOleWindow IOleWindow_iface
Definition: window.c:31
HWND hwnd
Definition: window.c:37
Definition: scsiwmi.h:51
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define OBJID_CLIENT
Definition: winable.h:19
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
BOOL WINAPI IsWindow(_In_opt_ HWND)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)