comctl32: handle the notification window properly

Dimitrie O. Paun dpaun at rogers.com
Thu Nov 20 13:37:55 CST 2003


And here is a rollup patch with all of the different individual
patches I've sent yesterday, in case you prefer them this way.

ChangeLog
    Make the controls send notifications to the parent window passed
    to it in CREATESTRUCT.  Based on a treeview patch by Igor Grahek.

Index: dlls/comctl32/animate.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/animate.c,v
retrieving revision 1.51
diff -u -r1.51 animate.c
--- dlls/comctl32/animate.c	22 Sep 2003 21:32:34 -0000	1.51
+++ dlls/comctl32/animate.c	19 Nov 2003 05:06:31 -0000
@@ -57,7 +57,8 @@
    /* reference to input stream (file or resource) */
    HGLOBAL 		hRes;
    HMMIO		hMMio;	/* handle to mmio stream */
-   HWND			hWnd;
+   HWND			hwndSelf;
+   HWND			hwndNotify;
    /* information on the loaded AVI file */
    MainAVIHeader	mah;
    AVIStreamHeader	ash;
@@ -88,9 +89,9 @@
 
 static void ANIMATE_Notify(ANIMATE_INFO* infoPtr, UINT notif)
 {
-    SendMessageA(GetParent(infoPtr->hWnd), WM_COMMAND,
-		 MAKEWPARAM(GetDlgCtrlID(infoPtr->hWnd), notif),
-		 (LPARAM)infoPtr->hWnd);
+    SendMessageA(infoPtr->hwndNotify, WM_COMMAND,
+		 MAKEWPARAM(GetDlgCtrlID(infoPtr->hwndSelf), notif),
+		 (LPARAM)infoPtr->hwndSelf);
 }
 
 static BOOL ANIMATE_LoadResA(ANIMATE_INFO *infoPtr, HINSTANCE hInst, LPSTR lpName)
@@ -149,7 +150,7 @@
 	    infoPtr->hThread = 0;
     }
     if (infoPtr->uTimer) {
-	KillTimer(infoPtr->hWnd, infoPtr->uTimer);
+	KillTimer(infoPtr->hwndSelf, infoPtr->uTimer);
 	infoPtr->uTimer = 0;
     }
 
@@ -202,7 +203,7 @@
             infoPtr->hbmPrevFrame = 0;
         }
 	infoPtr->indata = infoPtr->outdata = NULL;
-	infoPtr->hWnd = 0;
+	infoPtr->hwndSelf = 0;
 	infoPtr->hMMio = 0;
 
 	memset(&infoPtr->mah, 0, sizeof(infoPtr->mah));
@@ -297,7 +298,7 @@
         infoPtr->transparentColor = GetPixel(hdcMem,0,0);
     }
 
-    if(GetWindowLongA(infoPtr->hWnd, GWL_STYLE) & ACS_TRANSPARENT)
+    if(GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_TRANSPARENT)
     {
         HDC hdcFinal = CreateCompatibleDC(hDC);
         HBITMAP hbmFinal = CreateCompatibleBitmap(hDC,nWidth, nHeight);
@@ -322,11 +323,11 @@
         infoPtr->hbmPrevFrame = hbmFinal;
          }
 
-    if (GetWindowLongA(infoPtr->hWnd, GWL_STYLE) & ACS_CENTER)
+    if (GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_CENTER)
     {
        RECT rect;
 
-       GetWindowRect(infoPtr->hWnd, &rect);
+       GetWindowRect(infoPtr->hwndSelf, &rect);
        nOffsetX = ((rect.right - rect.left) - nWidth)/2;
        nOffsetY = ((rect.bottom - rect.top) - nHeight)/2;
     }
@@ -356,9 +357,9 @@
 	return FALSE;
     }
 
