Send notifies after invalidating changed areas.
Don't use custom draw returned colors for control.

diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 2a213fc..ef64759 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -657,8 +657,6 @@
                           (WPARAM)nmcd->hdr.idFrom,
 			  (LPARAM)&nmcdhdr);
 
-    infoPtr->clrText = nmcdhdr.clrText;
-    infoPtr->clrBk = nmcdhdr.clrTextBk;
     return (BOOL)retval;
 }
 
@@ -4220,14 +4218,17 @@
 
 	TREEVIEW_EnsureVisible(infoPtr, infoPtr->selectedItem, FALSE);
 
+	if (prevSelect)
+	    TREEVIEW_Invalidate(infoPtr, prevSelect);
+	if (newSelect)
+	    TREEVIEW_Invalidate(infoPtr, newSelect);
+
 	TREEVIEW_SendTreeviewNotify(infoPtr,
 				    TVN_SELCHANGEDW,
 				    cause,
 				    TVIF_HANDLE | TVIF_STATE | TVIF_PARAM,
 				    prevSelect,
 				    newSelect);
-	TREEVIEW_Invalidate(infoPtr, prevSelect);
-	TREEVIEW_Invalidate(infoPtr, newSelect);
 	break;
 
     case TVGN_DROPHILITE:
@@ -5304,8 +5305,8 @@
 			      TVC_UNKNOWN);
     }
 
-    TREEVIEW_SendSimpleNotify(infoPtr, NM_SETFOCUS);
     TREEVIEW_Invalidate(infoPtr, infoPtr->selectedItem);
+    TREEVIEW_SendSimpleNotify(infoPtr, NM_SETFOCUS);
     return 0;
 }
 
@@ -5314,8 +5315,9 @@
 {
     TRACE("\n");
 
-    TREEVIEW_SendSimpleNotify(infoPtr, NM_KILLFOCUS);
     TREEVIEW_Invalidate(infoPtr, infoPtr->selectedItem);
+    UpdateWindow(infoPtr->hwnd);
+    TREEVIEW_SendSimpleNotify(infoPtr, NM_KILLFOCUS);
     return 0;
 }