Beefy Boxes and Bandwidth Generously Provided by pair Networks Joe
laziness, impatience, and hubris
 
PerlMonks  

Re^5: How to get a window's menu as a Win32::GUI::Menu object?

by Anonymous Monk
on Feb 17, 2013 at 10:13 UTC ( #1019122=note: print w/ replies, xml ) Need Help??


in reply to Re^4: How to get a window's menu as a Win32::GUI::Menu object?
in thread How to get a window's menu as a Win32::GUI::Menu object?

Which is why I don't understand why it's relevant. How does it help my solve the problem?

I don't know, but it certainly answers the question you asked , and I quote

returns a menu HANDLE, not an object reference. This seems to be more or less useless -- unless there's a way to turn the handle into an object?

So there you go :) smile (:

You posted a link to the tutorial. ...

:) I linked specifically to an example of the functional interface, how to use handles without turning them into objects

:) Sure its got nothing to do with menus , but then it wasn't supposed to

Fair enough: CODE

Employing Basic debugging checklist I get

( bless({ -handle => 28640341, Alpha => bless({ -id => 102, -menu => 41813267 }, "Win32::GUI::M +enuItem"), Beta => bless({ -id => 103, -menu => 41813267 }, "Win32::GUI::M +enuItem"), Program => bless({ -handle => 41813267 }, "Win32::GUI::MenuButton" +), }, "Win32::GUI::Menu"), bless({ # tied Win32::GUI::Window -accel => 0, -handle => 7734092, -name => "Main", -type => 0, }, "Win32::GUI::Window"), ) bless({ -handle => 13304919 }, "Win32::GUI::Menu")

so what you want to do is skip GetMenu and either use global variables , or store $Menu inside $WinMain

Like this

#!/usr/bin/perl -- #!perl use Win32::GUI; use Data::Dump; Main( @ARGV ); exit 0; sub Main { my $Menu = Win32::GUI::MakeMenu( '&Program' => 'Program', ' > &Alpha' => { -name => 'Alpha', -onClick => \&Alpha_Select +}, ' > &Beta' => { -name => 'Beta', -onClick => \&Beta_Select }, ); my $WinMain = Win32::GUI::Window->new( -name => 'Main', -menu => $Menu, -text => 'Menu Test', -width => 300, -height => 200, -onTerminate => \&Main_Terminate, ); $WinMain->Show(); $WinMain->{__special_Menu} = $Menu; dd $Menu, $WinMain; Win32::GUI::Dialog(); delete $WinMain->{__special_Menu}; # "DESTROY"/destructor/manual m +emory cycle break } sub Main_Terminate { -1; } sub Alpha_Select { 1; } sub Beta_Select { my($Window)=@_; my $menuhandle=$Window->GetMenu(); my $menu = bless { -handle => $menuhandle }, 'Win32::GUI::Menu'; dd $menu; #~ $menu->{'Beta'}->Enabled(0); # Doesn't work. $Window->{__special_Menu}->{'Beta'}->Enabled(0); return 1; }

Useful regarding memory management, Tutorials: Variable Scoping in Perl: the basics, Coping with Scoping , Mini-Tutorial: Perl's Memory Management, Lexical scoping like a fox, Read this if you want to cut your development time in half!

I'll be back with more:) maybe


Comment on Re^5: How to get a window's menu as a Win32::GUI::Menu object?
Select or Download Code
Re^6: How to get a window's menu as a Win32::GUI::Menu object?
by shadrack (Initiate) on Feb 17, 2013 at 10:44 UTC
    I don't know, but it certainly answers the question you asked , and I quote
    "returns a menu HANDLE, not an object reference. This seems to be more or less useless -- unless there's a way to turn the handle into an object? "

    Yes, but not just any old object -- THE object the handle was associated with. Sorry, but I would have thought this was obvious given the context of the question. :-/

    I am actually using a global now, but I'm looking for a way around it since I'm also using threads which sometimes don't seem to play well with global Win32::GUI object variables.

    Anyway, thanks for the suggestions. Storing $Menu inside $WinMain is the solution I'm looking for. I tried something like this before (on a different Win32::GUI issue), but I couldn't make it work -- it's been a while, but IIRC the stored variable refused to "stick" to the object (it was undefined when I tried to access it later). Chalk it up to my lack of understanding of perl's object handling I guess.

      Yes, but not just any old object -- THE object the handle was associated with. Sorry, but I would have thought this was obvious given the context of the question. :-/

      :) Well, sorry, it wasn't obvious to me -- Win32::GUI simply doesn't do that, its not Tk.pm or Wx.pm or some such

      There is the undocumented Win32::GUI::GetWindowObject($handle) but it doesn't work with menus

      foreget this update: http://search.cpan.org/grep?cpanid=ROBERTMAY&release=Win32-GUI-1.06&string=hmenu&i=1&n=1&C=0 reveals GetMenuFromID

      I guess you could remove the IsWindow check from GetWindowObject, recompile Win32::GUI, and try that ... but if this doesn't make you rethink choosing Win32::GUI :)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1019122]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2014-04-18 07:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (463 votes), past polls