| /* | |
| * Copyright 2005 Dmitry Timoshkov | |
| * Copyright 2008 Jason Edmeades | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include <assert.h> | |
| #include <windows.h> | |
| #include <commctrl.h> | |
| #include "wine/test.h" | |
| #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) | |
| static void test_create_tooltip(void) | |
| { | |
| HWND parent, hwnd; | |
| DWORD style, exp_style; | |
| parent = CreateWindowEx(0, "static", NULL, WS_POPUP, | |
| 0, 0, 0, 0, | |
| NULL, NULL, NULL, 0); | |
| assert(parent); | |
| hwnd = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, 0x7fffffff | WS_POPUP, | |
| 10, 10, 300, 100, | |
| parent, NULL, NULL, 0); | |
| assert(hwnd); | |
| style = GetWindowLong(hwnd, GWL_STYLE); | |
| trace("style = %08x\n", style); | |
| exp_style = 0x7fffffff | WS_POPUP; | |
| exp_style &= ~(WS_CHILD | WS_MAXIMIZE | WS_BORDER | WS_DLGFRAME); | |
| ok(style == exp_style || broken(style == (exp_style | WS_BORDER)), /* nt4 */ | |
| "wrong style %08x/%08x\n", style, exp_style); | |
| DestroyWindow(hwnd); | |
| hwnd = CreateWindowEx(0, TOOLTIPS_CLASS, NULL, 0, | |
| 10, 10, 300, 100, | |
| parent, NULL, NULL, 0); | |
| assert(hwnd); | |
| style = GetWindowLong(hwnd, GWL_STYLE); | |
| trace("style = %08x\n", style); | |
| ok(style == (WS_POPUP | WS_CLIPSIBLINGS | WS_BORDER), | |
| "wrong style %08x\n", style); | |
| DestroyWindow(hwnd); | |
| DestroyWindow(parent); | |
| } | |
| /* try to make sure pending X events have been processed before continuing */ | |
| static void flush_events(int waitTime) | |
| { | |
| MSG msg; | |
| int diff = waitTime; | |
| DWORD time = GetTickCount() + waitTime; | |
| while (diff > 0) | |
| { | |
| if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min(100,diff), QS_ALLEVENTS) == WAIT_TIMEOUT) break; | |
| while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg ); | |
| diff = time - GetTickCount(); | |
| } | |
| } | |
| static int CD_Stages; | |
| static LRESULT CD_Result; | |
| static HWND g_hwnd; | |
| #define TEST_CDDS_PREPAINT 0x00000001 | |
| #define TEST_CDDS_POSTPAINT 0x00000002 | |
| #define TEST_CDDS_PREERASE 0x00000004 | |
| #define TEST_CDDS_POSTERASE 0x00000008 | |
| #define TEST_CDDS_ITEMPREPAINT 0x00000010 | |
| #define TEST_CDDS_ITEMPOSTPAINT 0x00000020 | |
| #define TEST_CDDS_ITEMPREERASE 0x00000040 | |
| #define TEST_CDDS_ITEMPOSTERASE 0x00000080 | |
| #define TEST_CDDS_SUBITEM 0x00000100 | |
| static LRESULT CALLBACK CustomDrawWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
| { | |
| switch(msg) { | |
| case WM_DESTROY: | |
| PostQuitMessage(0); | |
| break; | |
| case WM_NOTIFY: | |
| if (((NMHDR *)lParam)->code == NM_CUSTOMDRAW) { | |
| NMTTCUSTOMDRAW *ttcd = (NMTTCUSTOMDRAW*) lParam; | |
| ok(ttcd->nmcd.hdr.hwndFrom == g_hwnd, "Unexpected hwnd source %p (%p)\n", | |
| ttcd->nmcd.hdr.hwndFrom, g_hwnd); | |
| ok(ttcd->nmcd.hdr.idFrom == 0x1234ABCD, "Unexpected id %x\n", (int)ttcd->nmcd.hdr.idFrom); | |
| switch (ttcd->nmcd.dwDrawStage) { | |
| case CDDS_PREPAINT : CD_Stages |= TEST_CDDS_PREPAINT; break; | |
| case CDDS_POSTPAINT : CD_Stages |= TEST_CDDS_POSTPAINT; break; | |
| case CDDS_PREERASE : CD_Stages |= TEST_CDDS_PREERASE; break; | |
| case CDDS_POSTERASE : CD_Stages |= TEST_CDDS_POSTERASE; break; | |
| case CDDS_ITEMPREPAINT : CD_Stages |= TEST_CDDS_ITEMPREPAINT; break; | |
| case CDDS_ITEMPOSTPAINT: CD_Stages |= TEST_CDDS_ITEMPOSTPAINT; break; | |
| case CDDS_ITEMPREERASE : CD_Stages |= TEST_CDDS_ITEMPREERASE; break; | |
| case CDDS_ITEMPOSTERASE: CD_Stages |= TEST_CDDS_ITEMPOSTERASE; break; | |
| case CDDS_SUBITEM : CD_Stages |= TEST_CDDS_SUBITEM; break; | |
| default: CD_Stages = -1; | |
| } | |
| if (ttcd->nmcd.dwDrawStage == CDDS_PREPAINT) return CD_Result; | |
| } | |
| /* drop through */ | |
| default: | |
| return DefWindowProcA(hWnd, msg, wParam, lParam); | |
| } | |
| return 0L; | |
| } | |
| static void test_customdraw(void) { | |
| static struct { | |
| LRESULT FirstReturnValue; | |
| int ExpectedCalls; | |
| } expectedResults[] = { | |
| /* Valid notification responses */ | |
| {CDRF_DODEFAULT, TEST_CDDS_PREPAINT}, | |
| {CDRF_SKIPDEFAULT, TEST_CDDS_PREPAINT}, | |
| {CDRF_NOTIFYPOSTPAINT, TEST_CDDS_PREPAINT | TEST_CDDS_POSTPAINT}, | |
| /* Invalid notification responses */ | |
| {CDRF_NOTIFYITEMDRAW, TEST_CDDS_PREPAINT}, | |
| {CDRF_NOTIFYPOSTERASE, TEST_CDDS_PREPAINT}, | |
| {CDRF_NEWFONT, TEST_CDDS_PREPAINT} | |
| }; | |
| int iterationNumber; | |
| WNDCLASSA wc; | |
| LRESULT lResult; | |
| /* Create a class to use the custom draw wndproc */ | |
| wc.style = CS_HREDRAW | CS_VREDRAW; | |
| wc.cbClsExtra = 0; | |
| wc.cbWndExtra = 0; | |
| wc.hInstance = GetModuleHandleA(NULL); | |
| wc.hIcon = NULL; | |
| wc.hCursor = LoadCursorA(NULL, IDC_ARROW); | |
| wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); | |
| wc.lpszMenuName = NULL; | |
| wc.lpszClassName = "CustomDrawClass"; | |
| wc.lpfnWndProc = CustomDrawWndProc; | |
| RegisterClass(&wc); | |
| for (iterationNumber = 0; | |
| iterationNumber < sizeof(expectedResults)/sizeof(expectedResults[0]); | |
| iterationNumber++) { | |
| HWND parent, hwndTip; | |
| RECT rect; | |
| TOOLINFO toolInfo = { 0 }; | |
| /* Create a main window */ | |
| parent = CreateWindowEx(0, "CustomDrawClass", NULL, | |
| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | | |
| WS_MAXIMIZEBOX | WS_VISIBLE, | |
| 50, 50, | |
| 300, 300, | |
| NULL, NULL, NULL, 0); | |
| ok(parent != NULL, "Creation of main window failed\n"); | |
| /* Make it show */ | |
| ShowWindow(parent, SW_SHOWNORMAL); | |
| flush_events(100); | |
| /* Create Tooltip */ | |
| hwndTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, | |
| NULL, TTS_NOPREFIX | TTS_ALWAYSTIP, | |
| CW_USEDEFAULT, CW_USEDEFAULT, | |
| CW_USEDEFAULT, CW_USEDEFAULT, | |
| parent, NULL, GetModuleHandleA(NULL), 0); | |
| ok(hwndTip != NULL, "Creation of tooltip window failed\n"); | |
| /* Set up parms for the wndproc to handle */ | |
| CD_Stages = 0; | |
| CD_Result = expectedResults[iterationNumber].FirstReturnValue; | |
| g_hwnd = hwndTip; | |
| /* Make it topmost, as per the MSDN */ | |
| SetWindowPos(hwndTip, HWND_TOPMOST, 0, 0, 0, 0, | |
| SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); | |
| /* Create a tool */ | |
| toolInfo.cbSize = TTTOOLINFO_V1_SIZE; | |
| toolInfo.hwnd = parent; | |
| toolInfo.hinst = GetModuleHandleA(NULL); | |
| toolInfo.uFlags = TTF_SUBCLASS; | |
| toolInfo.uId = 0x1234ABCD; | |
| toolInfo.lpszText = (LPSTR)"This is a test tooltip"; | |
| toolInfo.lParam = 0xdeadbeef; | |
| GetClientRect (parent, &toolInfo.rect); | |
| lResult = SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo); | |
| ok(lResult, "Adding the tool to the tooltip failed\n"); | |
| /* Make tooltip appear quickly */ | |
| SendMessage(hwndTip, TTM_SETDELAYTIME, TTDT_INITIAL, MAKELPARAM(1,0)); | |
| /* Put cursor inside window, tooltip will appear immediately */ | |
| GetWindowRect( parent, &rect ); | |
| SetCursorPos( (rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2 ); | |
| flush_events(200); | |
| if (CD_Stages) | |
| { | |
| /* Check CustomDraw results */ | |
| ok(CD_Stages == expectedResults[iterationNumber].ExpectedCalls || | |
| broken(CD_Stages == (expectedResults[iterationNumber].ExpectedCalls & ~TEST_CDDS_POSTPAINT)), /* nt4 */ | |
| "CustomDraw run %d stages %x, expected %x\n", iterationNumber, CD_Stages, | |
| expectedResults[iterationNumber].ExpectedCalls); | |
| } | |
| /* Clean up */ | |
| DestroyWindow(hwndTip); | |
| DestroyWindow(parent); | |
| } | |
| } | |
| static const CHAR testcallbackA[] = "callback"; | |
| static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) | |
| { | |
| if (message == WM_NOTIFY && lParam) | |
| { | |
| NMTTDISPINFOA *ttnmdi = (NMTTDISPINFOA*)lParam; | |
| if (ttnmdi->hdr.code == TTN_GETDISPINFOA) | |
| lstrcpy(ttnmdi->lpszText, testcallbackA); | |
| } | |
| return DefWindowProcA(hwnd, message, wParam, lParam); | |
| } | |
| static BOOL register_parent_wnd_class(void) | |
| { | |
| WNDCLASSA cls; | |
| cls.style = 0; | |
| cls.lpfnWndProc = parent_wnd_proc; | |
| cls.cbClsExtra = 0; | |
| cls.cbWndExtra = 0; | |
| cls.hInstance = GetModuleHandleA(NULL); | |
| cls.hIcon = 0; | |
| cls.hCursor = LoadCursorA(0, IDC_ARROW); | |
| cls.hbrBackground = GetStockObject(WHITE_BRUSH); | |
| cls.lpszMenuName = NULL; | |
| cls.lpszClassName = "Tooltips test parent class"; | |
| return RegisterClassA(&cls); | |
| } | |
| static HWND create_parent_window(void) | |
| { | |
| if (!register_parent_wnd_class()) | |
| return NULL; | |
| return CreateWindowEx(0, "Tooltips test parent class", | |
| "Tooltips test parent window", | |
| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | | |
| WS_MAXIMIZEBOX | WS_VISIBLE, | |
| 0, 0, 100, 100, | |
| GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); | |
| } | |
| static void test_gettext(void) | |
| { | |
| HWND hwnd, notify; | |
| TTTOOLINFOA toolinfoA; | |
| TTTOOLINFOW toolinfoW; | |
| LRESULT r; | |
| CHAR bufA[10] = ""; | |
| WCHAR bufW[10] = { 0 }; | |
| static const CHAR testtipA[] = "testtip"; | |
| notify = create_parent_window(); | |
| ok(notify != NULL, "Expected notification window to be created\n"); | |
| /* For bug 14790 - lpszText is NULL */ | |
| hwnd = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, 0, | |
| 10, 10, 300, 100, | |
| NULL, NULL, NULL, 0); | |
| assert(hwnd); | |
| /* use sizeof(TTTOOLINFOA) instead of TTTOOLINFOA_V1_SIZE so that adding it fails on Win9x */ | |
| /* otherwise it crashes on the NULL lpszText */ | |
| toolinfoA.cbSize = sizeof(TTTOOLINFOA); | |
| toolinfoA.hwnd = NULL; | |
| toolinfoA.hinst = GetModuleHandleA(NULL); | |
| toolinfoA.uFlags = 0; | |
| toolinfoA.uId = 0x1234ABCD; | |
| toolinfoA.lpszText = NULL; | |
| toolinfoA.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &toolinfoA.rect); | |
| r = SendMessageA(hwnd, TTM_ADDTOOL, 0, (LPARAM)&toolinfoA); | |
| if (r) | |
| { | |
| toolinfoA.hwnd = NULL; | |
| toolinfoA.uId = 0x1234ABCD; | |
| toolinfoA.lpszText = bufA; | |
| SendMessageA(hwnd, TTM_GETTEXTA, 0, (LPARAM)&toolinfoA); | |
| ok(strcmp(toolinfoA.lpszText, "") == 0, "lpszText should be an empty string\n"); | |
| } | |
| else | |
| { | |
| win_skip( "Old comctl32, not testing NULL text\n" ); | |
| DestroyWindow( hwnd ); | |
| return; | |
| } | |
| /* add another tool with text */ | |
| toolinfoA.cbSize = sizeof(TTTOOLINFOA); | |
| toolinfoA.hwnd = NULL; | |
| toolinfoA.hinst = GetModuleHandleA(NULL); | |
| toolinfoA.uFlags = 0; | |
| toolinfoA.uId = 0x1235ABCD; | |
| strcpy(bufA, testtipA); | |
| toolinfoA.lpszText = bufA; | |
| toolinfoA.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &toolinfoA.rect); | |
| r = SendMessageA(hwnd, TTM_ADDTOOL, 0, (LPARAM)&toolinfoA); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| if (r) | |
| { | |
| DWORD length; | |
| length = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0); | |
| ok(length == 0, "Expected 0, got %d\n", length); | |
| toolinfoA.hwnd = NULL; | |
| toolinfoA.uId = 0x1235ABCD; | |
| toolinfoA.lpszText = bufA; | |
| SendMessageA(hwnd, TTM_GETTEXTA, 0, (LPARAM)&toolinfoA); | |
| ok(strcmp(toolinfoA.lpszText, testtipA) == 0, "lpszText should be an empty string\n"); | |
| length = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0); | |
| ok(length == 0, "Expected 0, got %d\n", length); | |
| } | |
| /* add another with callback text */ | |
| toolinfoA.cbSize = sizeof(TTTOOLINFOA); | |
| toolinfoA.hwnd = notify; | |
| toolinfoA.hinst = GetModuleHandleA(NULL); | |
| toolinfoA.uFlags = 0; | |
| toolinfoA.uId = 0x1236ABCD; | |
| toolinfoA.lpszText = LPSTR_TEXTCALLBACKA; | |
| toolinfoA.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &toolinfoA.rect); | |
| r = SendMessageA(hwnd, TTM_ADDTOOL, 0, (LPARAM)&toolinfoA); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| if (r) | |
| { | |
| toolinfoA.hwnd = notify; | |
| toolinfoA.uId = 0x1236ABCD; | |
| toolinfoA.lpszText = bufA; | |
| SendMessageA(hwnd, TTM_GETTEXTA, 0, (LPARAM)&toolinfoA); | |
| ok(strcmp(toolinfoA.lpszText, testcallbackA) == 0, | |
| "lpszText should be an (%s) string\n", testcallbackA); | |
| } | |
| DestroyWindow(hwnd); | |
| DestroyWindow(notify); | |
| SetLastError(0xdeadbeef); | |
| hwnd = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL, 0, | |
| 10, 10, 300, 100, | |
| NULL, NULL, NULL, 0); | |
| if (!hwnd && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { | |
| win_skip("CreateWindowExW is not implemented\n"); | |
| return; | |
| } | |
| assert(hwnd); | |
| toolinfoW.cbSize = sizeof(TTTOOLINFOW); | |
| toolinfoW.hwnd = NULL; | |
| toolinfoW.hinst = GetModuleHandleA(NULL); | |
| toolinfoW.uFlags = 0; | |
| toolinfoW.uId = 0x1234ABCD; | |
| toolinfoW.lpszText = NULL; | |
| toolinfoW.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &toolinfoW.rect); | |
| r = SendMessageW(hwnd, TTM_ADDTOOL, 0, (LPARAM)&toolinfoW); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| if (0) /* crashes on NT4 */ | |
| { | |
| toolinfoW.hwnd = NULL; | |
| toolinfoW.uId = 0x1234ABCD; | |
| toolinfoW.lpszText = bufW; | |
| SendMessageW(hwnd, TTM_GETTEXTW, 0, (LPARAM)&toolinfoW); | |
| ok(toolinfoW.lpszText[0] == 0, "lpszText should be an empty string\n"); | |
| } | |
| DestroyWindow(hwnd); | |
| } | |
| static void test_ttm_gettoolinfo(void) | |
| { | |
| TTTOOLINFOA ti; | |
| TTTOOLINFOW tiW; | |
| HWND hwnd; | |
| DWORD r; | |
| hwnd = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, 0, | |
| 10, 10, 300, 100, | |
| NULL, NULL, NULL, 0); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE; | |
| ti.hwnd = NULL; | |
| ti.hinst = GetModuleHandleA(NULL); | |
| ti.uFlags = 0; | |
| ti.uId = 0x1234ABCD; | |
| ti.lpszText = NULL; | |
| ti.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &ti.rect); | |
| r = SendMessageA(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE; | |
| ti.lParam = 0xaaaaaaaa; | |
| r = SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&ti); | |
| ok(r, "Getting tooltip info failed\n"); | |
| ok(0xdeadbeef == ti.lParam || | |
| broken(0xdeadbeef != ti.lParam), /* comctl32 < 5.81 */ | |
| "Expected 0xdeadbeef, got %lx\n", ti.lParam); | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE; | |
| tiW.hwnd = NULL; | |
| tiW.uId = 0x1234ABCD; | |
| tiW.lParam = 0xaaaaaaaa; | |
| r = SendMessageA(hwnd, TTM_GETTOOLINFOW, 0, (LPARAM)&tiW); | |
| ok(r, "Getting tooltip info failed\n"); | |
| ok(0xdeadbeef == tiW.lParam || | |
| broken(0xdeadbeef != tiW.lParam), /* comctl32 < 5.81 */ | |
| "Expected 0xdeadbeef, got %lx\n", tiW.lParam); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE; | |
| ti.uId = 0x1234ABCD; | |
| ti.lParam = 0xaaaaaaaa; | |
| SendMessageA(hwnd, TTM_SETTOOLINFOA, 0, (LPARAM)&ti); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE; | |
| ti.lParam = 0xdeadbeef; | |
| r = SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&ti); | |
| ok(r, "Getting tooltip info failed\n"); | |
| ok(0xaaaaaaaa == ti.lParam || | |
| broken(0xaaaaaaaa != ti.lParam), /* comctl32 < 5.81 */ | |
| "Expected 0xaaaaaaaa, got %lx\n", ti.lParam); | |
| DestroyWindow(hwnd); | |
| /* 1. test size parameter validation rules (ansi messages) */ | |
| hwnd = CreateWindowExA(0, TOOLTIPS_CLASSA, NULL, 0, | |
| 10, 10, 300, 100, | |
| NULL, NULL, NULL, 0); | |
| ti.cbSize = TTTOOLINFOA_V1_SIZE - 1; | |
| ti.hwnd = NULL; | |
| ti.hinst = GetModuleHandleA(NULL); | |
| ti.uFlags = 0; | |
| ti.uId = 0x1234ABCD; | |
| ti.lpszText = NULL; | |
| ti.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &ti.rect); | |
| r = SendMessage(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| ti.cbSize = TTTOOLINFOA_V1_SIZE - 1; | |
| ti.hwnd = NULL; | |
| ti.uId = 0x1234ABCD; | |
| SendMessage(hwnd, TTM_DELTOOLA, 0, (LPARAM)&ti); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE - 1; | |
| ti.hwnd = NULL; | |
| ti.hinst = GetModuleHandleA(NULL); | |
| ti.uFlags = 0; | |
| ti.uId = 0x1234ABCD; | |
| ti.lpszText = NULL; | |
| ti.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &ti.rect); | |
| r = SendMessage(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE - 1; | |
| ti.hwnd = NULL; | |
| ti.uId = 0x1234ABCD; | |
| SendMessage(hwnd, TTM_DELTOOLA, 0, (LPARAM)&ti); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE + 1; | |
| ti.hwnd = NULL; | |
| ti.hinst = GetModuleHandleA(NULL); | |
| ti.uFlags = 0; | |
| ti.uId = 0x1234ABCD; | |
| ti.lpszText = NULL; | |
| ti.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &ti.rect); | |
| r = SendMessage(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| ti.cbSize = TTTOOLINFOA_V2_SIZE + 1; | |
| ti.hwnd = NULL; | |
| ti.uId = 0x1234ABCD; | |
| SendMessage(hwnd, TTM_DELTOOLA, 0, (LPARAM)&ti); | |
| r = SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| DestroyWindow(hwnd); | |
| /* 2. test size parameter validation rules (w-messages) */ | |
| hwnd = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL, 0, | |
| 10, 10, 300, 100, | |
| NULL, NULL, NULL, 0); | |
| if(!hwnd) | |
| { | |
| win_skip("CreateWindowExW() not supported. Skipping.\n"); | |
| return; | |
| } | |
| tiW.cbSize = TTTOOLINFOW_V1_SIZE - 1; | |
| tiW.hwnd = NULL; | |
| tiW.hinst = GetModuleHandleA(NULL); | |
| tiW.uFlags = 0; | |
| tiW.uId = 0x1234ABCD; | |
| tiW.lpszText = NULL; | |
| tiW.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &tiW.rect); | |
| r = SendMessageW(hwnd, TTM_ADDTOOLW, 0, (LPARAM)&tiW); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| tiW.cbSize = TTTOOLINFOW_V1_SIZE - 1; | |
| tiW.hwnd = NULL; | |
| tiW.uId = 0x1234ABCD; | |
| SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&tiW); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE - 1; | |
| tiW.hwnd = NULL; | |
| tiW.hinst = GetModuleHandleA(NULL); | |
| tiW.uFlags = 0; | |
| tiW.uId = 0x1234ABCD; | |
| tiW.lpszText = NULL; | |
| tiW.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &tiW.rect); | |
| r = SendMessageW(hwnd, TTM_ADDTOOLW, 0, (LPARAM)&tiW); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE - 1; | |
| tiW.hwnd = NULL; | |
| tiW.uId = 0x1234ABCD; | |
| SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&tiW); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE + 1; | |
| tiW.hwnd = NULL; | |
| tiW.hinst = GetModuleHandleA(NULL); | |
| tiW.uFlags = 0; | |
| tiW.uId = 0x1234ABCD; | |
| tiW.lpszText = NULL; | |
| tiW.lParam = 0xdeadbeef; | |
| GetClientRect(hwnd, &tiW.rect); | |
| r = SendMessageW(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&tiW); | |
| ok(r, "Adding the tool to the tooltip failed\n"); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| /* looks like TTM_DELTOOLW doesn't work with invalid size */ | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE + 1; | |
| tiW.hwnd = NULL; | |
| tiW.uId = 0x1234ABCD; | |
| SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&tiW); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(1, r); | |
| tiW.cbSize = TTTOOLINFOW_V2_SIZE; | |
| tiW.hwnd = NULL; | |
| tiW.uId = 0x1234ABCD; | |
| SendMessageW(hwnd, TTM_DELTOOLW, 0, (LPARAM)&tiW); | |
| r = SendMessageW(hwnd, TTM_GETTOOLCOUNT, 0, 0); | |
| expect(0, r); | |
| DestroyWindow(hwnd); | |
| } | |
| START_TEST(tooltips) | |
| { | |
| InitCommonControls(); | |
| test_create_tooltip(); | |
| test_customdraw(); | |
| test_gettext(); | |
| test_ttm_gettoolinfo(); | |
| } |