1. win32lib bug?

I am trying to use onEvent to trap the opening of a menu (WM_INITPOPUPMENU,
defined as 117 hex).  However, the inclusion of the statement

onEvent[WM_INITPOPUPMENU]=routine_id(my_routine)

crashes the interpreter.  I tried replacing the constant i had declared with
the actual value, first #117, then 279 (the decimal equivalent) and still
no luck.  Then I started using lower numbers... the interpreter would allow
numbers no higher than 6.. naturally, the event was never trapped.

onEvent sends three atoms as parameters, and my code is prepared for this,
but the onEvent[] assignment fails before the code ever runs.

Help?

new topic     » topic index » view message » categorize

2. Re: win32lib bug?

Well, in Win32Lib, you can only use the event variables (such as
onClose,
onEvent, etc.) with handles returned by create(), because when the
create()
function is called, it allocates enough space to hold events by only
that extra
handle.  Therefore, the win32lib event variables can't be used with
Windows
system messages.

Here's an example to help clarify..  This assumes that no changes have
been made
to the event variables.  I'll use onEvent in the example.

   0 calls to create() - onEvent = {}
   1 call to create() - onEvent = {-1}
   5 calls to create() - onEvent = {-1, -1, -1, -1, -1}
   50 calls to create() - onEvent = repeat(-1, 50)

I hope that helps..

   The AfterBeat

A Moore wrote:

> I am trying to use onEvent to trap the opening of a menu (WM_INITPOPUPMENU,
> defined as 117 hex).  However, the inclusion of the statement
>
> onEvent[WM_INITPOPUPMENU]=routine_id(my_routine)
>
> crashes the interpreter.  I tried replacing the constant i had declared with
> the actual value, first #117, then 279 (the decimal equivalent) and still
> no luck.  Then I started using lower numbers... the interpreter would allow
> numbers no higher than 6.. naturally, the event was never trapped.
>
> onEvent sends three atoms as parameters, and my code is prepared for this,
> but the onEvent[] assignment fails before the code ever runs.
>
> Help?

new topic     » goto parent     » topic index » view message » categorize

3. Re: win32lib bug?

A Moore wrote:


> I am trying to use onEvent to trap the opening of
> a menu (WM_INITPOPUPMENU, defined as 117 hex).
> However, the inclusion of the statement
>
> onEvent[WM_INITPOPUPMENU]=routine_id(my_routine)
>
> crashes the interpreter.

The index to onEvent should be the id of the control being given the action
- the value returned by create():

   onEvent[MyControl] = routine_id("onEvent_MyControl")

The onEvent handler receives all the events that are passed to that control.
It's up to your routine to filter them out:

   procedure onEvent_MyMenu( atom msg, atom wParam, atom lParam )
      -- only interested in WM_POPUPMENU event
      if msg = WM_POPUPMENU then
         -- your handler code here
      end if
   end procedure
   onEvent[MyMenu] = routine_id("onEvent_MyMenu")

Hope this helps.

-- David Cuny

new topic     » goto parent     » topic index » view message » categorize

4. Re: win32lib bug?

>
>A Moore wrote:
>
>
>> I am trying to use onEvent to trap the opening of
>> a menu (WM_INITPOPUPMENU, defined as 117 hex).
>> However, the inclusion of the statement
>>
>> onEvent[WM_INITPOPUPMENU]=routine_id(my_routine)
>>
>> crashes the interpreter.
>
>The index to onEvent should be the id of the control being given the
action
>- the value returned by create():
>
>   onEvent[MyControl] = routine_id("onEvent_MyControl")
>
>The onEvent handler receives all the events that are passed to that
control.
>It's up to your routine to filter them out:
>
>   procedure onEvent_MyMenu( atom msg, atom wParam, atom lParam )
>      -- only interested in WM_POPUPMENU event
>      if msg = WM_POPUPMENU then
>         -- your handler code here
>      end if
>   end procedure
>   onEvent[MyMenu] = routine_id("onEvent_MyMenu")
>
>Hope this helps.
>
>-- David Cuny

One of those times when I found the answer shortly after posting about
it.  Found out also the event message was sent to the Main Window (the
one opened by WinInit() instead of the menu itself.  But I'm sure you
knew that already :)

I drummed up a bit of code that you might be interested in:

-- assumes open_dll("user32.dll")
global constant MF_SEPARATOR = #800
AddSep=define_c_func(user32,"AppendMenuA",
   {C_INT,C_INT,C_INT,C_POINTER},C_INT)


This function allows the addition of a horizontal line separator in
Parent_Menu.  The final two passed parameters are ignored.  Returns
a boolean for the success of the addition.  Place this between
create(MenuItem,...) calls of the items you wish the separator to go.

The on-the-fly submenu thing I posted has been solved also, so dont
bother with that one.



______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu