With regard to my problem that I was getting infinite redraws in my listview following Alexandre's change to server/user/message.c:
I eventually tracked it down to the fact our code used SetRedraw(FALSE)/SetRedraw(TRUE) on a list control. (So the bug can now be demonstrated easily on e.g. the MFC RowList sample with a two-line change). Now I see that in the case of LISTVIEW_SetRedraw DefWindowProc is called and then RedrawWindow. In the TREEVIEW_SetRedraw case it simply sets a flag within the treeview's data.
Which is (more) correct?
(And how does calling RedrawWindow once result in the repeated repainting of the treeview anyway?)
I'm prepared to do the fix if no-one else can but I must admit that I am not really up on the details of the invalidation/paint etc
Bill