comctl32: TTM_SETTOOLINFO does not change subclassing flags.
This commit is contained in:
parent
4b86f13ade
commit
aba3b131bc
@ -839,6 +839,154 @@ static void test_track(void)
|
|||||||
DestroyWindow(parent);
|
DestroyWindow(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LRESULT CALLBACK info_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch(msg) {
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return DefWindowProcA(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_setinfo(void)
|
||||||
|
{
|
||||||
|
WNDCLASSA wc;
|
||||||
|
LRESULT lResult;
|
||||||
|
HWND parent, parent2, hwndTip, hwndTip2;
|
||||||
|
TTTOOLINFOA toolInfo = { 0 };
|
||||||
|
TTTOOLINFOA toolInfo2 = { 0 };
|
||||||
|
WNDPROC wndProc;
|
||||||
|
|
||||||
|
/* 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, (LPCSTR)IDC_ARROW);
|
||||||
|
wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
|
||||||
|
wc.lpszMenuName = NULL;
|
||||||
|
wc.lpszClassName = "SetInfoClass";
|
||||||
|
wc.lpfnWndProc = info_wnd_proc;
|
||||||
|
RegisterClassA(&wc);
|
||||||
|
|
||||||
|
/* Create a main window */
|
||||||
|
parent = CreateWindowExA(0, "SetInfoClass", 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");
|
||||||
|
|
||||||
|
parent2 = CreateWindowExA(0, "SetInfoClass", NULL,
|
||||||
|
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
|
||||||
|
WS_MAXIMIZEBOX | WS_VISIBLE,
|
||||||
|
50, 50,
|
||||||
|
300, 300,
|
||||||
|
NULL, NULL, NULL, 0);
|
||||||
|
ok(parent2 != NULL, "Creation of main window failed\n");
|
||||||
|
|
||||||
|
/* Make it show */
|
||||||
|
ShowWindow(parent2, SW_SHOWNORMAL);
|
||||||
|
flush_events(100);
|
||||||
|
|
||||||
|
/* Create Tooltip */
|
||||||
|
hwndTip = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA,
|
||||||
|
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");
|
||||||
|
|
||||||
|
hwndTip2 = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA,
|
||||||
|
NULL, TTS_NOPREFIX | TTS_ALWAYSTIP,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||||
|
parent, NULL, GetModuleHandleA(NULL), 0);
|
||||||
|
ok(hwndTip2 != NULL, "Creation of tooltip window failed\n");
|
||||||
|
|
||||||
|
|
||||||
|
/* 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 = TTTOOLINFOA_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 = SendMessageA(hwndTip, TTM_ADDTOOLA, 0, (LPARAM)&toolInfo);
|
||||||
|
ok(lResult, "Adding the tool to the tooltip failed\n");
|
||||||
|
|
||||||
|
toolInfo.cbSize = TTTOOLINFOA_V1_SIZE;
|
||||||
|
toolInfo.hwnd = parent2;
|
||||||
|
toolInfo.hinst = GetModuleHandleA(NULL);
|
||||||
|
toolInfo.uFlags = 0;
|
||||||
|
toolInfo.uId = 0x1234ABCE;
|
||||||
|
toolInfo.lpszText = (LPSTR)"This is a test tooltip";
|
||||||
|
toolInfo.lParam = 0xdeadbeef;
|
||||||
|
GetClientRect (parent, &toolInfo.rect);
|
||||||
|
lResult = SendMessageA(hwndTip, TTM_ADDTOOLA, 0, (LPARAM)&toolInfo);
|
||||||
|
ok(lResult, "Adding the tool to the tooltip failed\n");
|
||||||
|
|
||||||
|
/* Try to Remove Subclass */
|
||||||
|
toolInfo2.cbSize = TTTOOLINFOA_V1_SIZE;
|
||||||
|
toolInfo2.hwnd = parent;
|
||||||
|
toolInfo2.uId = 0x1234ABCD;
|
||||||
|
lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
ok(lResult, "GetToolInfo failed\n");
|
||||||
|
ok(toolInfo2.uFlags & TTF_SUBCLASS, "uFlags does not have subclass\n");
|
||||||
|
wndProc = (WNDPROC)GetWindowLongPtrA(parent, GWLP_WNDPROC);
|
||||||
|
ok (wndProc != info_wnd_proc, "Window Proc is wrong\n");
|
||||||
|
|
||||||
|
toolInfo2.uFlags &= ~TTF_SUBCLASS;
|
||||||
|
SendMessageA(hwndTip, TTM_SETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
ok(lResult, "GetToolInfo failed\n");
|
||||||
|
ok(!(toolInfo2.uFlags & TTF_SUBCLASS), "uFlags has subclass\n");
|
||||||
|
wndProc = (WNDPROC)GetWindowLongPtrA(parent, GWLP_WNDPROC);
|
||||||
|
ok (wndProc != info_wnd_proc, "Window Proc is wrong\n");
|
||||||
|
|
||||||
|
/* Try to Add Subclass */
|
||||||
|
|
||||||
|
/* Make it topmost, as per the MSDN */
|
||||||
|
SetWindowPos(hwndTip2, HWND_TOPMOST, 0, 0, 0, 0,
|
||||||
|
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||||
|
|
||||||
|
toolInfo2.cbSize = TTTOOLINFOA_V1_SIZE;
|
||||||
|
toolInfo2.hwnd = parent2;
|
||||||
|
toolInfo2.uId = 0x1234ABCE;
|
||||||
|
lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
ok(lResult, "GetToolInfo failed\n");
|
||||||
|
ok(!(toolInfo2.uFlags & TTF_SUBCLASS), "uFlags has subclass\n");
|
||||||
|
wndProc = (WNDPROC)GetWindowLongPtrA(parent2, GWLP_WNDPROC);
|
||||||
|
ok (wndProc == info_wnd_proc, "Window Proc is wrong\n");
|
||||||
|
|
||||||
|
toolInfo2.uFlags |= TTF_SUBCLASS;
|
||||||
|
SendMessageA(hwndTip, TTM_SETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
|
||||||
|
ok(lResult, "GetToolInfo failed\n");
|
||||||
|
ok(toolInfo2.uFlags & TTF_SUBCLASS, "uFlags does not have subclass\n");
|
||||||
|
wndProc = (WNDPROC)GetWindowLongPtrA(parent2, GWLP_WNDPROC);
|
||||||
|
ok (wndProc == info_wnd_proc, "Window Proc is wrong\n");
|
||||||
|
|
||||||
|
/* Clean up */
|
||||||
|
DestroyWindow(hwndTip);
|
||||||
|
DestroyWindow(hwndTip2);
|
||||||
|
DestroyWindow(parent);
|
||||||
|
DestroyWindow(parent2);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(tooltips)
|
START_TEST(tooltips)
|
||||||
{
|
{
|
||||||
InitCommonControls();
|
InitCommonControls();
|
||||||
@ -850,4 +998,5 @@ START_TEST(tooltips)
|
|||||||
test_longtextA();
|
test_longtextA();
|
||||||
test_longtextW();
|
test_longtextW();
|
||||||
test_track();
|
test_track();
|
||||||
|
test_setinfo();
|
||||||
}
|
}
|
||||||
|
@ -111,6 +111,7 @@ static HICON hTooltipIcons[TTI_ERROR+1];
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UINT uFlags;
|
UINT uFlags;
|
||||||
|
UINT uInternalFlags;
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
BOOL bNotifyUnicode;
|
BOOL bNotifyUnicode;
|
||||||
UINT_PTR uId;
|
UINT_PTR uId;
|
||||||
@ -1058,6 +1059,7 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
|
|||||||
|
|
||||||
/* copy tool data */
|
/* copy tool data */
|
||||||
toolPtr->uFlags = ti->uFlags;
|
toolPtr->uFlags = ti->uFlags;
|
||||||
|
toolPtr->uInternalFlags = (ti->uFlags & (TTF_SUBCLASS | TTF_IDISHWND));
|
||||||
toolPtr->hwnd = ti->hwnd;
|
toolPtr->hwnd = ti->hwnd;
|
||||||
toolPtr->uId = ti->uId;
|
toolPtr->uId = ti->uId;
|
||||||
toolPtr->rect = ti->rect;
|
toolPtr->rect = ti->rect;
|
||||||
@ -1092,8 +1094,8 @@ TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
|
|||||||
toolPtr->lParam = ti->lParam;
|
toolPtr->lParam = ti->lParam;
|
||||||
|
|
||||||
/* install subclassing hook */
|
/* install subclassing hook */
|
||||||
if (toolPtr->uFlags & TTF_SUBCLASS) {
|
if (toolPtr->uInternalFlags & TTF_SUBCLASS) {
|
||||||
if (toolPtr->uFlags & TTF_IDISHWND) {
|
if (toolPtr->uInternalFlags & TTF_IDISHWND) {
|
||||||
SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
|
SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
|
||||||
(DWORD_PTR)infoPtr->hwndSelf);
|
(DWORD_PTR)infoPtr->hwndSelf);
|
||||||
}
|
}
|
||||||
@ -1152,8 +1154,8 @@ TOOLTIPS_DelToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* remove subclassing */
|
/* remove subclassing */
|
||||||
if (toolPtr->uFlags & TTF_SUBCLASS) {
|
if (toolPtr->uInternalFlags & TTF_SUBCLASS) {
|
||||||
if (toolPtr->uFlags & TTF_IDISHWND) {
|
if (toolPtr->uInternalFlags & TTF_IDISHWND) {
|
||||||
RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
|
RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1918,8 +1920,8 @@ TOOLTIPS_Destroy (TOOLTIPS_INFO *infoPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* remove subclassing */
|
/* remove subclassing */
|
||||||
if (toolPtr->uFlags & TTF_SUBCLASS) {
|
if (toolPtr->uInternalFlags & TTF_SUBCLASS) {
|
||||||
if (toolPtr->uFlags & TTF_IDISHWND) {
|
if (toolPtr->uInternalFlags & TTF_IDISHWND) {
|
||||||
RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
|
RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user