# perl -w # # Drawing sample # use strict; use warnings; use Win32::GUI(); my $Menu = Win32::GUI::MakeMenu( "&Draw" => "&Draw", "> &Dots" => "DrawDots", "> &Lines" => "DrawLines", "> &Boxes" => { -name => "DrawBoxes", -checked => 1 }, "> &Circles" => "DrawCircles", ); my $Win = new Win32::GUI::Window( -left => 100, -top => 100, -width => 300, -height => 300, -name => "Window", -text => "Win32::GUI drawing demo", -menu => $Menu, ); my $Timer = $Win->AddTimer("Timer1", 1); srand(); $Win->Show(); Win32::GUI::Dialog(); sub Window_Terminate { return -1; } sub DrawDots_Click { $Menu->{DrawDots}->Checked(1); $Menu->{DrawLines}->Checked(0); $Menu->{DrawBoxes}->Checked(0); $Menu->{DrawCircles}->Checked(0); $Win->InvalidateRect(1); } sub DrawLines_Click { $Menu->{DrawDots}->Checked(0); $Menu->{DrawLines}->Checked(1); $Menu->{DrawBoxes}->Checked(0); $Menu->{DrawCircles}->Checked(0); $Win->InvalidateRect(1); } sub DrawBoxes_Click { $Menu->{DrawDots}->Checked(0); $Menu->{DrawLines}->Checked(0); $Menu->{DrawBoxes}->Checked(1); $Menu->{DrawCircles}->Checked(0); $Win->InvalidateRect(1); } sub DrawCircles_Click { $Menu->{DrawDots}->Checked(0); $Menu->{DrawLines}->Checked(0); $Menu->{DrawBoxes}->Checked(0); $Menu->{DrawCircles}->Checked(1); $Win->InvalidateRect(1); } sub Timer1_Timer { my $W = $Win->ScaleWidth; my $H = $Win->ScaleHeight; my $DC = $Win->GetDC; my $left; my $top; my $right; my $bottom; my $P; my $oldP; my $B; my $oldB; if($Menu->{DrawDots}->Checked) { for(1..20) { $DC->SetPixel( rand()*$W, rand()*$H, [ rand()*255, rand()*255, rand()*255 ], ); } } elsif($Menu->{DrawBoxes}->Checked) { $P = new Win32::GUI::Pen( -color => [ rand()*255, rand()*255, rand()*255 ], -width => rand()*5, ); $B = new Win32::GUI::Brush( [ rand()*255, rand()*255, rand()*255 ] ); $oldP = $DC->SelectObject($P); $oldB = $DC->SelectObject($B); $left = rand()*$W; $top = rand()*$H; $right = $left + rand()*($W-$left); $bottom = $top + rand()*($H-$top); $DC->Rectangle($left, $top, $right, $bottom); } elsif($Menu->{DrawCircles}->Checked) { $P = new Win32::GUI::Pen( -color => [ rand()*255, rand()*255, rand()*255 ], -width => rand()*5, ); $B = new Win32::GUI::Brush( [ rand()*255, rand()*255, rand()*255 ] ); $oldP = $DC->SelectObject($P); $oldB = $DC->SelectObject($B); $left = rand()*$W; $top = rand()*$H; $right = $left + rand()*($W-$left); $bottom = $top + rand()*($H-$top); $DC->Ellipse($left, $top, $right, $bottom); } elsif($Menu->{DrawLines}->Checked) { $P = new Win32::GUI::Pen( -color => [ rand()*255, rand()*255, rand()*255 ], -width => rand()*5, ); $oldP = $DC->SelectObject($P); $DC->BeginPath(); $DC->MoveTo(rand()*$W, rand()*$H); $DC->LineTo(rand()*$W, rand()*$H); $DC->EndPath(); $DC->StrokePath(); } # put the old brush/pen back, so that the new ones are correctly # released when their destructors are called $DC->SelectObject($oldP) if defined $oldP; $DC->SelectObject($oldB) if defined $oldB; }