ReactOS 0.4.16-dev-88-ga65b6ae
autocomplete.c
Go to the documentation of this file.
1/*
2 * Tests for autocomplete
3 *
4 * Copyright 2008 Jan de Mooij
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22
23#include <stdarg.h>
24
25#include "windows.h"
26#include "shobjidl.h"
27#include "shlguid.h"
28#include "shldisp.h"
29#include "shlobj.h"
30
31#include "wine/heap.h"
32#include "wine/test.h"
33
36static int killfocus_count;
37
38static void test_invalid_init(void)
39{
40 HRESULT hr;
41 IAutoComplete *ac;
42 IUnknown *acSource;
43 HWND edit_control;
44
45 /* AutoComplete instance */
46 hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
47 &IID_IAutoComplete, (void **)&ac);
49 {
50 win_skip("CLSID_AutoComplete is not registered\n");
51 return;
52 }
53 ok(hr == S_OK, "no IID_IAutoComplete (0x%08x)\n", hr);
54
55 /* AutoComplete source */
56 hr = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER,
57 &IID_IACList, (void **)&acSource);
59 {
60 win_skip("CLSID_ACLMulti is not registered\n");
61 IAutoComplete_Release(ac);
62 return;
63 }
64 ok(hr == S_OK, "no IID_IACList (0x%08x)\n", hr);
65
66 edit_control = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300,
68 ok(edit_control != NULL, "Can't create edit control\n");
69
70 /* The refcount of acSource would be incremented on older Windows. */
71 hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL);
72 ok(hr == E_INVALIDARG ||
73 broken(hr == S_OK), /* Win2k/XP/Win2k3 */
74 "Init returned 0x%08x\n", hr);
75 if (hr == E_INVALIDARG)
76 {
77 LONG ref;
78
79 IUnknown_AddRef(acSource);
80 ref = IUnknown_Release(acSource);
81 ok(ref == 1, "Expected AutoComplete source refcount to be 1, got %d\n", ref);
82 }
83
84if (0)
85{
86 /* Older Windows versions never check the window handle, while newer
87 * versions only check for NULL. Subsequent attempts to initialize the
88 * object after this call succeeds would fail, because initialization
89 * state is determined by whether a non-NULL window handle is stored. */
90 hr = IAutoComplete_Init(ac, (HWND)0xdeadbeef, acSource, NULL, NULL);
91 ok(hr == S_OK, "Init returned 0x%08x\n", hr);
92
93 /* Tests crash on older Windows. */
94 hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL);
95 ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr);
96
97 hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL);
98 ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr);
99}
100
101 /* bind to edit control */
102 hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL);
103 ok(hr == S_OK, "Init returned 0x%08x\n", hr);
104
105 /* try invalid parameters after successful initialization .*/
106 hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL);
107 ok(hr == E_INVALIDARG ||
108 hr == E_FAIL, /* Win2k/XP/Win2k3 */
109 "Init returned 0x%08x\n", hr);
110
111 hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL);
112 ok(hr == E_INVALIDARG ||
113 hr == E_FAIL, /* Win2k/XP/Win2k3 */
114 "Init returned 0x%08x\n", hr);
115
116 hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL);
117 ok(hr == E_INVALIDARG ||
118 hr == E_FAIL, /* Win2k/XP/Win2k3 */
119 "Init returned 0x%08x\n", hr);
120
121 /* try initializing twice on the same control */
122 hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL);
123 ok(hr == E_FAIL, "Init returned 0x%08x\n", hr);
124
125 /* try initializing with a different control */
126 hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
127 ok(hr == E_FAIL, "Init returned 0x%08x\n", hr);
128
129 DestroyWindow(edit_control);
130
131 /* try initializing with a different control after
132 * destroying the original initialization control */
133 hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
134 ok(hr == E_UNEXPECTED ||
135 hr == E_FAIL, /* Win2k/XP/Win2k3 */
136 "Init returned 0x%08x\n", hr);
137
138 IUnknown_Release(acSource);
139 IAutoComplete_Release(ac);
140}
142{
143 HRESULT r;
144 IAutoComplete *ac, *ac2;
145 IUnknown *acSource;
146 LONG_PTR user_data;
147
148 /* AutoComplete instance */
149 r = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
150 &IID_IAutoComplete, (LPVOID*)&ac);
151 if (r == REGDB_E_CLASSNOTREG)
152 {
153 win_skip("CLSID_AutoComplete is not registered\n");
154 return NULL;
155 }
156 ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r);
157
158 /* AutoComplete source */
159 r = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER,
160 &IID_IACList, (LPVOID*)&acSource);
161 if (r == REGDB_E_CLASSNOTREG)
162 {
163 win_skip("CLSID_ACLMulti is not registered\n");
164 IAutoComplete_Release(ac);
165 return NULL;
166 }
167 ok(r == S_OK, "no IID_IACList (0x%08x)\n", r);
168
170 ok(user_data == 0, "Expected the edit control user data to be zero\n");
171
172 /* bind to edit control */
173 r = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
174 ok(r == S_OK, "Init returned 0x%08x\n", r);
175
177 ok(user_data == 0, "Expected the edit control user data to be zero\n");
178
179 /* bind a different object to the same edit control */
180 r = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
181 &IID_IAutoComplete, (LPVOID*)&ac2);
182 ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r);
183
184 r = IAutoComplete_Init(ac2, hEdit, acSource, NULL, NULL);
185 ok(r == S_OK, "Init returned 0x%08x\n", r);
186 IAutoComplete_Release(ac2);
187
188 IUnknown_Release(acSource);
189
190 return ac;
191}
192
193static void test_killfocus(void)
194{
195 /* Test if WM_KILLFOCUS messages are handled properly by checking if
196 * the parent receives an EN_KILLFOCUS message. */
198 killfocus_count = 0;
199 SetFocus(0);
200 ok(killfocus_count == 1, "Expected one EN_KILLFOCUS message, got: %d\n", killfocus_count);
201}
202
204{
205 switch(msg) {
206 case WM_CREATE:
207 /* create edit control */
208 hEdit = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300,
209 hWnd, NULL, hinst, NULL);
210 ok(hEdit != NULL, "Can't create edit control\n");
211 break;
212 case WM_COMMAND:
215 break;
216 }
218}
219
220static void createMainWnd(void)
221{
222 WNDCLASSA wc;
224 wc.cbClsExtra = 0;
225 wc.cbWndExtra = 0;
227 wc.hIcon = NULL;
230 wc.lpszMenuName = NULL;
231 wc.lpszClassName = "MyTestWnd";
233 RegisterClassA(&wc);
234
235 hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW,
237}
238
240static const WCHAR HijackerWndProc_txt[] = {'H','i','j','a','c','k','e','d',0};
242{
243 switch(msg) {
244 case WM_GETTEXT:
245 {
247 memcpy((void*)lParam, HijackerWndProc_txt, len * sizeof(WCHAR));
248 return len;
249 }
250 case WM_GETTEXTLENGTH:
252 }
254}
255
257{
258 switch(msg) {
259 case EM_SETSEL:
260 lParam = wParam;
261 break;
262 case WM_SETTEXT:
264 break;
265 }
267}
268
270{
276 int cur;
280};
281
283{
285}
286
288{
289 struct string_enumerator *this = impl_from_IEnumString(iface);
291 *ppv = &this->IEnumString_iface;
292 else if (IsEqualGUID(riid, &IID_IACList))
293 *ppv = &this->IACList_iface;
294 else
295 {
296 *ppv = NULL;
297 return E_NOINTERFACE;
298 }
299
300 IUnknown_AddRef(&this->IEnumString_iface);
301 return S_OK;
302}
303
305{
306 struct string_enumerator *this = impl_from_IEnumString(iface);
307
308 ULONG ref = InterlockedIncrement(&this->ref);
309
310 return ref;
311}
312
314{
315 struct string_enumerator *this = impl_from_IEnumString(iface);
316
317 ULONG ref = InterlockedDecrement(&this->ref);
318
319 if (!ref)
320 heap_free(this);
321
322 return ref;
323}
324
326{
327 struct string_enumerator *this = impl_from_IEnumString(iface);
328 int i, len;
329
330 *num_returned = 0;
331 for (i = 0; i < num; i++)
332 {
333 if (this->cur >= this->data_len)
334 return S_FALSE;
335
336 len = lstrlenW(this->data[this->cur]) + 1;
337
338 strings[i] = CoTaskMemAlloc(len * sizeof(WCHAR));
339 memcpy(strings[i], this->data[this->cur], len * sizeof(WCHAR));
340
341 (*num_returned)++;
342 this->cur++;
343 }
344
345 return S_OK;
346}
347
349{
350 struct string_enumerator *this = impl_from_IEnumString(iface);
351
352 this->cur = 0;
353 this->num_resets++;
354
355 return S_OK;
356}
357
359{
360 struct string_enumerator *this = impl_from_IEnumString(iface);
361
362 this->cur += num;
363
364 return S_OK;
365}
366
368{
369 *out = NULL;
370 return E_NOTIMPL;
371}
372
373static IEnumStringVtbl string_enumerator_vtbl =
374{
382};
383
384static struct string_enumerator *impl_from_IACList(IACList *iface)
385{
387}
388
389static HRESULT WINAPI aclist_QueryInterface(IACList *iface, REFIID riid, void **ppv)
390{
392}
393
394static ULONG WINAPI aclist_AddRef(IACList *iface)
395{
397}
398
399static ULONG WINAPI aclist_Release(IACList *iface)
400{
402}
403
404static HRESULT WINAPI aclist_Expand(IACList *iface, const WCHAR *expand)
405{
406 struct string_enumerator *this = impl_from_IACList(iface);
407
408 /* see what we get called with and how many times,
409 don't actually do any expansion of the strings */
410 memcpy(this->last_expand, expand, min((lstrlenW(expand) + 1)*sizeof(WCHAR), sizeof(this->last_expand)));
411 this->last_expand[ARRAY_SIZE(this->last_expand) - 1] = '\0';
412 this->num_expand++;
413
414 return S_OK;
415}
416
417static IACListVtbl aclist_vtbl =
418{
423};
424
425static HRESULT string_enumerator_create(void **ppv, WCHAR **suggestions, int count)
426{
428
429 object = heap_alloc_zero(sizeof(*object));
430 object->IEnumString_iface.lpVtbl = &string_enumerator_vtbl;
431 object->IACList_iface.lpVtbl = &aclist_vtbl;
432 object->ref = 1;
433 object->data = suggestions;
434 object->data_len = count;
435 object->cur = 0;
436
437 *ppv = &object->IEnumString_iface;
438
439 return S_OK;
440}
441
442static void dispatch_messages(void)
443{
444 MSG msg;
445 Sleep(33);
446 while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
447 {
450 }
451}
452
453#define check_dropdown(acdropdown, hwnd_edit, list, list_num) check_dropdown_(__FILE__, __LINE__, acdropdown, hwnd_edit, list, list_num)
454static void check_dropdown_(const char *file, UINT line, IAutoCompleteDropDown *acdropdown, HWND hwnd_edit, WCHAR **list, UINT list_num)
455{
456 UINT i;
457 DWORD flags = 0;
458 LPWSTR str;
459 HRESULT hr;
460
461 hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, &str);
462 ok_(file, line)(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
463 if (hr != S_OK) return;
464 if (list_num) ok_(file, line)(flags & ACDD_VISIBLE, "AutoComplete DropDown not visible\n");
465 else
466 {
467 ok_(file, line)(!(flags & ACDD_VISIBLE), "AutoComplete DropDown visible\n");
468 return;
469 }
470 ok_(file, line)(str == NULL, "Expected (null), got %s\n", wine_dbgstr_w(str));
471 if (str)
472 {
474 return;
475 }
476
477 for (i = 0; i <= list_num; i++)
478 {
479 flags = 0;
480 SendMessageW(hwnd_edit, WM_KEYDOWN, VK_DOWN, 0);
481 SendMessageW(hwnd_edit, WM_KEYUP, VK_DOWN, 0xc0000000);
482 hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, &str);
483 ok_(file, line)(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
484 ok_(file, line)(flags & ACDD_VISIBLE, "AutoComplete DropDown not visible\n");
485 if (hr == S_OK)
486 {
487 if (i < list_num)
488 ok_(file, line)(str && !lstrcmpW(list[i], str), "Expected %s, got %s\n",
490 else
491 ok_(file, line)(str == NULL, "Expected (null), got %s\n", wine_dbgstr_w(str));
492 }
494 }
495}
496
497static void test_aclist_expand(HWND hwnd_edit, void *enumerator, IAutoCompleteDropDown *acdropdown)
498{
499 struct string_enumerator *obj = (struct string_enumerator*)enumerator;
500 static WCHAR str1[] = {'t','e','s','t',0};
501 static WCHAR str1a[] = {'t','e','s','t','\\',0};
502 static WCHAR str2[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\','b','a',0};
503 static WCHAR str2a[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\',0};
504 static WCHAR str2b[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\','b','a','z','_','b','b','q','\\',0};
505 HRESULT hr;
506 obj->num_resets = 0;
507
508 ok(obj->num_expand == 0, "Expected 0 expansions, got %u\n", obj->num_expand);
509 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str1);
510 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1) - 1, ARRAY_SIZE(str1) - 1);
511 SendMessageW(hwnd_edit, WM_CHAR, '\\', 1);
513 ok(obj->num_expand == 1, "Expected 1 expansion, got %u\n", obj->num_expand);
514 ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
515 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
516 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str2);
517 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str2) - 1, ARRAY_SIZE(str2) - 1);
518 SendMessageW(hwnd_edit, WM_CHAR, 'z', 1);
520 ok(obj->num_expand == 2, "Expected 2 expansions, got %u\n", obj->num_expand);
521 ok(lstrcmpW(obj->last_expand, str2a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str2a), wine_dbgstr_w(obj->last_expand));
522 ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
523 SetFocus(hwnd_edit);
524 SendMessageW(hwnd_edit, WM_CHAR, '_', 1);
525 SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
526 SetFocus(0);
527 SetFocus(hwnd_edit);
528 SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
529 SendMessageW(hwnd_edit, WM_CHAR, 'q', 1);
531 ok(obj->num_expand == 2, "Expected 2 expansions, got %u\n", obj->num_expand);
532 ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
533 SendMessageW(hwnd_edit, WM_CHAR, '\\', 1);
535 ok(obj->num_expand == 3, "Expected 3 expansions, got %u\n", obj->num_expand);
536 ok(lstrcmpW(obj->last_expand, str2b) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str2b), wine_dbgstr_w(obj->last_expand));
537 ok(obj->num_resets == 3, "Expected 3 resets, got %u\n", obj->num_resets);
538 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1a) - 1, -1);
539 SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
540 SendMessageW(hwnd_edit, WM_CHAR, 'y', 1);
542 ok(obj->num_expand == 4, "Expected 4 expansions, got %u\n", obj->num_expand);
543 ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
544 ok(obj->num_resets == 4, "Expected 4 resets, got %u\n", obj->num_resets);
545 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1) - 1, -1);
546 SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
548 ok(obj->num_expand == 4, "Expected 4 expansions, got %u\n", obj->num_expand);
549 ok(obj->num_resets == 5, "Expected 5 resets, got %u\n", obj->num_resets);
550 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str1a);
551 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1a) - 1, ARRAY_SIZE(str1a) - 1);
552 SendMessageW(hwnd_edit, WM_CHAR, 'f', 1);
554 ok(obj->num_expand == 5, "Expected 5 expansions, got %u\n", obj->num_expand);
555 ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
556 ok(obj->num_resets == 6, "Expected 6 resets, got %u\n", obj->num_resets);
557 hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
558 ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
559 SendMessageW(hwnd_edit, WM_CHAR, 'o', 1);
561 ok(obj->num_expand == 6, "Expected 6 expansions, got %u\n", obj->num_expand);
562 ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
563 ok(obj->num_resets == 7, "Expected 7 resets, got %u\n", obj->num_resets);
564}
565
566static void test_prefix_filtering(HWND hwnd_edit)
567{
568 static WCHAR htt[] = {'h','t','t',0};
569 static WCHAR www[] = {'w','w','w','.',0};
570 static WCHAR str0[] = {'w','w','w','.','a','x',0};
571 static WCHAR str1[] = {'h','t','t','p','s',':','/','/','w','w','w','.','a','c',0};
572 static WCHAR str2[] = {'a','a',0};
573 static WCHAR str3[] = {'a','b',0};
574 static WCHAR str4[] = {'h','t','t','p',':','/','/','a','0',0};
575 static WCHAR str5[] = {'h','t','t','p','s',':','/','/','h','t','a',0};
576 static WCHAR str6[] = {'h','f','o','o',0};
577 static WCHAR str7[] = {'h','t','t','p',':','/','/','w','w','w','.','a','d','d',0};
578 static WCHAR str8[] = {'w','w','w','.','w','w','w','.','?',0};
579 static WCHAR str9[] = {'h','t','t','p',':','/','/','a','b','c','.','a','a','.','c','o','m',0};
580 static WCHAR str10[]= {'f','t','p',':','/','/','a','b','c',0};
581 static WCHAR str11[]= {'f','i','l','e',':','/','/','a','a',0};
582 static WCHAR str12[]= {'f','t','p',':','/','/','w','w','w','.','a','a',0};
583 static WCHAR *suggestions[] = { str0, str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12 };
584 static WCHAR *sorted1[] = { str4, str2, str3, str9, str1, str7, str0 };
585 static WCHAR *sorted2[] = { str3, str9 };
586 static WCHAR *sorted3[] = { str1, str7, str0 };
587 static WCHAR *sorted4[] = { str6, str5 };
588 static WCHAR *sorted5[] = { str5 };
589 static WCHAR *sorted6[] = { str4, str9 };
590 static WCHAR *sorted7[] = { str11, str10, str12 };
591 IUnknown *enumerator;
592 IAutoComplete2 *autocomplete;
593 IAutoCompleteDropDown *acdropdown;
594 WCHAR buffer[20];
595 HRESULT hr;
596
597 hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, &IID_IAutoComplete2, (void**)&autocomplete);
598 ok(hr == S_OK, "CoCreateInstance failed: %x\n", hr);
599
600 hr = IAutoComplete2_QueryInterface(autocomplete, &IID_IAutoCompleteDropDown, (LPVOID*)&acdropdown);
601 ok(hr == S_OK, "No IAutoCompleteDropDown interface: %x\n", hr);
602
603 string_enumerator_create((void**)&enumerator, suggestions, ARRAY_SIZE(suggestions));
604
605 hr = IAutoComplete2_SetOptions(autocomplete, ACO_FILTERPREFIXES | ACO_AUTOSUGGEST | ACO_AUTOAPPEND);
606 ok(hr == S_OK, "IAutoComplete2_SetOptions failed: %x\n", hr);
607 hr = IAutoComplete2_Init(autocomplete, hwnd_edit, enumerator, NULL, NULL);
608 ok(hr == S_OK, "IAutoComplete_Init failed: %x\n", hr);
609
610 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
611 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
614 ok(lstrcmpW(str4 + 7, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str4 + 7), wine_dbgstr_w(buffer));
615 check_dropdown(acdropdown, hwnd_edit, sorted1, ARRAY_SIZE(sorted1));
616
617 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
618 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
619 SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
622 ok(lstrcmpW(str3, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str3), wine_dbgstr_w(buffer));
623 check_dropdown(acdropdown, hwnd_edit, sorted2, ARRAY_SIZE(sorted2));
624 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
625 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
626 SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
627 SendMessageW(hwnd_edit, WM_CHAR, 'c', 1);
630 ok(lstrcmpW(str9 + 7, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str9 + 7), wine_dbgstr_w(buffer));
631
632 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)www);
633 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(www) - 1, ARRAY_SIZE(www) - 1);
634 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
637 ok(lstrcmpW(str1 + 8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1 + 8), wine_dbgstr_w(buffer));
638 check_dropdown(acdropdown, hwnd_edit, sorted3, ARRAY_SIZE(sorted3));
639 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)www);
640 SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(www) - 1, ARRAY_SIZE(www) - 1);
641 SendMessageW(hwnd_edit, WM_CHAR, 'w', 1);
644 ok(lstrcmpW(str8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str8), wine_dbgstr_w(buffer));
645
646 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
647 SendMessageW(hwnd_edit, WM_CHAR, 'h', 1);
650 ok(lstrcmpW(str6, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str6), wine_dbgstr_w(buffer));
651 check_dropdown(acdropdown, hwnd_edit, sorted4, ARRAY_SIZE(sorted4));
652 SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
654 ok(lstrcmpW(str5 + 8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str5 + 8), wine_dbgstr_w(buffer));
655 check_dropdown(acdropdown, hwnd_edit, sorted5, ARRAY_SIZE(sorted5));
656 SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
658 ok(lstrcmpW(htt, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(htt), wine_dbgstr_w(buffer));
659 check_dropdown(acdropdown, hwnd_edit, NULL, 0);
660 SendMessageW(hwnd_edit, WM_CHAR, 'p', 1);
661 SendMessageW(hwnd_edit, WM_CHAR, ':', 1);
662 SendMessageW(hwnd_edit, WM_CHAR, '/', 1);
663 SendMessageW(hwnd_edit, WM_CHAR, '/', 1);
664 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
667 ok(lstrcmpW(str4, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str4), wine_dbgstr_w(buffer));
668 check_dropdown(acdropdown, hwnd_edit, sorted6, ARRAY_SIZE(sorted6));
669 SendMessageW(hwnd_edit, EM_SETSEL, 0, 2);
670 SendMessageW(hwnd_edit, WM_CHAR, 'H', 1);
672 check_dropdown(acdropdown, hwnd_edit, NULL, 0);
673 SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
675 check_dropdown(acdropdown, hwnd_edit, sorted6, ARRAY_SIZE(sorted6));
676
677 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
678 SendMessageW(hwnd_edit, WM_CHAR, 'F', 1);
681 check_dropdown(acdropdown, hwnd_edit, sorted7, ARRAY_SIZE(sorted7));
682 SendMessageW(hwnd_edit, WM_CHAR, 'i', 1);
683 SendMessageW(hwnd_edit, WM_CHAR, 'L', 1);
685 check_dropdown(acdropdown, hwnd_edit, sorted7, 1);
686
687 IAutoCompleteDropDown_Release(acdropdown);
688 IAutoComplete2_Release(autocomplete);
689 IUnknown_Release(enumerator);
690}
691
692static void test_custom_source(void)
693{
694 static WCHAR str_alpha[] = {'t','e','s','t','1',0};
695 static WCHAR str_alpha2[] = {'t','e','s','t','2',0};
696 static WCHAR str_beta[] = {'a','u','t','o',' ','c','o','m','p','l','e','t','e',0};
697 static WCHAR str_au[] = {'a','u',0};
698 static WCHAR str_aut[] = {'a','u','t',0};
699 static WCHAR *suggestions[] = { str_alpha, str_alpha2, str_beta };
700 struct string_enumerator *obj;
701 IUnknown *enumerator;
702 IAutoComplete2 *autocomplete;
703 IAutoCompleteDropDown *acdropdown;
704 HWND hwnd_edit;
705 DWORD flags = 0;
706 WCHAR buffer[20];
707 HRESULT hr;
708
710
711 hwnd_edit = CreateWindowA("Edit", "", WS_OVERLAPPED | WS_VISIBLE | WS_CHILD | WS_BORDER, 50, 5, 200, 20, hMainWnd, 0, NULL, 0);
712
713 hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, &IID_IAutoComplete2, (void**)&autocomplete);
714 ok(hr == S_OK, "CoCreateInstance failed: %x\n", hr);
715
716 hr = IAutoComplete2_QueryInterface(autocomplete, &IID_IAutoCompleteDropDown, (LPVOID*)&acdropdown);
717 ok(hr == S_OK, "No IAutoCompleteDropDown interface: %x\n", hr);
718
719 string_enumerator_create((void**)&enumerator, suggestions, ARRAY_SIZE(suggestions));
720 obj = (struct string_enumerator*)enumerator;
721
722 hr = IAutoComplete2_SetOptions(autocomplete, ACO_AUTOSUGGEST | ACO_AUTOAPPEND);
723 ok(hr == S_OK, "IAutoComplete2_SetOptions failed: %x\n", hr);
724 hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
725 ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
726 hr = IAutoComplete2_Init(autocomplete, hwnd_edit, enumerator, NULL, NULL);
727 ok(hr == S_OK, "IAutoComplete_Init failed: %x\n", hr);
728
729 SetFocus(hwnd_edit);
730 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
731 SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
734 ok(lstrcmpW(str_beta, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_beta), wine_dbgstr_w(buffer));
735 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
736 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
737 SendMessageW(hwnd_edit, WM_CHAR, '\b', 1);
740 ok(buffer[0] == '\0', "Expected empty string, got %s\n", wine_dbgstr_w(buffer));
741 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
742 hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
743 ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
744 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
745 obj->num_resets = 0;
746
747 /* hijack the window procedure */
751
752 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
753 SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
757 ok(lstrcmpW(str_au, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_au), wine_dbgstr_w(buffer));
758 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
759 SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
760 SendMessageW(hwnd_edit, WM_CHAR, '\b', 1);
763 ok(buffer[0] == '\0', "Expected empty string, got %s\n", wine_dbgstr_w(buffer));
764 hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
765 ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
766
768 SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
769 SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
773 ok(lstrcmpW(str_beta, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_beta), wine_dbgstr_w(buffer));
774 ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
775 /* end of hijacks */
776
777 hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
778 ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
779 ok(flags & ACDD_VISIBLE, "AutoComplete DropDown should be visible\n");
780 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str_au);
782 hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
783 ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
784 ok(!(flags & ACDD_VISIBLE), "AutoComplete DropDown should have been hidden\n");
785 SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str_aut);
787 hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
788 ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
789 ok(!(flags & ACDD_VISIBLE), "AutoComplete DropDown should be hidden\n");
791 ok(lstrcmpW(str_aut, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_aut), wine_dbgstr_w(buffer));
792
793 test_aclist_expand(hwnd_edit, enumerator, acdropdown);
794 obj->num_resets = 0;
795
796 hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
797 ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
798 SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
800 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
801 SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
803 ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
804
805 IAutoCompleteDropDown_Release(acdropdown);
806 IAutoComplete2_Release(autocomplete);
807 IUnknown_Release(enumerator);
808
809 test_prefix_filtering(hwnd_edit);
810
812 DestroyWindow(hwnd_edit);
813}
814
815START_TEST(autocomplete)
816{
817 HRESULT r;
818 MSG msg;
819 IAutoComplete* ac;
820 RECT win_rect;
821 POINT orig_pos;
822
824 ok(r == S_OK, "CoInitialize failed (0x%08x). Tests aborted.\n", r);
825 if (r != S_OK)
826 return;
827
829 ok(hMainWnd != NULL, "Failed to create parent window. Tests aborted.\n");
830 if (!hMainWnd) return;
831
832 /* Move the cursor away from the dropdown listbox */
833 GetWindowRect(hMainWnd, &win_rect);
834 GetCursorPos(&orig_pos);
835 SetCursorPos(win_rect.left, win_rect.top);
836
838 ac = test_init();
839 if (!ac)
840 goto cleanup;
842
844
846 while(GetMessageA(&msg,0,0,0)) {
849 }
850
851 IAutoComplete_Release(ac);
852
853cleanup:
854 SetCursorPos(orig_pos.x, orig_pos.y);
857
859}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define ok(value,...)
Definition: atltest.h:57
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define ARRAY_SIZE(A)
Definition: main.h:20
static BOOL expand(LPINT ac, LPTSTR **arg, LPCTSTR pattern)
Definition: misc.c:228
const GUID IID_IUnknown
static TestACL * impl_from_IACList(IACList *iface)
Definition: autocomplete.c:68
static TestACL * impl_from_IEnumString(IEnumString *iface)
Definition: autocomplete.c:63
Definition: list.h:37
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#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 CALLBACK
Definition: compat.h:35
#define lstrlenW
Definition: compat.h:750
static void cleanup(void)
Definition: main.c:1335
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4242
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
unsigned long DWORD
Definition: ntddk_ex.h:95
FxCollectionEntry * cur
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizei const GLchar *const * strings
Definition: glext.h:7622
GLuint buffer
Definition: glext.h:5915
GLbitfield flags
Definition: glext.h:7161
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define wine_dbgstr_w
Definition: kernel32.h:34
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static LPOLESTR
Definition: stg_prop.c:27
#define min(a, b)
Definition: monoChain.cc:55
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
const GUID IID_IEnumString
#define WS_CHILD
Definition: pedump.c:617
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_OVERLAPPED
Definition: pedump.c:615
#define WS_BORDER
Definition: pedump.c:625
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static FILE * out
Definition: regtests2xml.c:44
const WCHAR * str
#define win_skip
Definition: test.h:163
static HRESULT WINAPI string_enumerator_Clone(IEnumString *iface, IEnumString **out)
Definition: autocomplete.c:367
static ULONG WINAPI string_enumerator_AddRef(IEnumString *iface)
Definition: autocomplete.c:304
static void test_prefix_filtering(HWND hwnd_edit)
Definition: autocomplete.c:566
static HRESULT WINAPI string_enumerator_Skip(IEnumString *iface, ULONG num)
Definition: autocomplete.c:358
static HWND hEdit
Definition: autocomplete.c:34
static IACListVtbl aclist_vtbl
Definition: autocomplete.c:417
static LRESULT CALLBACK HijackerWndProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:256
static HRESULT WINAPI string_enumerator_Next(IEnumString *iface, ULONG num, LPOLESTR *strings, ULONG *num_returned)
Definition: autocomplete.c:325
static WNDPROC HijackerWndProc_prev
Definition: autocomplete.c:239
static void test_invalid_init(void)
Definition: autocomplete.c:38
static HRESULT string_enumerator_create(void **ppv, WCHAR **suggestions, int count)
Definition: autocomplete.c:425
static HRESULT WINAPI string_enumerator_QueryInterface(IEnumString *iface, REFIID riid, void **ppv)
Definition: autocomplete.c:287
static void check_dropdown_(const char *file, UINT line, IAutoCompleteDropDown *acdropdown, HWND hwnd_edit, WCHAR **list, UINT list_num)
Definition: autocomplete.c:454
static void test_custom_source(void)
Definition: autocomplete.c:692
static void dispatch_messages(void)
Definition: autocomplete.c:442
static HWND hMainWnd
Definition: autocomplete.c:34
static void createMainWnd(void)
Definition: autocomplete.c:220
static ULONG WINAPI aclist_AddRef(IACList *iface)
Definition: autocomplete.c:394
static void test_killfocus(void)
Definition: autocomplete.c:193
static int killfocus_count
Definition: autocomplete.c:36
static HRESULT WINAPI aclist_Expand(IACList *iface, const WCHAR *expand)
Definition: autocomplete.c:404
static ULONG WINAPI aclist_Release(IACList *iface)
Definition: autocomplete.c:399
static HRESULT WINAPI aclist_QueryInterface(IACList *iface, REFIID riid, void **ppv)
Definition: autocomplete.c:389
static void test_aclist_expand(HWND hwnd_edit, void *enumerator, IAutoCompleteDropDown *acdropdown)
Definition: autocomplete.c:497
static IEnumStringVtbl string_enumerator_vtbl
Definition: autocomplete.c:373
#define check_dropdown(acdropdown, hwnd_edit, list, list_num)
Definition: autocomplete.c:453
static IAutoComplete * test_init(void)
Definition: autocomplete.c:141
static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:203
static LRESULT CALLBACK HijackerWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:241
static ULONG WINAPI string_enumerator_Release(IEnumString *iface)
Definition: autocomplete.c:313
static const WCHAR HijackerWndProc_txt[]
Definition: autocomplete.c:240
static HINSTANCE hinst
Definition: autocomplete.c:35
static HRESULT WINAPI string_enumerator_Reset(IEnumString *iface)
Definition: autocomplete.c:348
HRESULT hr
Definition: shlfolder.c:183
HBRUSH hbrBackground
Definition: winuser.h:3173
HICON hIcon
Definition: winuser.h:3171
HINSTANCE hInstance
Definition: winuser.h:3170
HCURSOR hCursor
Definition: winuser.h:3172
int cbWndExtra
Definition: winuser.h:3169
UINT style
Definition: winuser.h:3166
LPCSTR lpszMenuName
Definition: winuser.h:3174
LPCSTR lpszClassName
Definition: winuser.h:3175
WNDPROC lpfnWndProc
Definition: winuser.h:3167
int cbClsExtra
Definition: winuser.h:3168
Definition: fci.c:127
Definition: parser.c:49
Definition: send.c:48
IEnumString IEnumString_iface
Definition: autocomplete.c:271
WCHAR last_expand[32]
Definition: autocomplete.c:279
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
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 GWLP_WNDPROC
Definition: treelist.c:66
#define GWLP_USERDATA
Definition: treelist.c:63
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
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 REGDB_E_CLASSNOTREG
Definition: winerror.h:2696
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_UNEXPECTED
Definition: winerror.h:2456
#define CS_VREDRAW
Definition: winuser.h:658
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define WM_GETTEXTLENGTH
Definition: winuser.h:1622
#define SW_HIDE
Definition: winuser.h:771
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define WM_KEYUP
Definition: winuser.h:1719
#define EN_KILLFOCUS
Definition: winuser.h:2028
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define COLOR_WINDOW
Definition: winuser.h:921
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4318
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define WM_CREATE
Definition: winuser.h:1611
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define WM_COMMAND
Definition: winuser.h:1743
#define CS_HREDRAW
Definition: winuser.h:653
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2714
#define WM_GETTEXT
Definition: winuser.h:1621
#define GetWindowLongPtrA
Definition: winuser.h:4831
BOOL WINAPI SetCursorPos(_In_ int, _In_ int)
Definition: cursoricon.c:2706
#define WM_SETTEXT
Definition: winuser.h:1620
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
HWND WINAPI SetFocus(_In_opt_ HWND)
#define PM_REMOVE
Definition: winuser.h:1199
#define IDC_IBEAM
Definition: winuser.h:688
#define EM_SETSEL
Definition: winuser.h:2021
#define WM_CHAR
Definition: winuser.h:1720
#define CW_USEDEFAULT
Definition: winuser.h:225
#define VK_DOWN
Definition: winuser.h:2230
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define SW_SHOW
Definition: winuser.h:778
#define WM_KEYDOWN
Definition: winuser.h:1718
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2909
#define SetWindowLongPtrW
Definition: winuser.h:5358
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI DestroyWindow(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2134
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184