-    if ((hDC = GetDC(infoPtr->hWnd)) != 0) {
+    if ((hDC = GetDC(infoPtr->hwndSelf)) != 0) {
 	ANIMATE_PaintFrame(infoPtr, hDC);
-	ReleaseDC(infoPtr->hWnd, hDC);
+	ReleaseDC(infoPtr->hwndSelf, hDC);
     }
 
     if (infoPtr->currFrame++ >= infoPtr->nToFrame) {
@@ -387,15 +388,15 @@
 
     while(1)
     {
-        if(GetWindowLongA(infoPtr->hWnd, GWL_STYLE) & ACS_TRANSPARENT)
+        if(GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & ACS_TRANSPARENT)
         {
-            hDC = GetDC(infoPtr->hWnd);
+            hDC = GetDC(infoPtr->hwndSelf);
 	    /* sometimes the animation window will be destroyed in between
 	     * by the main program, so a ReleaseDC() error msg is possible */
-            infoPtr->hbrushBG = (HBRUSH)SendMessageA(GetParent(infoPtr->hWnd),
+            infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,
 					     WM_CTLCOLORSTATIC, (WPARAM)hDC,
-					     (LPARAM)infoPtr->hWnd);
-            ReleaseDC(infoPtr->hWnd,hDC);
+					     (LPARAM)infoPtr->hwndSelf);
+            ReleaseDC(infoPtr->hwndSelf,hDC);
         }
 
         EnterCriticalSection(&infoPtr->cs);
@@ -689,7 +690,7 @@
     HINSTANCE hInstance = (HINSTANCE)wParam;
 
     ANIMATE_Free(infoPtr);
-    infoPtr->hWnd = hWnd;
+    infoPtr->hwndSelf = hWnd;
 
     if (!lParam) {
 	TRACE("Closing avi!\n");
@@ -787,14 +788,15 @@
 	return 0;
     }
 
-    TRACE("Animate style=0x%08lx, parent=%08lx\n", GetWindowLongA(hWnd, GWL_STYLE), (DWORD)GetParent(hWnd));
-
     /* store crossref hWnd <-> info structure */
     SetWindowLongA(hWnd, 0, (DWORD)infoPtr);
-    infoPtr->hWnd = hWnd;
+    infoPtr->hwndSelf = hWnd;
+    infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
     infoPtr->transparentColor = ANIMATE_COLOR_NONE;
     infoPtr->hbmPrevFrame = 0;
 
+    TRACE("Animate style=0x%08lx, parent=%08lx\n", GetWindowLongA(hWnd, GWL_STYLE), (DWORD)infoPtr->hwndNotify);
+
     InitializeCriticalSection(&infoPtr->cs);
 
     return 0;
@@ -819,12 +821,13 @@
 
 static LRESULT ANIMATE_EraseBackground(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(hWnd);
     RECT rect;
     HBRUSH hBrush = 0;
 
     if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)
     {
-        hBrush = (HBRUSH)SendMessageA(GetParent(hWnd),WM_CTLCOLORSTATIC,
+        hBrush = (HBRUSH)SendMessageA(infoPtr->hwndNotify,WM_CTLCOLORSTATIC,
 				      wParam, (LPARAM)hWnd);
     }
 
@@ -882,7 +885,7 @@
     	if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)
         {
             ANIMATE_INFO* infoPtr = ANIMATE_GetInfoPtr(hWnd);
-            infoPtr->hbrushBG = (HBRUSH)SendMessageA(GetParent(hWnd),
+            infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,
 						     WM_CTLCOLORSTATIC,
 						     wParam, (LPARAM)hWnd);
         }
@@ -902,7 +905,7 @@
 	    	return DefWindowProcA(hWnd, uMsg, wParam, lParam);
 
             if (GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)
-                infoPtr->hbrushBG = (HBRUSH)SendMessageA(GetParent(hWnd),
+                infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,
 							 WM_CTLCOLORSTATIC,
 							 wParam, (LPARAM)hWnd);
 
Index: dlls/comctl32/comboex.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/comboex.c,v
retrieving revision 1.67
diff -u -r1.67 comboex.c
--- dlls/comctl32/comboex.c	22 Sep 2003 21:32:34 -0000	1.67
+++ dlls/comctl32/comboex.c	19 Nov 2003 05:07:08 -0000
@@ -64,6 +64,7 @@
 {
     HIMAGELIST   himl;
     HWND         hwndSelf;         /* my own hwnd */
+    HWND         hwndNotify;       /* my parent hwnd */
     HWND         hwndCombo;
     HWND         hwndEdit;
     WNDPROC      prevEditWndProc;  /* previous Edit WNDPROC value */
@@ -190,11 +191,9 @@
     hdr->hwndFrom = infoPtr->hwndSelf;
     hdr->code = code;
     if (infoPtr->NtfUnicode)
-	return SendMessageW (GetParent(infoPtr->hwndSelf), WM_NOTIFY, 0,
-			     (LPARAM)hdr);
+	return SendMessageW (infoPtr->hwndNotify, WM_NOTIFY, 0, (LPARAM)hdr);
     else
-	return SendMessageA (GetParent(infoPtr->hwndSelf), WM_NOTIFY, 0,
-			     (LPARAM)hdr);
+	return SendMessageA (infoPtr->hwndNotify, WM_NOTIFY, 0, (LPARAM)hdr);
 }
 
 
@@ -935,8 +934,9 @@
     infoPtr->selected = -1;
 
     infoPtr->unicode = IsWindowUnicode (hwnd);
+    infoPtr->hwndNotify = cs->hwndParent;
 
-    i = SendMessageW(GetParent (hwnd), WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
+    i = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
     if ((i != NFR_ANSI) && (i != NFR_UNICODE)) {
 	WARN("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n", i);
 	i = NFR_ANSI;
@@ -1079,7 +1079,7 @@
     INT cursel, n, oldItem;
     NMCBEENDEDITW cbeend;
     DWORD oldflags;
-    HWND parent = GetParent (infoPtr->hwndSelf);
+    HWND parent = infoPtr->hwndNotify;
 
     TRACE("for command %d\n", command);
 
@@ -1587,7 +1587,7 @@
 static LRESULT COMBOEX_NotifyFormat (COMBOEX_INFO *infoPtr, LPARAM lParam)
 {
     if (lParam == NF_REQUERY) {
-	INT i = SendMessageW(GetParent (infoPtr->hwndSelf),
+	INT i = SendMessageW(infoPtr->hwndNotify,
 			 WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
 	infoPtr->NtfUnicode = (i == NFR_UNICODE) ? 1 : 0;
     }
@@ -2070,7 +2070,7 @@
 		    /* strings not equal -- indicate edit has changed */
 		    infoPtr->flags |= WCBE_EDITCHG;
 		}
-		SendMessageW ( GetParent(infoPtr->hwndSelf), WM_COMMAND,
+		SendMessageW ( infoPtr->hwndNotify, WM_COMMAND,
 			       MAKEWPARAM(GetDlgCtrlID (infoPtr->hwndSelf),
 					  CBN_EDITCHANGE),
 			       (LPARAM)infoPtr->hwndSelf);
@@ -2236,9 +2236,9 @@
 
 	case WM_NOTIFY:
 	    if (infoPtr->NtfUnicode)
-		return SendMessageW (GetParent (hwnd), uMsg, wParam, lParam);
+		return SendMessageW (infoPtr->hwndNotify, uMsg, wParam, lParam);
 	    else
-		return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam);
+		return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam);
 
 
 /*   Window messages we need to process */
Index: dlls/comctl32/datetime.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/datetime.c,v
retrieving revision 1.41
diff -u -r1.41 datetime.c
--- dlls/comctl32/datetime.c	22 Sep 2003 21:32:34 -0000	1.41
+++ dlls/comctl32/datetime.c	3 Nov 2003 21:27:15 -0000
@@ -44,6 +44,7 @@
 typedef struct
 {
 	HWND hMonthCal;
+	HWND hwndNotify;
 	HWND hUpdown;
 	SYSTEMTIME date;
 	BOOL dateValid;
@@ -895,11 +896,8 @@
     else
         ShowWindow(infoPtr->hMonthCal, SW_SHOW);
 
-    TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p, mcpp:%p\n",
-              hwnd,infoPtr->hMonthCal,
-              GetParent (infoPtr->hMonthCal),
-              GetDesktopWindow (),
-              GetParent (GetParent (infoPtr->hMonthCal)));
+    TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p\n",
+           hwnd, infoPtr->hMonthCal, infoPtr->hwndNotify, GetDesktopWindow ());
     DATETIME_SendSimpleNotify (hwnd, DTN_DROPDOWN);
   }
 
@@ -1119,7 +1117,7 @@
    dtdtc.dwFlags = GDT_VALID;
 
  MONTHCAL_CopyTime (&infoPtr->date, &dtdtc.st);
- return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
+ return (BOOL) SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
                               (WPARAM)dtdtc.nmhdr.idFrom, (LPARAM)&dtdtc);
 }
 
@@ -1127,6 +1125,7 @@
 static BOOL
 DATETIME_SendSimpleNotify (HWND hwnd, UINT code)
 {
+    DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
     NMHDR nmhdr;
 
     TRACE("%x\n",code);
@@ -1134,7 +1133,7 @@
     nmhdr.idFrom   = GetWindowLongA( hwnd, GWL_ID);
     nmhdr.code     = code;
 
-    return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
+    return (BOOL) SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
                                 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
 }
 
@@ -1225,6 +1224,7 @@
   infoPtr->fieldRect = (RECT *) Alloc (32*sizeof(RECT));
   infoPtr->buflen = (int *) Alloc (32*sizeof(int));
   infoPtr->nrFieldsAllocated = 32;
+  infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
 
   DATETIME_SetFormat (hwnd, 0, 0);
 
@@ -1232,7 +1232,7 @@
     infoPtr->hMonthCal = CreateWindowExA (0,"SysMonthCal32", 0,
 	WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
 	0, 0, 0, 0,
-	GetParent(hwnd),
+	infoPtr->hwndNotify,
 	0, 0, 0);
 
   /* initialize info structure */
Index: dlls/comctl32/header.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/header.c,v
retrieving revision 1.61
diff -u -r1.61 header.c
--- dlls/comctl32/header.c	14 Oct 2003 20:13:42 -0000	1.61
+++ dlls/comctl32/header.c	3 Nov 2003 21:34:29 -0000
@@ -199,7 +199,7 @@
 	dis.rcItem     = r;
 	dis.itemData   = phdi->lParam;
         oldBkMode = SetBkMode(hdc, TRANSPARENT);
-	SendMessageA (GetParent (hwnd), WM_DRAWITEM,
+	SendMessageA (infoPtr->hwndNotify, WM_DRAWITEM,
 			(WPARAM)dis.CtlID, (LPARAM)&dis);
         if (oldBkMode != TRANSPARENT)
             SetBkMode(hdc, oldBkMode);
@@ -1287,7 +1287,7 @@
     infoPtr = (HEADER_INFO *)Alloc (sizeof(HEADER_INFO));
     SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
 
-    infoPtr->hwndNotify = GetParent(hwnd);
+    infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
     infoPtr->uNumItem = 0;
     infoPtr->hFont = 0;
     infoPtr->items = 0;
Index: dlls/comctl32/hotkey.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/hotkey.c,v
retrieving revision 1.27
diff -u -r1.27 hotkey.c
--- dlls/comctl32/hotkey.c	22 Sep 2003 21:32:34 -0000	1.27
+++ dlls/comctl32/hotkey.c	19 Nov 2003 02:38:57 -0000
@@ -38,6 +38,7 @@
 typedef struct tagHOTKEY_INFO
 {
     HWND  hwndSelf;
+    HWND  hwndNotify;
     HFONT hFont;
     BOOL  bFocus;
     INT   nHeight;
@@ -222,6 +223,7 @@
     infoPtr->HotKey = infoPtr->InvComb = infoPtr->InvMod = infoPtr->CurrMod = 0;
     infoPtr->CaretPos = 2;
     infoPtr->hwndSelf = hwnd;
+    infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
     LoadStringW(COMCTL32_hModule, HKY_NONE, infoPtr->strNone, 15);
 
     /* get default font height */
@@ -252,7 +254,7 @@
     RECT   rc;
 
     hBrush =
-	(HBRUSH)SendMessageW (GetParent (infoPtr->hwndSelf), WM_CTLCOLOREDIT,
+	(HBRUSH)SendMessageW (infoPtr->hwndNotify, WM_CTLCOLOREDIT,
 				wParam, (LPARAM)infoPtr->hwndSelf);
     if (hBrush)
 	hBrush = (HBRUSH)GetStockObject (WHITE_BRUSH);
Index: dlls/comctl32/ipaddress.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/ipaddress.c,v
retrieving revision 1.34
diff -u -r1.34 ipaddress.c
--- dlls/comctl32/ipaddress.c	22 Sep 2003 21:32:33 -0000	1.34
+++ dlls/comctl32/ipaddress.c	3 Nov 2003 21:04:14 -0000
@@ -61,6 +61,7 @@
 typedef struct
 {
     HWND	Self;
+    HWND	Notify;
     IPPART_INFO	Part[4];
 } IPADDRESS_INFO;
 
@@ -82,7 +83,7 @@
 
     TRACE("(command=%x)\n", command);
 
-    return SendMessageW (GetParent (hwnd), WM_COMMAND,
+    return SendMessageW (infoPtr->Notify, WM_COMMAND,
              MAKEWPARAM (GetWindowLongW (hwnd, GWL_ID), command), (LPARAM)hwnd);
 }
 
@@ -99,7 +100,7 @@
     nmip.iField = field;
     nmip.iValue = value;
 
-    SendMessageW (GetParent (infoPtr->Self), WM_NOTIFY,
+    SendMessageW (infoPtr->Notify, WM_NOTIFY,
                   (WPARAM)nmip.hdr.idFrom, (LPARAM)&nmip);
 
     TRACE("<-- %d\n", nmip.iValue);
@@ -149,7 +150,7 @@
 }
 
 
-static LRESULT IPADDRESS_Create (HWND hwnd)
+static LRESULT IPADDRESS_Create (HWND hwnd, LPCREATESTRUCTA lpCreate)
 {
     IPADDRESS_INFO *infoPtr;
     RECT rcClient, edit;
@@ -173,6 +174,7 @@
     edit.bottom = rcClient.bottom - 2;
 
     infoPtr->Self = hwnd;
+    infoPtr->Notify = lpCreate->hwndParent;
 
     for (i = 0; i < 4; i++) {
 	IPPART_INFO* part = &infoPtr->Part[i];
@@ -508,7 +510,7 @@
     switch (uMsg)
     {
 	case WM_CREATE:
-	    return IPADDRESS_Create (hwnd);
+	    return IPADDRESS_Create (hwnd, (LPCREATESTRUCTA)lParam);
 
 	case WM_DESTROY:
 	    return IPADDRESS_Destroy (infoPtr);
Index: dlls/comctl32/monthcal.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/monthcal.c,v
retrieving revision 1.42
diff -u -r1.42 monthcal.c
--- dlls/comctl32/monthcal.c	22 Sep 2003 21:32:33 -0000	1.42
+++ dlls/comctl32/monthcal.c	19 Nov 2003 05:35:32 -0000
@@ -104,6 +104,7 @@
     RECT days;		/* calendar area */
     RECT weeknums;	/* week numbers at left side */
     RECT todayrect;	/* `today: xx/xx/xx' text rect */
+    HWND hwndNotify;    /* Window to receive the notifications */
     HWND hWndYearEdit;  /* Window Handle of edit box to handle years */
     HWND hWndYearUpDown;/* Window Handle of updown box to handle years */
 } MONTHCAL_INFO, *LPMONTHCAL_INFO;
@@ -1304,7 +1305,7 @@
     nmds.cDayState	= infoPtr->monthRange;
     nmds.prgDayState	= Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));
 
-    SendMessageA(GetParent(hwnd), WM_NOTIFY,
+    SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
     (WPARAM)nmds.nmhdr.idFrom, (LPARAM)&nmds);
     for(i=0; i<infoPtr->monthRange; i++)
       infoPtr->monthdayState[i] = nmds.prgDayState[i];
@@ -1335,7 +1336,7 @@
     nmds.prgDayState	= Alloc
                         (infoPtr->monthRange * sizeof(MONTHDAYSTATE));
 
-    SendMessageA(GetParent(hwnd), WM_NOTIFY,
+    SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
         (WPARAM)nmds.nmhdr.idFrom, (LPARAM)&nmds);
     for(i=0; i<infoPtr->monthRange; i++)
        infoPtr->monthdayState[i] = nmds.prgDayState[i];
@@ -1489,7 +1490,7 @@
     MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel);
     MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel);
 
-    SendMessageA(GetParent(hwnd), WM_NOTIFY,
+    SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
            (WPARAM)nmsc.nmhdr.idFrom,(LPARAM)&nmsc);
 
     MONTHCAL_CopyTime(&ht.st, &selArray[0]);
@@ -1555,9 +1556,9 @@
   nmhdr.hwndFrom = hwnd;
   nmhdr.idFrom   = GetWindowLongA( hwnd, GWL_ID);
   nmhdr.code     = NM_RELEASEDCAPTURE;
-  TRACE("Sent notification from %p to %p\n", hwnd, GetParent(hwnd));
+  TRACE("Sent notification from %p to %p\n", hwnd, infoPtr->hwndNotify);
 
-  SendMessageA(GetParent(hwnd), WM_NOTIFY,
+  SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
                                 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
 
   nmsc.nmhdr.hwndFrom = hwnd;
@@ -1566,7 +1567,7 @@
   MONTHCAL_CopyTime(&nmsc.stSelStart, &infoPtr->minSel);
   MONTHCAL_CopyTime(&nmsc.stSelEnd, &infoPtr->maxSel);
 
-  SendMessageA(GetParent(hwnd), WM_NOTIFY,
+  SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
            (WPARAM)nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
 
   /* redraw if necessary */
@@ -1880,6 +1881,8 @@
     ERR( "pointer assignment error!\n");
     return 0;
   }
+
+  infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
 
   infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);
   GetObjectA(infoPtr->hFont, sizeof(LOGFONTA), &logFont);
Index: dlls/comctl32/pager.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/pager.c,v
retrieving revision 1.45
diff -u -r1.45 pager.c
--- dlls/comctl32/pager.c	22 Sep 2003 21:32:33 -0000	1.45
+++ dlls/comctl32/pager.c	19 Nov 2003 05:39:44 -0000
@@ -44,6 +44,7 @@
 typedef struct
 {
     HWND   hwndChild;  /* handle of the contained wnd */
+    HWND   hwndNotify; /* handle of the parent wnd */
     BOOL   bNoResize;  /* set when created with CCS_NORESIZE */
     COLORREF clrBk;    /* background color */
     INT    nBorder;    /* border size for the control */
@@ -325,6 +326,7 @@
 static void
 PAGER_CalcSize (HWND hwnd, INT* size, BOOL getWidth)
 {
+    PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
     NMPGCALCSIZE nmpgcs;
     ZeroMemory (&nmpgcs, sizeof (NMPGCALCSIZE));
     nmpgcs.hdr.hwndFrom = hwnd;
@@ -333,7 +335,7 @@
     nmpgcs.dwFlag = getWidth ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
     nmpgcs.iWidth = getWidth ? *size : 0;
     nmpgcs.iHeight = getWidth ? 0 : *size;
-    SendMessageA (GetParent (hwnd), WM_NOTIFY,
+    SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
                   (WPARAM)nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs);
 
     *size = getWidth ? nmpgcs.iWidth : nmpgcs.iHeight;
@@ -795,7 +797,7 @@
         }
         nmpgScroll.iScroll -= 2*infoPtr->nButtonSize;
 
-        SendMessageA (GetParent(hwnd), WM_NOTIFY,
+        SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
                     (WPARAM)nmpgScroll.hdr.idFrom, (LPARAM)&nmpgScroll);
 
         TRACE("[%p] PGN_SCROLL returns iScroll=%d\n", hwnd, nmpgScroll.iScroll);
@@ -843,6 +845,7 @@
 
     /* set default settings */
     infoPtr->hwndChild = NULL;
+    infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
     infoPtr->bNoResize = dwStyle & CCS_NORESIZE;
     infoPtr->clrBk = GetSysColor(COLOR_BTNFACE);
     infoPtr->nBorder = 0;
@@ -1177,7 +1180,7 @@
         nmhdr.hwndFrom = hwnd;
         nmhdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
         nmhdr.code = NM_RELEASEDCAPTURE;
-        SendMessageA (GetParent(hwnd), WM_NOTIFY,
+        SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
                         (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
     }
 
@@ -1267,7 +1270,7 @@
 		nmhdr.hwndFrom = hwnd;
 		nmhdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
 		nmhdr.code = NM_RELEASEDCAPTURE;
-		SendMessageA (GetParent(hwnd), WM_NOTIFY,
+		SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
 			      (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
 	    }
 	}
@@ -1575,7 +1578,7 @@
 
         case WM_NOTIFY:
         case WM_COMMAND:
-            return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam);
+            return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam);
 
         default:
             return DefWindowProcA (hwnd, uMsg, wParam, lParam);
Index: dlls/comctl32/status.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/status.c,v
retrieving revision 1.63
diff -u -r1.63 status.c
--- dlls/comctl32/status.c	21 Oct 2003 23:43:14 -0000	1.63
+++ dlls/comctl32/status.c	19 Nov 2003 05:15:55 -0000
@@ -67,6 +67,7 @@
 typedef struct
 {
     HWND              Self;
+    HWND              Notify;
     WORD              numParts;
     UINT              height;
     BOOL              simple;
@@ -170,8 +171,7 @@
 	    dis.hDC = hdc;
 	    dis.rcItem = r;
 	    dis.itemData = (INT)part->text;
-	    SendMessageW (GetParent (infoPtr->Self), WM_DRAWITEM,
-		    (WPARAM)dis.CtlID, (LPARAM)&dis);
+	    SendMessageW (infoPtr->Notify, WM_DRAWITEM, (WPARAM)dis.CtlID, (LPARAM)&dis);
     }
     else
 	{
@@ -561,7 +561,7 @@
 	INT  width, x, y;
 	RECT parent_rect;
 
-	GetClientRect (GetParent (infoPtr->Self), &parent_rect);
+	GetClientRect (infoPtr->Notify, &parent_rect);
 	infoPtr->height = height + VERT_BORDER;
 	width = parent_rect.right - parent_rect.left;
 	x = parent_rect.left;
@@ -779,7 +779,7 @@
     nmhdr.hwndFrom = infoPtr->Self;
     nmhdr.idFrom = GetWindowLongW (infoPtr->Self, GWL_ID);
     nmhdr.code = SBN_SIMPLEMODECHANGE;
-    SendMessageW (GetParent (infoPtr->Self), WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    SendMessageW (infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     InvalidateRect(infoPtr->Self, NULL, FALSE);
     return TRUE;
 }
@@ -829,13 +829,14 @@
     SetWindowLongW (hwnd, 0, (DWORD)infoPtr);
 
     infoPtr->Self = hwnd;
+    infoPtr->Notify = lpCreate->hwndParent;
     infoPtr->numParts = 1;
     infoPtr->parts = 0;
     infoPtr->simple = FALSE;
     infoPtr->clrBk = CLR_DEFAULT;
     infoPtr->hFont = 0;
 
-    i = SendMessageW(GetParent (hwnd), WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
+    i = SendMessageW(infoPtr->Notify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
     infoPtr->NtfUnicode = (i == NFR_UNICODE);
 
     GetClientRect (hwnd, &rect);
@@ -923,7 +924,7 @@
     }
 
     if (!(dwStyle & CCS_NORESIZE)) { /* don't resize wnd if it doesn't want it ! */
-        GetClientRect (GetParent (hwnd), &rect);
+        GetClientRect (infoPtr->Notify, &rect);
         width = rect.right - rect.left;
         infoPtr->height = textHeight + 4 + VERT_BORDER;
         SetWindowPos(hwnd, 0, lpCreate->x, lpCreate->y - 1,
@@ -1074,7 +1075,7 @@
     if (GetWindowLongW(infoPtr->Self, GWL_STYLE) & CCS_NORESIZE) return FALSE;
 
     /* width and height don't apply */
-    GetClientRect (GetParent(infoPtr->Self), &parent_rect);
+    GetClientRect (infoPtr->Notify, &parent_rect);
     width = parent_rect.right - parent_rect.left;
     x = parent_rect.left;
     y = parent_rect.bottom - infoPtr->height;
@@ -1100,13 +1101,14 @@
 static LRESULT
 STATUSBAR_SendNotify (HWND hwnd, UINT code)
 {
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr(hwnd);
     NMHDR  nmhdr;
 
     TRACE("code %04x\n", code);
     nmhdr.hwndFrom = hwnd;
     nmhdr.idFrom = GetWindowLongW (hwnd, GWL_ID);
     nmhdr.code = code;
-    SendMessageW (GetParent (hwnd), WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    SendMessageW (infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     return 0;
 }
 
@@ -1220,7 +1222,7 @@
 
 	case WM_NCLBUTTONUP:
 	case WM_NCLBUTTONDOWN:
-    	    PostMessageW (GetParent (hwnd), msg, wParam, lParam);
+    	    PostMessageW (infoPtr->Notify, msg, wParam, lParam);
 	    return 0;
 
 	case WM_NOTIFYFORMAT:
Index: dlls/comctl32/tab.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/tab.c,v
retrieving revision 1.88
diff -u -r1.88 tab.c
--- dlls/comctl32/tab.c	31 Oct 2003 00:06:42 -0000	1.88
+++ dlls/comctl32/tab.c	19 Nov 2003 19:35:01 -0000
@@ -59,6 +59,7 @@
 
 typedef struct
 {
+  HWND       hwndNotify;      /* notification window (parent) */
   UINT       uNumItem;        /* number of tab items */
   UINT       uNumRows;	      /* number of tab rows */
   INT        tabHeight;       /* height of the tab row */
@@ -118,13 +119,14 @@
 static BOOL
 TAB_SendSimpleNotify (HWND hwnd, UINT code)
 {
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     NMHDR nmhdr;
 
     nmhdr.hwndFrom = hwnd;
     nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
     nmhdr.code = code;
 
-    return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
+    return (BOOL) SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
             (WPARAM) nmhdr.idFrom, (LPARAM) &nmhdr);
 }
 
@@ -1526,7 +1528,7 @@
     /*
      * send the draw message
      */
-    SendMessageA( GetParent(hwnd), WM_DRAWITEM, (WPARAM)id, (LPARAM)&dis );
+    SendMessageA( infoPtr->hwndNotify, WM_DRAWITEM, (WPARAM)id, (LPARAM)&dis );
   }
   else
   {
@@ -3001,6 +3003,7 @@
 
   SetWindowLongA(hwnd, 0, (DWORD)infoPtr);
 
+  infoPtr->hwndNotify      = ((LPCREATESTRUCTW)lParam)->hwndParent;
   infoPtr->uNumItem        = 0;
   infoPtr->uNumRows        = 0;
   infoPtr->uHItemPadding   = 6;
@@ -3044,7 +3047,7 @@
       nmttc.hdr.code = NM_TOOLTIPSCREATED;
       nmttc.hwndToolTips = infoPtr->hwndToolTip;
 
-      SendMessageA (GetParent (hwnd), WM_NOTIFY,
+      SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
 		    (WPARAM)GetWindowLongA(hwnd, GWL_ID), (LPARAM)&nmttc);
     }
   }
@@ -3113,6 +3116,7 @@
 static LRESULT WINAPI
 TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
 
     TRACE("hwnd=%p msg=%x wParam=%x lParam=%lx\n", hwnd, uMsg, wParam, lParam);
     if (!TAB_GetInfoPtr(hwnd) && (uMsg != WM_CREATE))
@@ -3243,7 +3247,7 @@
       return TAB_LButtonUp (hwnd, wParam, lParam);
 
     case WM_NOTIFY:
-      return SendMessageA(GetParent(hwnd), WM_NOTIFY, wParam, lParam);
+      return SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, wParam, lParam);
 
     case WM_RBUTTONDOWN:
       return TAB_RButtonDown (hwnd, wParam, lParam);
Index: dlls/comctl32/toolbar.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/toolbar.c,v
retrieving revision 1.143
diff -u -r1.143 toolbar.c
--- dlls/comctl32/toolbar.c	5 Nov 2003 00:35:28 -0000	1.143
+++ dlls/comctl32/toolbar.c	19 Nov 2003 19:38:45 -0000
@@ -4715,7 +4715,7 @@
     infoPtr->nButtonDown = -1;
     infoPtr->nOldHit = -1;
     infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */
-    infoPtr->hwndNotify = GetParent (hwnd);
+    infoPtr->hwndNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
     infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT);
     infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST));
     infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE : DT_CENTER;
@@ -5453,7 +5453,7 @@
     INT i;
 
     if (lParam == NF_REQUERY) {
-	i = SendMessageA(GetParent(infoPtr->hwndSelf),
+	i = SendMessageA(infoPtr->hwndNotify,
 			 WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
 	if ((i < NFR_ANSI) || (i > NFR_UNICODE)) {
 	    ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n",
@@ -5649,6 +5649,8 @@
 static LRESULT WINAPI
 ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
+
     TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n",
 	  hwnd, uMsg, /* SPY_GetMsgName(uMsg), */ wParam, lParam);
 
@@ -6002,13 +6004,7 @@
 	case WM_DRAWITEM:
 	case WM_MEASUREITEM:
 	case WM_VKEYTOITEM:
-	    {
-                TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
-                if(infoPtr != NULL)
-                    return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam);
-                else
-                    return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam);
-            }
+            return SendMessageA (infoPtr->hwndNotify, uMsg, wParam, lParam);
 
 	/* We see this in Outlook Express 5.x and just does DefWindowProc */
         case PGM_FORWARDMOUSE:
Index: dlls/comctl32/tooltips.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/tooltips.c,v
retrieving revision 1.60
diff -u -r1.60 tooltips.c
--- dlls/comctl32/tooltips.c	22 Sep 2003 21:32:33 -0000	1.60
+++ dlls/comctl32/tooltips.c	19 Nov 2003 04:38:26 -0000
@@ -1902,12 +1902,11 @@
 
 
 static LRESULT
-TOOLTIPS_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
+TOOLTIPS_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
 {
     TOOLTIPS_INFO *infoPtr;
     NONCLIENTMETRICSA nclm;
     INT nResult;
-    HWND hParent;
 
     /* allocate memory for info structure */
     infoPtr = (TOOLTIPS_INFO *)Alloc (sizeof(TOOLTIPS_INFO));
@@ -1930,21 +1929,16 @@
 
     TOOLTIPS_SetDelayTime(hwnd, TTDT_AUTOMATIC, 0L);
 
-    hParent = GetParent(hwnd);
-    if (hParent) {
-        nResult = (INT) SendMessageA (hParent, WM_NOTIFYFORMAT,
+    nResult = (INT) SendMessageA (lpcs->hwndParent, WM_NOTIFYFORMAT,
 				  (WPARAM)hwnd, (LPARAM)NF_QUERY);
-        if (nResult == NFR_ANSI) {
-            infoPtr->bNotifyUnicode = FALSE;
+    if (nResult == NFR_ANSI) {
+        infoPtr->bNotifyUnicode = FALSE;
 	TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
-        }
-        else if (nResult == NFR_UNICODE) {
-	    infoPtr->bNotifyUnicode = TRUE;
-	    TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
-        }
-        else {
-	    ERR (" -- WM_NOTIFYFORMAT returns: error!\n");
-        }
+    } else if (nResult == NFR_UNICODE) {
+        infoPtr->bNotifyUnicode = TRUE;
+	TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
+    } else {
+        TRACE (" -- WM_NOTIFYFORMAT returns: error!\n");
     }
 
     SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
@@ -2371,7 +2365,7 @@
 
 
 	case WM_CREATE:
-	    return TOOLTIPS_Create (hwnd, wParam, lParam);
+	    return TOOLTIPS_Create (hwnd, (LPCREATESTRUCTW)lParam);
 
 	case WM_DESTROY:
 	    return TOOLTIPS_Destroy (hwnd, wParam, lParam);
Index: dlls/comctl32/treeview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/treeview.c,v
retrieving revision 1.132
diff -u -r1.132 treeview.c
--- dlls/comctl32/treeview.c	20 Nov 2003 04:19:59 -0000	1.132
+++ dlls/comctl32/treeview.c	20 Nov 2003 06:16:37 -0000
@@ -4718,7 +4718,7 @@
 /* Create/Destroy *******************************************************/
 
 static LRESULT
-TREEVIEW_Create(HWND hwnd)
+TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
 {
     RECT rcClient;
     TREEVIEW_INFO *infoPtr;
@@ -4797,7 +4797,7 @@
     infoPtr->root->iLevel = -1;
     infoPtr->root->visibleOrder = -1;
 
-    infoPtr->hwndNotify = GetParent(hwnd);
+    infoPtr->hwndNotify = lpcs->hwndParent;
 #if 0
     infoPtr->bTransparent = ( GetWindowLongA( hwnd, GWL_STYLE) & TBSTYLE_FLAT);
 #endif
@@ -5179,7 +5179,7 @@
     else
     {
 	if (uMsg == WM_CREATE)
-	    TREEVIEW_Create(hwnd);
+	    TREEVIEW_Create(hwnd, (LPCREATESTRUCTW)lParam);
 	else
 	    goto def;
     }
Index: dlls/comctl32/updown.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/updown.c,v
retrieving revision 1.55
diff -u -r1.55 updown.c
--- dlls/comctl32/updown.c	22 Sep 2003 21:32:33 -0000	1.55
+++ dlls/comctl32/updown.c	3 Nov 2003 21:05:17 -0000
@@ -48,6 +48,7 @@
 typedef struct
 {
     HWND      Self;            /* Handle to this up-down control */
+    HWND      Notify;          /* Handle to the parent window */
     UINT      AccelCount;      /* Number of elements in AccelVect */
     UDACCEL*  AccelVect;       /* Vector containing AccelCount elements */
     INT       AccelIndex;      /* Current accel index, -1 if not accel'ing */
@@ -562,8 +563,7 @@
     ni.hdr.hwndFrom = infoPtr->Self;
     ni.hdr.idFrom   = GetWindowLongW (infoPtr->Self, GWL_ID);
     ni.hdr.code = UDN_DELTAPOS;
-    if (!SendMessageW(GetParent (infoPtr->Self), WM_NOTIFY,
-		   (WPARAM)ni.hdr.idFrom, (LPARAM)&ni)) {
+    if (!SendMessageW(infoPtr->Notify, WM_NOTIFY, (WPARAM)ni.hdr.idFrom, (LPARAM)&ni)) {
         /* Parent said: OK to adjust */
 
         /* Now adjust value with (maybe new) delta */
@@ -574,10 +574,8 @@
     }
 
     /* Also, notify it. This message is sent in any case. */
-    SendMessageW( GetParent(infoPtr->Self),
-		  dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL,
-		  MAKELONG(SB_THUMBPOSITION, infoPtr->CurVal),
-		  (LPARAM)infoPtr->Self);
+    SendMessageW( infoPtr->Notify, dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL,
+		  MAKELONG(SB_THUMBPOSITION, infoPtr->CurVal), (LPARAM)infoPtr->Self);
 }
 
 /***********************************************************************
@@ -616,7 +614,7 @@
 	hdr.hwndFrom = infoPtr->Self;
 	hdr.idFrom   = GetWindowLongW (infoPtr->Self, GWL_ID);
 	hdr.code = NM_RELEASEDCAPTURE;
-	SendMessageW(GetParent (infoPtr->Self), WM_NOTIFY, hdr.idFrom, (LPARAM)&hdr);
+	SendMessageW(infoPtr->Notify, WM_NOTIFY, hdr.idFrom, (LPARAM)&hdr);
 	ReleaseCapture();
     }
 
@@ -720,6 +718,7 @@
 
 	    /* initialize the info struct */
 	    infoPtr->Self = hwnd;
+	    infoPtr->Notify = ((LPCREATESTRUCTA)lParam)->hwndParent;
 	    infoPtr->AccelCount = 0;
 	    infoPtr->AccelVect = 0;
 	    infoPtr->AccelIndex = -1;
@@ -798,7 +797,7 @@
 	    if ( (infoPtr->Flags & FLAG_MOUSEIN) &&
 		 (infoPtr->Flags & FLAG_ARROW) ) {
 
-	    	SendMessageW( GetParent(hwnd),
+	    	SendMessageW( infoPtr->Notify,
 			      dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL,
                   	      MAKELONG(SB_ENDSCROLL, infoPtr->CurVal),
 			      (LPARAM)hwnd);


-- 
Dimi.




More information about the wine-patches mailing list