comctl32/listview: Issue LVM_DELETEALLITEMS from WM_DESTROY.

This commit is contained in:
Jason Edmeades 2010-01-13 14:51:01 -08:00 committed by Alexandre Julliard
parent 44ab484af8
commit 81d8135424
2 changed files with 34 additions and 5 deletions

View file

@ -9188,10 +9188,14 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
* Success: 0
* Failure: -1
*/
static LRESULT LISTVIEW_Destroy(const LISTVIEW_INFO *infoPtr)
static LRESULT LISTVIEW_Destroy(LISTVIEW_INFO *infoPtr)
{
HTHEME theme = GetWindowTheme(infoPtr->hwndSelf);
CloseThemeData(theme);
/* delete all items */
LISTVIEW_DeleteAllItems(infoPtr, TRUE);
return 0;
}
@ -9923,9 +9927,6 @@ static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
TRACE("()\n");
/* delete all items */
LISTVIEW_DeleteAllItems(infoPtr, TRUE);
/* destroy data structure */
DPA_Destroy(infoPtr->hdpaItems);
DPA_Destroy(infoPtr->hdpaItemIds);

View file

@ -32,7 +32,8 @@
#define PARENT_FULL_SEQ_INDEX 1
#define LISTVIEW_SEQ_INDEX 2
#define EDITBOX_SEQ_INDEX 3
#define NUM_MSG_SEQUENCES 4
#define COMBINED_SEQ_INDEX 4
#define NUM_MSG_SEQUENCES 5
#define LISTVIEW_ID 0
#define HEADER_ID 1
@ -286,6 +287,18 @@ static const struct message hover_parent[] = {
{ 0 }
};
static const struct message listview_destroy[] = {
{ 0x0090, sent|optional }, /* Vista */
{ WM_PARENTNOTIFY, sent },
{ WM_SHOWWINDOW, sent },
{ WM_WINDOWPOSCHANGING, sent },
{ WM_WINDOWPOSCHANGED, sent|optional },
{ WM_DESTROY, sent },
{ WM_NOTIFY, sent|id, 0, 0, LVN_DELETEALLITEMS },
{ WM_NCDESTROY, sent },
{ 0 }
};
static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static LONG defwndproc_counter = 0;
@ -312,6 +325,7 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP
trace("parent: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam);
add_message(sequences, PARENT_SEQ_INDEX, &msg);
add_message(sequences, COMBINED_SEQ_INDEX, &msg);
}
add_message(sequences, PARENT_FULL_SEQ_INDEX, &msg);
@ -460,6 +474,7 @@ static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wPa
msg.lParam = lParam;
msg.id = LISTVIEW_ID;
add_message(sequences, LISTVIEW_SEQ_INDEX, &msg);
add_message(sequences, COMBINED_SEQ_INDEX, &msg);
defwndproc_counter++;
ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
@ -4263,6 +4278,18 @@ static void test_hover(void)
DestroyWindow(hwnd);
}
static void test_destroynotify(void)
{
HWND hwnd;
hwnd = create_listview_control(LVS_REPORT);
ok(hwnd != NULL, "failed to create listview window\n");
flush_sequences(sequences, NUM_MSG_SEQUENCES);
DestroyWindow(hwnd);
ok_sequence(sequences, COMBINED_SEQ_INDEX, listview_destroy, "check destroy order", FALSE);
}
START_TEST(listview)
{
HMODULE hComctl32;
@ -4323,6 +4350,7 @@ START_TEST(listview)
test_approximate_viewrect();
test_finditem();
test_hover();
test_destroynotify();
if (!load_v6_module(&ctx_cookie, &hCtx))
{