static HWND create_button(DWORD style, HWND parent) { HMENU menuid = 0; HWND hwnd; if (parent) { style |= WS_CHILD|BS_NOTIFY; menuid = (HMENU)ID_BUTTON; } hwnd = CreateWindowExA(0, "Button", "test", style, 0, 0, 50, 14, parent, menuid, 0, NULL); ok(hwnd != NULL, "failed to create a button, 0x%08x, %p\n", style, parent); pSetWindowSubclass(hwnd, button_subclass_proc, 0, 0); return hwnd; }
static void test_subclass(void) { HWND hwnd = CreateWindowExA(0, "TestSubclass", "Test subclass", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); assert(hwnd); pSetWindowSubclass(hwnd, WndProcSub, 2, 0); SendMessage(hwnd, WM_USER, 1, 0); SendMessage(hwnd, WM_USER, 2, 0); ok_sequence(Sub_BasicTest, "Basic"); pSetWindowSubclass(hwnd, WndProcSub, 2, DELETE_SELF); SendMessage(hwnd, WM_USER, 1, 1); ok_sequence(Sub_DeletedTest, "Deleted"); SendMessage(hwnd, WM_USER, 1, 0); ok_sequence(Sub_AfterDeletedTest, "After Deleted"); pSetWindowSubclass(hwnd, WndProcSub, 2, 0); origProc3 = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WndProc3); SendMessage(hwnd, WM_USER, 1, 0); SendMessage(hwnd, WM_USER, 2, 0); ok_sequence(Sub_OldAfterNewTest, "Old after New"); pSetWindowSubclass(hwnd, WndProcSub, 4, 0); SendMessage(hwnd, WM_USER, 1, 0); ok_sequence(Sub_MixTest, "Mix"); /* Now the fun starts */ pSetWindowSubclass(hwnd, WndProcSub, 4, SEND_NEST); SendMessage(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixAndNestTest, "Mix and nest"); pSetWindowSubclass(hwnd, WndProcSub, 4, SEND_NEST | DELETE_SELF); SendMessage(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixNestDelTest, "Mix, nest, del"); pSetWindowSubclass(hwnd, WndProcSub, 4, 0); pSetWindowSubclass(hwnd, WndProcSub, 5, DELETE_PREV); SendMessage(hwnd, WM_USER, 1, 1); ok_sequence(Sub_MixDelPrevTest, "Mix and del prev"); DestroyWindow(hwnd); }