TreeView & WM_NOTIFY

Igor Grahek igorg at cadlink.com
Mon Sep 8 14:53:09 CDT 2003


Solved !

Problem was in TreeView control (dll/comctl32/treeview.c) all the time.
TreeView was not handling WM_CREATE properly - it did not forward
CREATESTRUCT (in lParam) to TREEVIEW_Create function and that function
was setting hwndNotify window to GetParent(hwnd) instead window handle
given in CREATESTRUCT.

I fixed this for TreeView control (patch sent to wine-patches) but same
problem can be expected for other controls which use WS_POPUP style and
then set notify window handler to GetParent(hwnd)

Igor

> -----Original Message-----
> From: Igor Grahek [mailto:igorg at cadlink.com] 
> Sent: September 5, 2003 4:50 PM
> To: 'wine-devel at winehq.org'
> Subject: RE: TreeView & WM_NOTIFY
> 
> 
> It looks like comctl32.dll is seting up some hooks to forward 
> messages to requested window because even if you use --dll 
> comctl32=n the owner is set up to "GetAncestor( 
> cs->hwndParent, GA_ROOT )" Same thing happends under Windows 
> so it seems that everything is OK with windows/win.c
> 
> I tried to figure out what is going on with hooks but I don't 
> have much experience with windows hooks so I will appreciate 
> any help. 
> 
> Thanks,
> Igor
> 
> > -----Original Message-----
> > From: Igor Grahek [mailto:igorg at cadlink.com] 
> > Sent: September 5, 2003 11:29 AM
> > To: 'wine-devel at winehq.org'
> > Subject: RE: TreeView & WM_NOTIFY
> > 
> > 
> > Here is an example in attachment (Visual C++ project) .
> > If you click on "tst" button it opens TreeView control with 
> > WS_POPUP and Cview as parent (to process WM_NOTIFY messages) 
> > With current code in windows/win.c owner is set to 
> > "GetAncestor( cs->hwndParent, GA_ROOT )" and WM_NOTIFY goes 
> > to wrong window. If I change code so that owner is 
> > "WIN_GetFullHandle(cs->hwndParent)" then there is problem 
> > with Z ordering (keeping popup window on top) but WM_NOTIFY 
> > goes to Cview as it should.
> > 
> > However if I use --dll comctl32=n and owner is set to 
> > "GetAncestor( cs->hwndParent, GA_ROOT )" everything works OK 
> > - popup is on top and CView receives WM_NOTIFY from it.
> > 
> > I know I'm repeating myself but I'm not sure where I should 
> > look for the problem: is it in dll/comctl32/treeview.c (as 
> > --dll comctl32=n suggesting) or is it in windows/win.c and 
> > dll/x11drv/* ?
> > 
> > Igor
> > 
> > > -----Original Message-----
> > > From: Igor Grahek [mailto:igorg at cadlink.com] 
> > > Sent: September 4, 2003 1:50 PM
> > > To: 'Dimitrie O. Paun'
> > > Cc: 'wine-devel at winehq.org'
> > > Subject: RE: TreeView & WM_NOTIFY
> > > 
> > > 
> > > I think I found the source of my problem:
> > > -------------
> > > Wine/windows/win.c ::CreateWindowEx
> > > 
> > >         if ((cs->style & (WS_CHILD|WS_POPUP)) == WS_CHILD)
> > >             parent = WIN_GetFullHandle(cs->hwndParent);
> > >         else
> > >             owner = GetAncestor( cs->hwndParent, GA_ROOT );
> > > --------------------------
> > > Why owner is not set to "WIN_GetFullHandle(cs->hwndParent)" ?
> > > 
> > > If I change this everything works OK except there is a 
> > > problem with Z ordering (it is hiding popup window behind its 
> > > owner when Managed=N) Is the source of problem somewhere in 
> > > wine/dll/x11drv/winpos.c (I'm currently examining 
> > > SWP_DoOwnedPopups function) and why it is working with --dll 
> > > comctl32=n - no problems with Z order there?!
> > > 
> > > BTW I'm working with 20030618 build.
> > > 
> > > Igor
> > > 
> > > > -----Original Message-----
> > > > From: Dimitrie O. Paun [mailto:dimi at intelliware.ca] 
> > > > Sent: September 2, 2003 6:42 PM
> > > > To: Igor Grahek
> > > > Cc: wine-devel at winehq.org
> > > > Subject: Re: TreeView & WM_NOTIFY
> > > > 
> > > > 
> > > > On Tue, 2 Sep 2003, Igor Grahek wrote:
> > > > 
> > > > > My problem is very similar to bug 1227
> > > > > (http://bugs.winehq.org/show_bug.cgi?id=1227)
> > > > > Treeview in application is sending WM_NOTIFY on double 
> > > > click (NM_DBLCLK)
> > > > > to the wrong
> > > > > Window handle. GetParent() function returns handle to the 
> > > > root window
> > > > > and root window is not forwarding/broadcasting that message 
> > > > and message
> > > > > is lost. Everything works fine under Windows 
> > > > > or with --dll comctl32=n
> > > > 
> > > > I'm afraid you'll need to debug this and post a lot more 
> > > detail, maybe
> > > > a code fragment showing the undesirable behaviour.
> > > > 
> > > > -- 
> > > > Dimi.
> > > > 
> > > > 
> > > 
> > 
> 




More information about the wine-devel mailing list