Files
wine-access/tests/controls_fixture.c

118 lines
5.3 KiB
C

// SPDX-License-Identifier: LGPL-2.1-or-later
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <commctrl.h>
static HWND tabs, atlTabs, tree, combo, edit, button, list;
static HTREEITEM root;
static int step;
static void focus_control(HWND window) {
SetFocus(window);
NotifyWinEvent(EVENT_OBJECT_FOCUS, window, OBJID_CLIENT, CHILDID_SELF);
}
static LRESULT CALLBACK window_proc(HWND window, UINT message, WPARAM wp, LPARAM lp) {
if (message == WM_TIMER) {
switch (++step) {
case 1: SendMessageW(tabs, WM_KEYDOWN, VK_RIGHT, 1); break;
case 2: focus_control(button); break;
case 3: focus_control(atlTabs); break;
case 4: SendMessageW(atlTabs, WM_KEYDOWN, VK_RIGHT, 1); break;
case 5: focus_control(tree); break;
case 6: SendMessageW(tree, TVM_EXPAND, TVE_EXPAND, (LPARAM)root); break;
case 7: SendMessageW(tree, WM_KEYDOWN, VK_DOWN, 1); break;
case 8: focus_control(button); break;
case 9: focus_control(tree); break;
case 10: focus_control(combo); break;
case 11:
SendMessageW(combo, CB_SETCURSEL, 1, 0);
// Common file dialogs can change the selection without a WinEvent.
break;
case 12: focus_control(edit); break;
case 13: focus_control(atlTabs); break;
case 14: SendMessageW(atlTabs, TCM_DELETEALLITEMS, 0, 0); break;
case 15: focus_control(tree); break;
case 16: SendMessageW(tree, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); break;
case 17: focus_control(list); break;
default: DestroyWindow(window); break;
}
return 0;
}
if (message == WM_DESTROY) { PostQuitMessage(0); return 0; }
return DefWindowProcW(window, message, wp, lp);
}
int WINAPI WinMain(HINSTANCE instance, HINSTANCE previous, LPSTR args, int show) {
(void)previous; (void)args; (void)show;
INITCOMMONCONTROLSEX controls = {sizeof(controls), ICC_TAB_CLASSES | ICC_TREEVIEW_CLASSES};
InitCommonControlsEx(&controls);
WNDCLASSW cls = {0};
cls.hInstance = instance;
cls.lpszClassName = L"WineAccessControlsFixture";
cls.lpfnWndProc = window_proc;
RegisterClassW(&cls);
HWND window = CreateWindowW(cls.lpszClassName, L"Wine & controls fixture", WS_OVERLAPPEDWINDOW,
120, 120, 700, 440, NULL, NULL, instance, NULL);
WNDCLASSEXW tabClass = {0};
tabClass.cbSize = sizeof(tabClass);
if (!GetClassInfoExW(NULL, WC_TABCONTROLW, &tabClass)) return 1;
tabClass.hInstance = instance;
tabClass.lpszClassName = L"ATL:SysTabControl32";
if (!RegisterClassExW(&tabClass)) return 2;
tabs = CreateWindowW(WC_TABCONTROLW, L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
10, 10, 300, 80, window, NULL, instance, NULL);
atlTabs = CreateWindowW(tabClass.lpszClassName, L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
330, 10, 300, 80, window, NULL, instance, NULL);
TCITEMW tab = {0};
tab.mask = TCIF_TEXT;
tab.pszText = L"Albums & artists β";
SendMessageW(tabs, TCM_INSERTITEMW, 0, (LPARAM)&tab);
tab.pszText = L"Details";
SendMessageW(tabs, TCM_INSERTITEMW, 1, (LPARAM)&tab);
tab.pszText = L"Default Playlist";
SendMessageW(atlTabs, TCM_INSERTITEMW, 0, (LPARAM)&tab);
tab.pszText = L"Second Playlist";
SendMessageW(atlTabs, TCM_INSERTITEMW, 1, (LPARAM)&tab);
tree = CreateWindowW(WC_TREEVIEWW, L"Tree1", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
10, 110, 300, 170, window, NULL, instance, NULL);
TVINSERTSTRUCTW node = {0};
node.hParent = TVI_ROOT;
node.hInsertAfter = TVI_LAST;
node.item.mask = TVIF_TEXT;
node.item.pszText = L"All music";
root = (HTREEITEM)SendMessageW(tree, TVM_INSERTITEMW, 0, (LPARAM)&node);
node.hParent = root;
node.item.pszText = L"Artist & album β";
SendMessageW(tree, TVM_INSERTITEMW, 0, (LPARAM)&node);
SendMessageW(tree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)root);
button = CreateWindowW(L"Button", L"&Named && native button", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
10, 310, 250, 30, window, NULL, instance, NULL);
combo = CreateWindowW(L"ComboBox", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST,
390, 110, 200, 150, window, NULL, instance, NULL);
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"artist & album");
SendMessageW(combo, CB_ADDSTRING, 0, (LPARAM)L"year && date");
SendMessageW(combo, CB_SETCURSEL, 0, 0);
edit = CreateWindowW(L"Edit", L"search & find", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
390, 170, 200, 25, window, NULL, instance, NULL);
// Labels are deliberately created after their fields, like foobar2000.
CreateWindowW(L"Static", L"&View && sort:", WS_CHILD | WS_VISIBLE,
330, 110, 50, 25, window, NULL, instance, NULL);
CreateWindowW(L"Static", L"Filter & query:", WS_CHILD | WS_VISIBLE | SS_NOPREFIX,
330, 170, 50, 25, window, NULL, instance, NULL);
list = CreateWindowW(L"ListBox", L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
390, 220, 200, 80, window, NULL, instance, NULL);
SendMessageW(list, LB_ADDSTRING, 0, (LPARAM)L"Rock & roll && blues");
SendMessageW(list, LB_SETCURSEL, 0, 0);
ShowWindow(window, SW_SHOW);
SetForegroundWindow(window);
focus_control(tabs);
SetTimer(window, 1, 400, NULL);
MSG message;
while (GetMessageW(&message, NULL, 0, 0) > 0) {
TranslateMessage(&message); DispatchMessageW(&message);
}
return 0;
}