From: Jeremy W. <jez...@ho...> - 2005-09-20 09:14:27
|
>oh no! what i meant was something like this: > >sub StartClick >{ > my $self = shift; > #Here $self is the button that was clicked. > #How do I access the window that this button is part of? > #I want to change certain parts of the window when the > #button Start is clicked. >} > >One way I figured out was declaring $window as a global variable. Then all >subroutines have access to it. > >Is there any other way? If the sub StartClick does not have access to the >$window variable, is it possible to work back upwards from the button $self >and retrieve the window? And then modify parts of the window? Yes, there is another way, but... You'll either have to wait for the next version of win32-gui (which should be soon), or build your own from CVS. There is a new method which can be called on controls to return the parent window: GetParent, and a useful associated method: UserData. So: sub StartClick { my $self = shift; my $win = $self->GetParent; #returns a win32::gui window $win->somecontrol->Text("Some string"); } The UserData method is really useful as it allows you to assocate data to a window of control, allowing you to create an object from the window, with instance data stored within the window. Cheers, jez. |
From: Emmanuel E <emm...@gm...> - 2005-09-20 09:47:48
|
Thanks Jeremy. I will wait for the next release. Right now I will use a global. Emmanuel > --- Ursprüngliche Nachricht --- > Von: "Jeremy White" <jez...@ho...> > An: emm...@gm... > Kopie: per...@li... > Betreff: Re: [perl-win32-gui-users] Using Win32::GUI events within a class > or a package? > Datum: Tue, 20 Sep 2005 09:14:17 +0000 > > > >oh no! what i meant was something like this: > > > >sub StartClick > >{ > > my $self = shift; > > #Here $self is the button that was clicked. > > #How do I access the window that this button is part of? > > #I want to change certain parts of the window when the > > #button Start is clicked. > >} > > > >One way I figured out was declaring $window as a global variable. Then > all > >subroutines have access to it. > > > >Is there any other way? If the sub StartClick does not have access to the > >$window variable, is it possible to work back upwards from the button > $self > >and retrieve the window? And then modify parts of the window? > > Yes, there is another way, but... > > You'll either have to wait for the next version of win32-gui (which should > be soon), or build your own from CVS. There is a new method which can be > called on controls to return the parent window: GetParent, and a useful > associated method: UserData. So: > > sub StartClick > { > my $self = shift; > my $win = $self->GetParent; #returns a win32::gui window > $win->somecontrol->Text("Some string"); > } > > The UserData method is really useful as it allows you to assocate data to > a > window of control, allowing you to create an object from the window, with > instance data stored within the window. > > Cheers, > > jez. > > -- 5 GB Mailbox, 50 FreeSMS http://www.gmx.net/de/go/promail +++ GMX - die erste Adresse für Mail, Message, More +++ |
From: Rob <Ro...@4r...> - 2005-09-23 03:22:54
|
IERvZXMgYW55b25lIGtub3cgaG93IEkgY291bGQgY2VudGVyIG15IFdpbjMyOjpHVUk6OkdldE9w ZW5GaWxlTmFtZSBkaWFsb2cNCiBib3ggaW4gbXkgd2luZG93IHNheSAkd2luZG93X21haW4/DQog DQogICAgJGRpcmVjdG9yeV9hbmRfZmlsZV9uYW1lID0gV2luMzI6OkdVSTo6R2V0T3BlbkZpbGVO YW1lDQogICAgKA0KICAgICAgLW93bmVyICAgICA9PiAgJHdpbmRvd19tYWluICwNCiAgICAgIC1z aXplICAgICAgPT4gIFsgNDAwLCA0MDAgXSAsDQogICAgICAtZGlyZWN0b3J5ID0+ICAkZGlyZWN0 b3J5ICwNCiAgICAgIC1maWxlICAgICAgPT4gICRmaWxlICwNCiAgICAgIC10aXRsZSAgICAgPT4g ICdPcGVuJyAsDQogICAgICAtZmlsdGVyICAgID0+ICBbICdUZXh0IGZpbGVzJyAsICcqLnR4dCcg LCAnQWxsIGZpbGVzJyAsICcqLionIF0gLA0KICAgICkgOw0KDQpSb2INCg== |
From: Brian H. O. <win...@ac...> - 2005-09-24 17:09:54
|
Rob, I thought I would hang back and let a real guru answer your question, = but no real gurus seem to be stepping up to the plate so here I go: Win32::GUI::GetOpenFileName is a hook into a Windows system resource, it = is not a Win32::GUI object over which you have control. You (the = programmer) can't size it or position it at all. The system will = position it every time and, to the best of my knowledge, the system = places it exactly where the user left it the last time they called it up = -- with any program, not just your Win32::GUI application. Once again, I am not a guru... I've actually only been using Win32::GUI = for a few weeks, although I've been programming Perl on Win32 for years = now. If someone more knowledgeable than I wants to contradict anything = I've said here, I hope they will feel free to do so. YMMV, 'nuff said. Hope this helps, -Brian -----Original Message----- From: per...@li... = [mailto:per...@li...] On Behalf Of = Rob Sent: Thursday, September 22, 2005 21:23 To: per...@li... Subject: [perl-win32-gui-users] Centering Win32::GUI::GetOpenFileName = Dialog Box Does anyone know how I could center my Win32::GUI::GetOpenFileName = dialog box in my window say $window_main? =20 $directory_and_file_name =3D Win32::GUI::GetOpenFileName ( -owner =3D> $window_main , -size =3D> [ 400, 400 ] , -directory =3D> $directory , -file =3D> $file , -title =3D> 'Open' , -filter =3D> [ 'Text files' , '*.txt' , 'All files' , '*.*' ] = , ) ; Rob H=C2=B5=C5=A0=C2=B2=C2=B2uj=C2=A2z=C2=A2=C5=BEj=C5=BE=C3=82=02=E2=80=A6z=C5= =A0=C2=A6=C2=AE=0E=E2=80=93=C5=A0=C2=ADym=C2=B5v=C5=A0=C3=9A=C2=B2=C2=BE=C2= =A2z=C3=82=C5=B8=3D=E2=80=93=E2=80=A6=C2=B6k=C2=B6=C2=B2q=C2=AEzz=C5=A0=E2= =80=A0=C2=AE=C5=B8Pzj=C5=BE=C2=B2=C2=AE=C5=B8Pz=C5=A0=C2=B2q=C2=AEz=C3=98= m=C2=B6=E2=80=BA?=C3=BEX=C2=AC=C2=B6=C3=8B(=C2=BA=C2=B7=1E~=C5=A0=C3=A0zw= =C2=AD=C3=BEX=C2=AC=C2=B6=C3=8F=C3=A5=C5=A0=C3=8Bb=C2=9D=C3=BA?=C2=A5=C3=AA= =C3=A5=C3=82)=C3=B7=C3=9A =C2=A2=C2=BA=C3=87=C2=AB |
From: Ariel S. <as...@ya...> - 2005-09-25 04:36:28
|
I actually have a very similar question to Rob's, though I'm pretty sure that it warrants the same response. I'm writing an app to automate some menial tasks for some photographer friends. Since the app only opens images, I have set the filter for GetOpenFileName accordingly. It would be very nice to be able to have that dialog default to the thumbnail view. Does anyone know if this sort of thing is possible? I found this: http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ though, I'm not sure that it's relevant to the Win32::GUI way of doing things and probably involves some of that magical hooking that I occasionally see on here... -ariel --- "Brian H. Oak" <win...@ac...> wrote: > Rob, > > I thought I would hang back and let a real guru > answer your question, but no real gurus seem to be > stepping up to the plate so here I go: > > Win32::GUI::GetOpenFileName is a hook into a Windows > system resource, it is not a Win32::GUI object over > which you have control. You (the programmer) can't > size it or position it at all. The system will > position it every time and, to the best of my > knowledge, the system places it exactly where the > user left it the last time they called it up -- with > any program, not just your Win32::GUI application. > > Once again, I am not a guru... I've actually only > been using Win32::GUI for a few weeks, although I've > been programming Perl on Win32 for years now. If > someone more knowledgeable than I wants to > contradict anything I've said here, I hope they will > feel free to do so. YMMV, 'nuff said. > > Hope this helps, > > -Brian > > > -----Original Message----- > From: > per...@li... > [mailto:per...@li...] > On Behalf Of Rob > Sent: Thursday, September 22, 2005 21:23 > To: per...@li... > Subject: [perl-win32-gui-users] Centering > Win32::GUI::GetOpenFileName Dialog Box > > Does anyone know how I could center my > Win32::GUI::GetOpenFileName dialog > box in my window say $window_main? > > $directory_and_file_name = > Win32::GUI::GetOpenFileName > ( > -owner => $window_main , > -size => [ 400, 400 ] , > -directory => $directory , > -file => $file , > -title => 'Open' , > -filter => [ 'Text files' , '*.txt' , 'All > files' , '*.*' ] , > ) ; > > Rob > HµŠ²²uj¢z¢žjžÃâ¦zŠ¦®âÅ ÂymµvŠò¾¢zß=ââ¦Â¶k¶²q®zzÅ â ®ŸPzjž²®ŸPzŠ²q®zÃm¶âº?þX¦Ã(º·~Å Ã zwÂþX¦ÃåŠÃbÂú?¥êåÃ)ֈ > ¢ºÃ« > > > > ------------------------------------------------------- > SF.Net email is sponsored by: > Tame your development challenges with Apache's > Geronimo App Server. > Download it for free - -and be entered to win a 42" > plasma tv or your very > own Sony(tm)PSP. Click here to play: > http://sourceforge.net/geronimo.php > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > |
From: Robert M. <rm...@po...> - 2005-09-27 22:09:36
|
Rob wrote: > Does anyone know how I could center my > Win32::GUI::GetOpenFileName dialog > box in my window Ariel Serbin wrote: > It would be very nice to > be able to have that dialog default to the thumbnail > view. Brian wrote: > Win32::GUI::GetOpenFileName is a hook into a Windows > system resource, it is not a Win32::GUI object over > which you have control. You (the programmer) can't > size it or position it at all. The system will > position it every time and, to the best of my > knowledge, the system places it exactly where the > user left it the last time they called it up -- with > any program, not just your Win32::GUI application. Close. GetOpenFileName() is a function that displays a system dialog (from comdlg32.dll). Other 'common' dialogs are font choosers, color pickers etc. - you know, all those 'standard' dialogs. These dialogs are just windows, and if you can get the windows handle to them, you can manipulate them just like any other window (OK, this is a big generalisation, but is in, er, general, true). All the common dialogs also (at the Win32 api level) provide hooks(callbacks) just for this purpose (for example see the GetOpenFileName() documentation at http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getopenfilename.asp and look for the description of OFNHookProc). These callbacks are not supported by Win32::GUI (but could be), and would be the 'correct' way to do what you are trying to do. However, as with most perl and Win32 api things, TIMTOWTDI (There Is More Than One Way To Do It). For example, in the code below I take advantage of the fact that when the dialog is shown, it deactivates the main window; as a result of this the main window is sent a WM_WINDOWPOSCHANGE message (as it's z-order changes), and one of the parameters passed in this message is the handle to the window that is becoming active: the handle to the dialog - we can then use that to get the size, and set the position of the dialog. There is one problem that I haven't had the time to solve, and that's how to modify the logic, so that the dialog doesn't get forced to be centered on the main window regardless - try dragging it, and see how it 'snaps' back with this code. > http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ I haven't tested this, but replacing the moving code below with code to find the handle to the lsitview (using FindWindow()?), and then using a SendMessage call, using the values from figure 5 in the link above should set the view to what you want. Hope this helps. Please post back if you successfully solve any of the remaining problems. Regards, Rob. #!perl -w use strict; use warnings; use Win32::GUI; sub WM_WINDOWPOSCHANGING() {70} sub SWP_NOACTIVATE() {16} my $mw = Win32::GUI::Window->new( -title => "GetOpenFileName Test", -pos => [100,100], -size => [400,300], ); $mw->Hook(WM_WINDOWPOSCHANGING, \&PosChanging); $mw->AddButton( -text => "Browse ...", -pos => [10,10], -onClick => \&Browse, ); $mw->Show(); Win32::GUI::Dialog(); exit(0); sub Browse { Win32::GUI::GetOpenFileName( -owner => $mw, ); return; } sub PosChanging { my ($object, $wParam, $lParam, $type, $msgcode) = @_; return unless $type == 0; return unless $msgcode == WM_WINDOWPOSCHANGING; # unpack WINDOWPOS structure # http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowstructures/windowpos.asp my($hwnd, $hwndInsertAfter, $x, $y, $cx, $cy, $flags) = unpack("LLiiiiI", unpack("P28", pack("L",$lParam))); # check that it's us (this is probably not necessary) return unless $hwnd == $object->{-handle}; # check that the handle in $hwndInsertAfter is for the Open File dialog: # here I test the window caption, but you might need something more robust: return unless Win32::GUI::Text($hwndInsertAfter) eq "Open"; # only interested in doing something if we're being de-activated # for the first time: this test needs enhancing, so that dragging # the dialog works, and we don't move it back to the center when we # release the mouse return unless $flags & SWP_NOACTIVATE; # modify the Dialog (center it on the main window): my $sx = $mw->Left() + ($mw->Width() - Win32::GUI::Width($hwndInsertAfter))/2; my $sy = $mw->Top() + ($mw->Height() - Win32::GUI::Height($hwndInsertAfter))/2; Win32::GUI::Move($hwndInsertAfter, $sx, $sy); # set the view: # from http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ # 0x7029 Icons # 0x702B List # 0x702C Details # 0x702D Thumbnails # 0x702E Tiles # Find the listview handle: # my $lv_hwnd = ???? # Win32::GUI::SendMessage($lv_hwnd, WM_COMMAND, 0x702C, 0); return; } |
From: Ariel S. <as...@ya...> - 2005-09-28 01:34:20
|
Rob, Thanks for that email, which was very helpful. It seems like the callback method is the way to go with this one, at least for me. I just spent a long time trying to get the handle for the listview control in the file open dialog. Here are some things that I figured out while failing to change the view setting for that listview. 1. Win32::GUI::FindWindow only finds top level windows (which is what it says in the docs.) I had to install Win32::GuiTest to get the handle of the listview control in the Open dialog. 2. The event in that example is fired when the file open dialog opens, however GuiTest's FindWindowLike function doesn't seem to be finding the control at that point. When I click on the dialog, the event fires again and it finds the control. The SendMessage line that I used is the same as in the example, since I don't really get that part. Here is how I modified Rob's example: # at the top use Win32::GuiTest qw(FindWindowLike); #in the event handler my @lv_hwnd = FindWindowLike($hwndInsertAfter,undef,'SysListView32'); print "HWND: $lv_hwnd[0]\n"; Win32::GUI::SendMessage($lv_hwnd[0], WM_COMMAND, 0x702C, 0); anyone have thoughts on this? -ariel --- Robert May <rm...@po...> wrote: > Rob wrote: > > Does anyone know how I could center my > > Win32::GUI::GetOpenFileName dialog > > box in my window > > Ariel Serbin wrote: > > It would be very nice to > > be able to have that dialog default to the > thumbnail > > view. > > > Brian wrote: > > Win32::GUI::GetOpenFileName is a hook into a > Windows > > system resource, it is not a Win32::GUI object > over > > which you have control. You (the programmer) > can't > > size it or position it at all. The system will > > position it every time and, to the best of my > > knowledge, the system places it exactly where the > > user left it the last time they called it up -- > with > > any program, not just your Win32::GUI > application. > > Close. GetOpenFileName() is a function that > displays a system dialog > (from comdlg32.dll). Other 'common' dialogs are > font choosers, color > pickers etc. - you know, all those 'standard' > dialogs. > > These dialogs are just windows, and if you can get > the windows handle to > them, you can manipulate them just like any other > window (OK, this is a > big generalisation, but is in, er, general, true). > > All the common dialogs also (at the Win32 api level) > provide > hooks(callbacks) just for this purpose (for example > see the > GetOpenFileName() documentation at > http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getopenfilename.asp > and look for the description of OFNHookProc). These > callbacks are not > supported by Win32::GUI (but could be), and would be > the 'correct' way > to do what you are trying to do. However, as with > most perl and Win32 > api things, TIMTOWTDI (There Is More Than One Way To > Do It). > > For example, in the code below I take advantage of > the fact that when > the dialog is shown, it deactivates the main window; > as a result of > this the main window is sent a WM_WINDOWPOSCHANGE > message (as it's > z-order changes), and one of the parameters passed > in this message is > the handle to the window that is becoming active: > the handle to the > dialog - we can then use that to get the size, and > set the position of > the dialog. There is one problem that I haven't > had the time to solve, > and that's how to modify the logic, so that the > dialog doesn't get > forced to be centered on the main window regardless > - try dragging it, > and see how it 'snaps' back with this code. > > > > > http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ > > I haven't tested this, but replacing the moving code > below with code to > find the handle to the lsitview (using > FindWindow()?), and then using a > SendMessage call, using the values from figure 5 in > the link above > should set the view to what you want. > > Hope this helps. Please post back if you > successfully solve any of the > remaining problems. > > Regards, > Rob. > > #!perl -w > use strict; > use warnings; > > use Win32::GUI; > > sub WM_WINDOWPOSCHANGING() {70} > sub SWP_NOACTIVATE() {16} > > my $mw = Win32::GUI::Window->new( > -title => "GetOpenFileName Test", > -pos => [100,100], > -size => [400,300], > ); > $mw->Hook(WM_WINDOWPOSCHANGING, \&PosChanging); > > $mw->AddButton( > -text => "Browse ...", > -pos => [10,10], > -onClick => \&Browse, > ); > > $mw->Show(); > Win32::GUI::Dialog(); > exit(0); > > sub Browse > { > Win32::GUI::GetOpenFileName( > -owner => $mw, > ); > > return; > } > > sub PosChanging > { > my ($object, $wParam, $lParam, $type, $msgcode) = > @_; > return unless $type == 0; > return unless $msgcode == WM_WINDOWPOSCHANGING; > > # unpack WINDOWPOS structure > # > http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowstructures/windowpos.asp > my($hwnd, $hwndInsertAfter, $x, $y, $cx, $cy, > $flags) = > unpack("LLiiiiI", unpack("P28", > pack("L",$lParam))); > > # check that it's us (this is probably not > necessary) > return unless $hwnd == $object->{-handle}; > > # check that the handle in $hwndInsertAfter is for > the Open File dialog: > # here I test the window caption, but you might > need something more robust: > return unless Win32::GUI::Text($hwndInsertAfter) eq > "Open"; > > # only interested in doing something if we're being > de-activated > # for the first time: this test needs enhancing, so > that dragging > # the dialog works, and we don't move it back to > the center when we > # release the mouse > return unless $flags & SWP_NOACTIVATE; > > # modify the Dialog (center it on the main window): > my $sx = $mw->Left() + ($mw->Width() - > Win32::GUI::Width($hwndInsertAfter))/2; > my $sy = $mw->Top() + ($mw->Height() - > Win32::GUI::Height($hwndInsertAfter))/2; > Win32::GUI::Move($hwndInsertAfter, $sx, $sy); > > # set the view: > # from > http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ > # 0x7029 Icons > # 0x702B List > # 0x702C Details > # 0x702D Thumbnails > # 0x702E Tiles > > # Find the listview handle: > # my $lv_hwnd = ???? > # Win32::GUI::SendMessage($lv_hwnd, WM_COMMAND, > 0x702C, 0); > > return; > } > > > ------------------------------------------------------- > This SF.Net email is sponsored by: > Power Architecture Resource Center: Free content, > downloads, discussions, > and more. > http://solutions.newsforge.com/ibmarch.tmpl > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > |
From: Robert M. <rm...@po...> - 2005-09-29 21:36:25
|
Ariel Serbin wrote: > 1. Win32::GUI::FindWindow only finds top level windows > (which is what it says in the docs.) The docs are correct! I was thinking of FindWindowEx, which is not in Win32::GUI. > I had to install > Win32::GuiTest to get the handle of the listview > control in the Open dialog. There's some code below to show a way of walking the window hierarchy using GetWindow() - although EnumChildWindows() is safer according to msdn. > 2. The event in that example is fired when the file > open dialog opens, however GuiTest's FindWindowLike > function doesn't seem to be finding the control at > that point. When I click on the dialog, the event > fires again and it finds the control. It appears that the dialog has not finished initialising the first time the dialog sends the WM_WINDOWPOSCHANGING message. There is another message sent by the dialog: WM_ENTERIDLE, which is sent every time the dialog's message loop finishes processing all the messages in its queue. By Hook()ing that message, we get to do our processing after everything is initialised fully. I've also moved the Hook() call to just before we do the GetOpenFileName() call, and I UnHook() the message as soon as we see one - this ensures that we only position the dialog and set the view mode once each time we display it. (UnHook() causes a warning on my perl 5.8.7, Win32::GUI 1.02 - I raised a tracker for this some time ago). [If the warnings irritate you, then a similar effect could be achieved with a global variable set to 0 in the Browse function, and set to 1 in the Idle function, with a test at the start of the Idle function.] Regards, Rob. #!perl -w use strict; use warnings; use Win32::GUI; sub WM_WINDOWPOSCHANGING() {70} sub WM_ENTERIDLE() {289} sub SWP_NOACTIVATE() {16} sub MSGF_DIALOGBOX() {0} my $mw = Win32::GUI::Window->new( -title => "GetOpenFileName Test", -pos => [100,100], -size => [400,300], ); $mw->AddButton( -text => "Browse ...", -pos => [10,10], -onClick => \&Browse, ); $mw->Show(); Win32::GUI::Dialog(); exit(0); sub Browse { $mw->Hook(WM_ENTERIDLE, \&Idle); Win32::GUI::GetOpenFileName( -owner => $mw, ); return; } sub Idle { print "Idle hook\n"; $mw->UnHook(WM_ENTERIDLE); # ensure this hook doesn't get called again my ($object, $wParam, $lParam, $type, $msgcode) = @_; return unless $type == 0; return unless $msgcode == WM_ENTERIDLE; # check the message came from a dialog box return unless $wParam == MSGF_DIALOGBOX; # check that the dialog window handle in $lParam is for the Open File dialog: # here I test the window caption, but you might need something more robust: return unless Win32::GUI::Text($lParam) eq "Open"; # modify the Dialog (center it on the main window): my $sx = $mw->Left() + ($mw->Width() - Win32::GUI::Width($lParam))/2; my $sy = $mw->Top() + ($mw->Height() - Win32::GUI::Height($lParam))/2; Win32::GUI::Move($lParam, $sx, $sy); # Walk the child windows of the open dialog to find the SHELLDLL_DefView window: my $phwnd = $lParam; my $mode = GW_CHILD; # Initially find the first child of the dialog window while(my $chwnd = Win32::GUI::GetWindow($phwnd, $mode)) { if (Win32::GUI::GetClassName($chwnd) eq "SHELLDLL_DefView") { # set the view: # from http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ # 0x7029 Icons # 0x702B List # 0x702C Details # 0x702D Thumbnails # 0x702E Tiles Win32::GUI::SendMessage($chwnd, WM_COMMAND, 0x702C, 0); last; # we found it } $mode = GW_HWNDNEXT; # and walk the rest of the dialog's children $phwnd = $chwnd; } return; } |
From: Ariel S. <as...@ya...> - 2005-10-09 21:51:38
|
GUI users, i'd appreciate it if someone more knowlegable could please have a look at the following code. i adapted it from the example that rob sent, but i keep getting a usage error on the hook line (in open_thumbnails), which says that it needs to be passed (handle, msg, codref). you'll see that i have a commented hook command that passes the $win object. when i run that line, then i get a usage error that says only to pass the msg and the coderef. does anyone have any idea what's going on here? thanks, -ariel. use Win32::GUI; use Win32::API; use Win32::GUI::Loft::Design; sub WM_WINDOWPOSCHANGING() {70} sub WM_ENTERIDLE() {289} sub SWP_NOACTIVATE() {16} sub MSGF_DIALOGBOX() {0} my $win = Win32::GUI::Window->new( -name => 'win', -text => 'test', -left => 10, -top => 10, -width => 250, -height => 250, ); $win->AddButton( -name => 'button', -text => 'button', -left => 10, -top => 10, -onClick => \&open_thumbnails, ); $win->Center; $win->Show; Win32::GUI::Dialog(); sub open_thumbnails { #$win->Hook($win, WM_ENTERIDLE, \&Idle($win)); $win->Hook(WM_ENTERIDLE, \&Idle($win)); my $files = Win32::GUI::GetOpenFileName( -owner => $win, ); return $files; } sub Idle { $win->UnHook(WM_ENTERIDLE); # ensure this hook doesn't get called again my ($object, $wParam, $lParam, $type, $msgcode) = @_; return unless $type == 0; return unless $msgcode == WM_ENTERIDLE; # check the message came from a dialog box return unless $wParam == MSGF_DIALOGBOX; # check that the dialog window handle in $lParam is for the Open File dialog: # here I test the window caption, but you might need something more robust: return unless Win32::GUI::Text($lParam) eq "Open"; # modify the Dialog (center it on the main window): my $sx = $win->Left() + ($win->Width() - Win32::GUI::Width($lParam))/2; my $sy = $win->Top() + ($win->Height() - Win32::GUI::Height($lParam))/2; Win32::GUI::Move($lParam, $sx, $sy); # Walk the child windows of the open dialog to find the SHELLDLL_DefView window: my $phwnd = $lParam; my $mode = GW_CHILD; # Initially find the first child of the dialog window while(my $chwnd = Win32::GUI::GetWindow($phwnd, $mode)) { if (Win32::GUI::GetClassName($chwnd) eq "SHELLDLL_DefView") { # set the view: # from http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ # 0x7029 Icons # 0x702B List # 0x702C Details # 0x702D Thumbnails # 0x702E Tiles Win32::GUI::SendMessage($chwnd, WM_COMMAND, 0x702D, 0); last; # we found it } $mode = GW_HWNDNEXT; # and walk the rest of the dialog's children $phwnd = $chwnd; } return; } 1; |
From: Jeremy W. <jez...@ho...> - 2005-10-10 08:01:16
|
>command that passes the $win object. when i run that >line, then i get a usage error that says only to pass >the msg and the coderef. does anyone have any idea >what's going on here? > #$win->Hook($win, WM_ENTERIDLE, \&Idle($win)); Try: $win->Hook(WM_ENTERIDLE, \&Idle($win)); When called as a method the first paramater is the window, ie: Win32::GUI::Hook($win,WM_ENTERIDLE, \&Idle($win)); As you are passing a win32::GUI object, Hook will get the handle from the object. Cheers, jez. |
From: Ariel S. <as...@ya...> - 2005-10-10 16:10:44
Attachments:
hooktest.pl.txt
|
Thanks for the reply, but I'm still getting the usage errors with this script, no matter how I call Hook. With the attached file, I tried these 3 ways of calling it: #$win->Hook($win, WM_ENTERIDLE, \&Idle($win)); #$win->Hook(WM_ENTERIDLE, \&Idle($win)); Win32::GUI::Hook($win,WM_ENTERIDLE, \&Idle($win)); The strange thing is that the hook works in the example that Rob sent out (last week, I think). Am I missing something here? thanks, -ariel --- Jeremy White <jez...@ho...> wrote: > > >command that passes the $win object. when i run > that > >line, then i get a usage error that says only to > pass > >the msg and the coderef. does anyone have any idea > >what's going on here? > > > #$win->Hook($win, WM_ENTERIDLE, \&Idle($win)); > > Try: > > $win->Hook(WM_ENTERIDLE, \&Idle($win)); > > When called as a method the first paramater is the > window, ie: > > Win32::GUI::Hook($win,WM_ENTERIDLE, \&Idle($win)); > > As you are passing a win32::GUI object, Hook will > get the handle from the > object. > > Cheers, > > jez. > > > |
From: Jeremy W. <jez...@ho...> - 2005-10-11 08:20:18
|
>Thanks for the reply, but I'm still getting the usage >errors with this script, no matter how I call Hook. >With the attached file, I tried these 3 ways of >calling it: > >#$win->Hook($win, WM_ENTERIDLE, \&Idle($win)); >#$win->Hook(WM_ENTERIDLE, \&Idle($win)); >Win32::GUI::Hook($win,WM_ENTERIDLE, \&Idle($win)); > >The strange thing is that the hook works in the >example that Rob sent out (last week, I think). Am I >missing something here? try $win->Hook(WM_ENTERIDLE, \&Idle); Cheers, jez. |
From: Ariel S. <as...@ya...> - 2005-10-10 20:43:10
|
GUI Users, The law firm that I work for is expanding its tech department (i.e. me and the other guy) and has several large programming projects on the horizon. The most notable of these projects is a new case management system, which will be a large, complicated Windows program (or possibly a suite of programs) with a nice, friendly UI. I have written a number of smaller tools using Win32::GUI and would very much like to use it to build this next project. In short, I'm looking for a programmer that is capable of helping with these kinds of tasks. The ideal person would be haunting this list, which is why I wanted to post this here before I put it up on the job sites. If you're near Philadelphia and would like to get paid to work on/with Win32::GUI, please check out the post below. -ariel Full Time/Permanent On-Site Position: Senior Perl Developer The Philadelphia office of an internationally recognized premier law firm is seeking a Senior Level Perl Programmer with SQL database, Windows GUI, and Web development experience. Expert level Perl skills are a must. Fluency in SQL/DBI is required as well as a solid grasp of database design, maintenance and optimization. Experience with Windows, OOP, CGI, LWP and GUI programming is also necessary. VB/C++ skills are a plus. Strong communications skills, a professional demeanor, clean coding technique, and the generation of clear code documentation are mandatory for this position. Willingness to also assist with network and help desk issues. A Comprehensive background check will be performed. Please submit your resume including: 3 professional references Salary History Salary Requirement |