Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
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 (Acolyte) 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 romping around the Monastery: (6)
As of 2015-07-02 01:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (25 votes), past polls