1. [win32lib] subclassing Combo's EditText
I need to set some handlers for EditText field of ComboBox.
I tried to subclass it according to this example from Microsoft:
<c code>
/* Get the edit window handle for each combo box. */
pt.x = 1;
pt.y = 1;
hwndEdit1 = ChildWindowFromPoint(hwndCombo1, pt);
hwndEdit2 = ChildWindowFromPoint(hwndCombo2, pt);
/*
* Change the window procedure for both edit windows
* to the subclass procedure.
*/
lpfnEditWndProc = (WNDPROC) SetWindowLong(hwndEdit1,
GWL_WNDPROC, (DWORD) SubClassProc);
SetWindowLong(hwndEdit2, GWL_WNDPROC,
(DWORD) SubClassProc);
</c code>
<eu code>
-- subclass the edit control
pt = acquire_mem( 0, SIZEOF_POINT )
store(pt, ptX, 1) -- also tried [5,5];[10,10] etc.
store(pt, ptY, 1)
pComboBoxEdit = w32Func(ChildWindowFromPoint, {getHandle(pComboBox), pt})
? pComboBoxEdit
release_mem(pt)
pComboBoxEdit = subClassControl( {EditText, pWin}, pComboBoxEdit)
? pComboBoxEdit
</eu code>
But the output is:
0
0
- this means that ChildWindowFromPoint failed. What I am doing wrong
or is there another way to get handle of the EditText?
Regards,
Martin Stachon
martin.stachon at tiscali.cz
http://www.webpark.cz/stachon
2. Re: [win32lib] subclassing Combo's EditText
Martin,
win32lib has already done this for you. To get the id of the editbox
belonging to a combo you can do something like this...
sequence kids
integer edid
kids = findChildren(mycombo)
for i = 1 to length(kids) do
if kids[i][2] = EditText then
edid = edid[i][1]
exit
end if
end for
Another method is this...
edid = subClassControl( {EditText,id},
w32Func(xGetWindow,{ geHandle(id), GW_CHILD}))
However, the reason that ChildWindowFromPoint didn't work is that definition
of it in win32lib is wrong.
The Microsoft C header is ...
HWND ChildWindowFromPoint(
HWND hWndParent, // handle to parent window
POINT Point // structure with point coordinates
);
which looks like it has two parameters. However, the second parameter is a
POINT structure; not a pointer to the structure, but the structure itself.
The POINT structure is two longs. So then the proper win32lib definition
should be ...
ChildWindowFromPoint = registerw32Function( user32,
"ChildWindowFromPoint",{ C_LONG, C_LONG, C_LONG }, C_LONG ),
Which means that a third method is this...
edid = getId(w32Func(ChildWindowFromPoint, {getHandle(pComboBox), 1,1}))
This last one works because win32lib already subclasses the editbox and has
thus already given it an id value.
----- Original Message -----
From: "Martin Stachon" <martin.stachon at worldonline.cz>
To: "EUforum" <EUforum at topica.com>
Sent: Saturday, July 13, 2002 10:22 PM
Subject: [win32lib] subclassing Combo's EditText
>
> I need to set some handlers for EditText field of ComboBox.
> I tried to subclass it according to this example from Microsoft:
>
> <c code>
> /* Get the edit window handle for each combo box. */
> pt.x = 1;
> pt.y = 1;
>
> hwndEdit1 = ChildWindowFromPoint(hwndCombo1, pt);
> hwndEdit2 = ChildWindowFromPoint(hwndCombo2, pt);
>
> /*
> * Change the window procedure for both edit windows
> * to the subclass procedure.
> */
>
> lpfnEditWndProc = (WNDPROC) SetWindowLong(hwndEdit1,
> GWL_WNDPROC, (DWORD) SubClassProc);
>
> SetWindowLong(hwndEdit2, GWL_WNDPROC,
> (DWORD) SubClassProc);
> </c code>
>
> <eu code>
> -- subclass the edit control
> pt = acquire_mem( 0, SIZEOF_POINT )
> store(pt, ptX, 1) -- also tried [5,5];[10,10] etc.
> store(pt, ptY, 1)
> pComboBoxEdit = w32Func(ChildWindowFromPoint, {getHandle(pComboBox), pt})
> ? pComboBoxEdit
> release_mem(pt)
> pComboBoxEdit = subClassControl( {EditText, pWin}, pComboBoxEdit)
> ? pComboBoxEdit
> </eu code>
>
> But the output is:
> 0
> 0
> - this means that ChildWindowFromPoint failed. What I am doing wrong
> or is there another way to get handle of the EditText?
>
> Regards,
> Martin Stachon
>
> martin.stachon at tiscali.cz
> http://www.webpark.cz/stachon
>
>
>
>
3. Re: [win32lib] subclassing Combo's EditText
Thanks, Derek.
Martin
----- Original Message -----
From: "Derek Parnell" <ddparnell at bigpond.com>
To: "EUforum" <EUforum at topica.com>
Subject: Re: [win32lib] subclassing Combo's EditText
> Martin,
> win32lib has already done this for you. To get the id of the editbox
> belonging to a combo you can do something like this...
>
> sequence kids
> integer edid
>
> kids = findChildren(mycombo)
> for i = 1 to length(kids) do
> if kids[i][2] = EditText then
> edid = edid[i][1]
> exit
> end if
> end for
>
> Another method is this...
>
> edid = subClassControl( {EditText,id},
> w32Func(xGetWindow,{ geHandle(id), GW_CHILD}))
>
> However, the reason that ChildWindowFromPoint didn't work is that definition
> of it in win32lib is wrong.
> The Microsoft C header is ...
>
> HWND ChildWindowFromPoint(
> HWND hWndParent, // handle to parent window
> POINT Point // structure with point coordinates
> );
>
> which looks like it has two parameters. However, the second parameter is a
> POINT structure; not a pointer to the structure, but the structure itself.
> The POINT structure is two longs. So then the proper win32lib definition
> should be ...
>
> ChildWindowFromPoint = registerw32Function( user32,
> "ChildWindowFromPoint",{ C_LONG, C_LONG, C_LONG }, C_LONG ),
>
> Which means that a third method is this...
>
> edid = getId(w32Func(ChildWindowFromPoint, {getHandle(pComboBox), 1,1}))
>
> This last one works because win32lib already subclasses the editbox and has
> thus already given it an id value.
>
>
> ----- Original Message -----
> From: "Martin Stachon" <martin.stachon at worldonline.cz>
> To: "EUforum" <EUforum at topica.com>
> Sent: Saturday, July 13, 2002 10:22 PM
> Subject: [win32lib] subclassing Combo's EditText
>
>
> > I need to set some handlers for EditText field of ComboBox.
> > I tried to subclass it according to this example from Microsoft:
> >
> > <c code>
> > /* Get the edit window handle for each combo box. */
> > pt.x = 1;
> > pt.y = 1;
> >
> > hwndEdit1 = ChildWindowFromPoint(hwndCombo1, pt);
> > hwndEdit2 = ChildWindowFromPoint(hwndCombo2, pt);
> >
> > /*
> > * Change the window procedure for both edit windows
> > * to the subclass procedure.
> > */
> >
> > lpfnEditWndProc = (WNDPROC) SetWindowLong(hwndEdit1,
> > GWL_WNDPROC, (DWORD) SubClassProc);
> >
> > SetWindowLong(hwndEdit2, GWL_WNDPROC,
> > (DWORD) SubClassProc);
> > </c code>
> >
> > <eu code>
> > -- subclass the edit control
> > pt = acquire_mem( 0, SIZEOF_POINT )
> > store(pt, ptX, 1) -- also tried [5,5];[10,10] etc.
> > store(pt, ptY, 1)
> > pComboBoxEdit = w32Func(ChildWindowFromPoint, {getHandle(pComboBox), pt})
> > ? pComboBoxEdit
> > release_mem(pt)
> > pComboBoxEdit = subClassControl( {EditText, pWin}, pComboBoxEdit)
> > ? pComboBoxEdit
> > </eu code>
> >
> > But the output is:
> > 0
> > 0
> > - this means that ChildWindowFromPoint failed. What I am doing wrong
> > or is there another way to get handle of the EditText?
> >
> > Regards,
> > Martin Stachon
> >
> > martin.stachon at tiscali.cz
> > http://www.webpark.cz/stachon