On 16/04/07, Perl Rob <[EMAIL PROTECTED]> wrote:
I'm using the "-topmost" option on my window to make it start out always on
top. However, I'd like to provide a check box (labeled "Always on top" and
checked by default) that allows the user to toggle whether the window stays
on top or doesn't. Unfortunately, I can't get the change to take effect.
Below is the code I'm trying. What am I doing wrong (or is this even
possible)?

sub AlwaysOnTop_Click
{
    $aot_state = $aot_check_box->GetCheck();
    if ($aot_state == 0)
    {
            Win32::GUI::Change($main, -topmost => 0);
    }

[snip]

Unfortunately -topmost is one of a small number of things that you
can't simply Change() after creating a window (all the topmost option
does is toggle the WS_EX_TOPMOST flag, which is documented by MS as
not the way to do it).

The 'correct' way to change the topmost state of a window is using the
SetWindowPos() method.  Here's some code:

#!perl -w
use strict;
use warnings;

use Win32::GUI qw(CW_USEDEFAULT HWND_TOPMOST HWND_NOTOPMOST
                            SWP_NOMOVE SWP_NOSIZE);

my $appname = 'Test App';

my $mw = Win32::GUI::Window->new(
      -title => $appname,
      -left  => CW_USEDEFAULT,
      -size  => [300,200],
);

$mw->AddCheckbox(
      -text    => 'Topmost',
      -pos     => [10,10],
      -onClick => \&set_topmost,
);

$mw->Show();
Win32::GUI::Dialog();
$mw->Hide();
exit(0);

sub set_topmost {
      my ($self) = @_;

      my $title = $appname;
      my $hwnd_after = HWND_NOTOPMOST;

      if ($self->Checked()) {
              $title .= ' - Topmost';
              $hwnd_after = HWND_TOPMOST;
      }

      $self->GetParent()->Text($title);
      $self->GetParent()->SetWindowPos($hwnd_after, 0,0,0,0,
                                                 SWP_NOMOVE|SWP_NOSIZE);

      return 0;
}
__END__

Regards,
Rob.

Reply via email to