Of course not. It kept getting later, and I kept getting tireder. When
I sent that message, I forgot that I renamed my file, so I could see the
one in CVS again.
Oops.
This morning when I woke up, I realized I should add a couple more
comments, also.
Thanks for noticing. And sorry for the confusion. I kept learning
more, but I kept making silly mistakes too.
On approximately 6/1/2004 1:57 AM, came the following characters from
the keyboard of Jez White:
Hi,
Is this the correct version? The resize event is the same as the
original?
Cheers,
jez.
----- Original Message ----- From: "Glenn Linderman" <[EMAIL PROTECTED]>
To: "Jez White" <[EMAIL PROTECTED]>
Sent: Tuesday, June 01, 2004 9:38 AM
Subject: another code revision
Hi Jez,
I left some debug and try this sort of code in my last email. Here
is the code without such. Sorry for 3 versions before I got the
whole message across. I think the text is reasonable, although I
learned more as I wrote each message.
--
Glenn -- http://nevcal.com/
===========================
The best part about procrastination is that you are never bored,
because you have all kinds of things that you should be doing.
------------------------------------------------------------------------
#This example creates a scrolling bitmap within another window. This example
#uses a hooked event to paint to the window directly, rather than using a
#Graphic Control.
use Win32::GUI;
use strict;
sub Paint {
#Paint event handler, called when ever the window needs to be redrawn/painted
#get the window that needs to be repainted, in this case it is the child
window
my $mdc=shift;
my $win=shift;
#tell windows that we are starting to paint
$win->BeginPaint;
#get the DC of this window
my $dc=$win->GetDC;
#Perform a bit block transfer of the memory DC into the window DC
#The cordinates are based upon the position of the scroll bars
$dc->BitBlt(0, 0,
$win->Width,$win->Height,$mdc,$win->ScrollPos(0),$win->ScrollPos(1));
#tell windows that we have finished painting.
$win->EndPaint;
return 1;
}
sub AdjScroll {
my $bmap=shift;
my $cwin=shift;
my ($cwid, $chei) = ($cwin->GetClientRect)[2..3];
#Set the scroll bar page of each scroll bar.
#This has the effect of increasing/decreasing the size of the bar within the
#scroll bar as the window is resized.
if ($bmap) {
my ($width,$height)=$bmap->Info();
while (1) {
#the ScrollPage calls might trigger a Resize event, so this code might
#run reentrantly. To be sure we don't use old data later and overwrite
#newer data, we reobtain the ClientRect after each operation that might
#change it.
$cwin->ScrollPage(0,$cwid);
my ($cwidA, $cheiA) = ($cwin->GetClientRect)[2..3];
$cwin->ScrollPage(1,$cheiA);
my ($cwid2,$chei2) = ($cwin->GetClientRect)[2..3];
my ($cwid3,$chei3) = ($cwin->Width,$cwin->Height);
last if $cwid == $cwid2 && $chei == $chei2;
($cwid,$chei) = ($cwid2,$chei2);
}
}
}
sub Resize {
#Resize handler, get the window
my $bmap=shift;
my $cwin=shift;
& AdjScroll($bmap,$cwin);
return 1;
}
sub OpenBitmap {
my ($bmap,$mdc,$cwin) = @_;
#Function to load in the bitmap
my $file = Win32::GUI::GetOpenFileName(
-owner => $cwin,
-hidereadonly => 0,
-title => "Open an bitmap file",
-filter => ['Bitmaps' => '*.bmp',
'All files' => '*.*',
],
);
$bmap=new Win32::GUI::Bitmap($file);
$_[0]=$bmap; # set original parameter
if ($bmap) {
#if we have a valid bitmap, get the dimensions
my ($width,$height)=$bmap->Info();
#select the bitmap into the memory DC so it can be manipulated later.
$mdc->SelectObject($bmap);
#set the scroll bars to 0.
$cwin->ScrollRange(0,0,$width);
$cwin->ScrollRange(1,0,$height);
$cwin->ScrollPos(0,0);
$cwin->ScrollPos(1,0);
& AdjScroll($bmap,$cwin);
$cwin->InvalidateRect(1); #invalidate the child window so windows triggers
the paint event
}
return 1;
}
sub Scroll {
#Scroll event handler. We have to explicitly "move" the scroll bars.
#Once they have been moved, we repaint the window.
my($win,$scrollbar, $operation, $position) = @_;
if($operation == SB_THUMBTRACK) {
$win->ScrollPos($scrollbar,$position);
}
elsif($operation == SB_LINEDOWN) {
$win->ScrollPos($scrollbar,$win->ScrollPos($scrollbar)+1);
}
elsif($operation == SB_LINEUP) {
$win->ScrollPos($scrollbar,$win->ScrollPos($scrollbar)-1);
}
elsif($operation == SB_PAGEDOWN) {
$win->ScrollPos($scrollbar,$win->ScrollPos($scrollbar) +
$win->ScrollPage($scrollbar));
}
elsif($operation == SB_PAGEUP) {
$win->ScrollPos($scrollbar,$win->ScrollPos($scrollbar) -
$win->ScrollPage($scrollbar));
}
#invalidate the child window so windows triggers the paint event
$win->InvalidateRect(0);
return 1;
}
#create a new class which stops the WM_ERASEBKGND message from erasing the
#background this stops the flicker of the window on resize.
my $WC = new Win32::GUI::Class(
-name => "NoFlicker",
-style => 0,
);
#Define global variable
my $bitmap; #will hold the bitmap
sub MainResize {
my $win=shift;
my ($width, $height) = ($win->GetClientRect)[2..3];
$win->Open->Left($width-120);
$win->ChildWin->Resize($width-150,$height);
return 1;
}
#Create the window and child controls.
my $mainwin = new Win32::GUI::Window (
-pos => [100, 100],
-size => [330, 235],
-name => "Window",
-text => "Bitmap Scroll demo",
-pushstyle => WS_CLIPCHILDREN,
-class => $WC,
#NEM Events for this window
-onResize => \&MainResize,
-onTerminate => sub {return -1;}
);
#Create a child window with a scroll bars.
my $ChildWin = new Win32::GUI::Window (
-parent => $mainwin,
-name => "ChildWin",
-pos => [0, 0],
-size => [180, 235],
-popstyle => WS_CAPTION | WS_SIZEBOX,
-pushstyle => WS_CHILD | WS_CLIPCHILDREN,
-pushexstyle => WS_EX_CLIENTEDGE,
-class => $WC,
-hscroll => 1,
-vscroll => 1,
-onScroll => \&Scroll,
-onResize => sub {&Resize($bitmap,@_)},
);
#Create a memory DC compatible with the child window DC
my $memdc=$ChildWin->GetDC->CreateCompatibleDC();
$mainwin->AddButton (
-name => 'Open',
-pos => [205, 20],
-size => [110, 20],
-text => 'Open Bitmap',
-onClick => sub{ &OpenBitmap( $bitmap, $memdc, $ChildWin, @_ ) },
);
#hook into the paint event of the child window
$ChildWin->Hook(15, sub { &Paint( $memdc, @_ )});
#show both windows and enter the Dialog phase.
$mainwin->Show();
$ChildWin->Show();
Win32::GUI::Dialog();