Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^4: Win32::GUI: how to find BrowseForFolder()'s handle?

by HelenCr (Monk)
on Sep 22, 2012 at 06:58 UTC ( #995064=note: print w/ replies, xml ) Need Help??


in reply to Re^3: Win32::GUI: how to find BrowseForFolder()'s handle?
in thread Win32::GUI: how to find BrowseForFolder()'s handle?

The code piece was just a code snippet, to illustrate the problem. Obviously in the OP it was not intended as a complete program. (See new code example below).

To recall the two problems:

1. The "BrowseForFolder()" window does not show up at the foreground, while all other windows do. This is disturbing and annoying, and can lead to many problems.

Here is a complete (compileable and running) code example. (5.014 is not essential)

use strict; use warnings; use 5.014; use Win32::GUI(); use Win32::GUI qw{ WS_EX_TOPMOST}; my ($InputDir, $TopDir, $InputFileName, $dw, $dh, $desktop, $Window); $TopDir = 'D:\My documents'; # Change this to an existing direcotry + of yours $desktop = Win32::GUI::GetDesktopWindow(); $dw = Win32::GUI::Width($desktop); $dh = Win32::GUI::Height($desktop); $Window = Win32::GUI::Window->new( -name => 'main', -text => 'Main win +dow', -pos => [20/100*$dw, 20/100*$dh], -size => [50/100*$dw, 60/100 +*$dh], -onTerminate => \&TerminateWindow, -addexstyle => WS_EX_TOPMOST, -dialogui => 1, -tabstop => 1 +, -cancel => 1, ); $Window -> AddButton ( -name => 'ButtonCommit', -pos => [10,10], -size =>[16/100*$dw,3.5/100*$dh], -text => 'Commit changes', -onCl +ick => \&Commit); sub Commit { $InputDir = Win32::GUI::BrowseForFolder( -root => $TopDir, -includefil +es => 1, -title => 'Select directory for parameter file', -text =>'Selext directory for parameter file', -size => [50/100*$dw, 50/100*$dh], -addexstyle => +WS_EX_TOPMOST,); $InputFileName = Win32::GUI::GetOpenFileName( -title => 'Select the i +nput file', -directory => $InputDir, -file => "\0" . " " x 256, -filter => ["Text files (*.txt)" => "*.txt", "All files", "*.* +", ], -text => 'text Select input file'); } # end sub Commit $Window ->Show(); Win32::GUI::Dialog(); sub TerminateWindow { return -1; }

Click the "Commit changes" button, then minimize the main window. Note that the "BrowseForFolder()" window hides behind other windows, and you need to minimize other windows to get to it. All other Perl Win32::GUI windows do open up at the foreground. Furthermore, note that -addexstyle => WS_EX_TOPMOST doesn't have an effect, while it usually does in Perl Win32::GUI windows.

Note: change the 'D:\My documents' to an existing directory of yours.

2. How does one find the desktop windows handles? If we could find BrowseForFolder()'s handle, we could raise it to the foreground (how?)

Many TIA

Helen


Comment on Re^4: Win32::GUI: how to find BrowseForFolder()'s handle?
Download Code
Re^5: Win32::GUI: how to find BrowseForFolder()'s handle?
by Anonymous Monk on Sep 22, 2012 at 08:00 UTC

    First some notes SSCCE (its like noise )

    Here is a complete (compileable and running) code example.

    Thanks. I see what you're talking about now. You can fix this by removing

    -addexstyle => WS_EX_TOPMOST,
    from $window/Main Window

    :D

    That may or may not be what you want, but its a fix ;D

    2. How does one find the desktop windows handles? If we could find BrowseForFolder()'s handle, we could raise it to the foreground (how?)

    If you wonder how it works, UTSL http://cpansearch.perl.org/src/ROBERTMAY/Win32-GUI-1.06/GUI.xs

    Would you look at that # -owner => WINDOW

    Yup, specifying   -owner => $Window, does the trick (it works), no WS_EX_TOPMOST required

      Thank you. That was instructive, and it actually solves the issue.

      (SSCCE and UTSL are instructive too - learned something new).

      A follow-up question: the role of the "-owner" option is not clear to me. Why and when is it necessary, and why does it fix the problem?

      TIA Helen

        A follow-up question: the role of the "-owner" option is not clear to me. Why and when is it necessary, and why does it fix the problem?

        It is necessary whenever you're using the functional interface

        If you had used $Window->BrowseForFolder() it would have happened automagically

        It lets the windowing system/ window manager, decide correctly to allow children of parent to display on top of parent , in effect it propagates the WS_EX_TOPMOST flag to the children

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (15)
As of 2014-08-28 16:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (264 votes), past polls