From: zak <cho...@gm...> - 2008-06-22 07:26:06
|
hi i have discovered a two valuable "secret" tutorials by "Robert May" : Drawing (Part 1): http://www.mail-archive.com/per...@li.../msg05194.html Drawing (Part 2) : http://www.mail-archive.com/per...@li.../msg05195.html found also on sourceforge.net site. this is another response to the previous "rpnoble" question with a title: Taking action after the call to Win32::GUI::Dialog() i will refer to the tutorial Drawing (Part 2): it contains an example about how to draw something on a click of a button, and how to refresh the screen by copying the screen to memory then from memory to screen in the refresh event if required, the example are fully documented, i wish it is encluded in the examples with the win32gui package with a name such as DrawOnClick.pl below i will copy the codes from that example with a small variations to launch a windows with a green color, then when we click a button it will draw a sine wave function and a blue rectangle, there is also a cls button. the draw will not be erased when we cover the window with another window. the dimensions are for 640x480 screen . use Win32::GUI; use warnings; use strict; use Win32::GUI qw( CW_USEDEFAULT RDW_VALIDATE RDW_NOCHILDREN COLOR_3DFACE ); # The size of the memory DC we will create to draw into my ($WIDTH, $HEIGHT) = (640, 480); my $mw = Win32::GUI::Window->new( -title => 'Draw on click example', -left => CW_USEDEFAULT, -size => [ 640, 480 ], -onPaint => \&paint, ); $mw->AddButton( -name => "Button1", -text => "RUN ", -pos => [ 0, 0 ], -onClick => \&click, ); $mw->AddButton( -name => "Button2", -text => "CLS ", -pos => [ 0, 30 ], ); # Create a memory DC to act as a buffer into which we'll # do our drawing; then in the paint handler we'll just bitblt() # from the memory DC to the screen. my $memDC; my $mem_bitmap; { my $dc = $mw->GetDC(); $memDC = $dc->CreateCompatibleDC(); $mem_bitmap = $dc->CreateCompatibleBitmap($WIDTH, $HEIGHT); } my $memDC_orig_state = $memDC->Save(); $memDC->SelectObject($mem_bitmap); # Draw into the memory DC FormLoadColor($memDC); # to paint the windows with green color $mw->Show(); Win32::GUI::Dialog(); # Tidy up $memDC->Restore($memDC_orig_state); Win32::GUI::DC::DeleteObject($mem_bitmap); Win32::GUI::DC::DeleteDC($memDC); exit(0); sub paint { my ($self, $dc) = @_; my $saved = $dc->Save(); { my($l, $t, $r, $b) = $dc->GetUpdateRect(1); if(defined $l) { my $clip_rgn = Win32::GUI::Region->CreateRectRgn($l, $t, $r, $b); $dc->SelectClipRgn($clip_rgn); } # Validate the whole window $self->Redraw(RDW_VALIDATE | RDW_NOCHILDREN); } $dc->BitBlt(0,0,$WIDTH,$HEIGHT, $memDC, 0,0); $dc->Restore(); return 1; } sub click { my ($self) = @_; MyDraw($memDC); $self->GetParent->InvalidateRect(1); return 1; } sub MyDraw { my ($dc) = @_; # Erase the background - COLOR_3DFACE is the window # background color my @colrB = "210,251,125"; #color of background my @colrBR= map { split ',', $_ } @colrB; $dc->FillRect( 0,0,$WIDTH,$HEIGHT, #Win32::GUI::Brush->new( -system => COLOR_3DFACE ) ); Win32::GUI::Brush->new( [@colrBR]) ); # Do our (complex) drawing @colrB = "98,89,249"; #color of rectangle my $x=0; my $y=250; @colrBR= map { split ',', $_ } @colrB; my $P = new Win32::GUI::Pen( -color => [ @colrBR], -width => 1, ); my $B = new Win32::GUI::Brush( [@colrBR] ); my $oldP = $dc->SelectObject($P); my $oldB = $dc->SelectObject($B); $dc->Rectangle(70, 60, 300, 200); my @colrF = "245, 56, 10"; #color of the Plot my $pointsize = "1"; my @colrFR= map { split ',', $_ } @colrF; my $pi = 3.1415926; for ($x = -(4*$pi); $x <= +(4*$pi); $x += 0.1) { $P = new Win32::GUI::Pen( -color => [ @colrFR], -width => 1, ); $B = new Win32::GUI::Brush( [ @colrFR] ); $oldP = $dc->SelectObject($P); $oldB = $dc->SelectObject($B); $y = sin($x); my $x1 = $x*20 + 250; $y = $y*30 + 250; $dc->Circle($x1, $y,$pointsize); } return; } sub FormLoadColor { my ($dc) = @_; # Erase the background - COLOR_3DFACE is the window # background color my @colrB = "210,251,125"; #color of background my @colrBR= map { split ',', $_ } @colrB; $dc->FillRect( 0,0,$WIDTH,$HEIGHT, #Win32::GUI::Brush->new( -system => COLOR_3DFACE ) ); Win32::GUI::Brush->new( [@colrBR]) ); } sub Button2_Click { my $dc = $mw->GetDC; # Erase the background - COLOR_3DFACE is the window # background color $dc->FillRect( 0,50,$WIDTH,$HEIGHT, Win32::GUI::Brush->new( -system => COLOR_3DFACE ) ); } __END__ |