Drawing problem

Keith Brown <[email protected]> Thu, 1 Dec 2016 13:30:50 -0600
Newsgroups gmane.comp.lang.perl.wxperl
Message-ID <[email protected]>
I'm developing a perl-based program for the sciences that does some 
quantum calculations. I'd like to be able to take the results of the 
calculations and draw a spectrum corresponding to the resulting numbers 
so I've coded a child window with a dc and draw the spectrum in it. The 
problem is, the first time I open the window and draw the spectrum it 
works fine but if I close the window and then open it again and draw the 
spectrum from the last drawing session is still there! I need it to go away.

I thought that when the window was closed the dc, created in the 
sub-window package, was destroyed but I guess not. Any help is much 
appreciated.

Code:

package DrawSpectrumWindow;
use strict;
use Wx qw[:everything];

use base qw(Wx::Frame);
use Wx::Event
     qw(EVT_PAINT EVT_BUTTON EVT_CLOSE EVT_TOOL );

# constants and global variables
.
.
sub new {
     my ( $class, $label, $parent ) = @_;
     my ( $i, $j, $n );
     #
     my $this = $class->SUPER::new( $parent, -1, $label );

     #Drawing Area
     #create a text control object and a text attribute object
     $SpectrumWindow = Wx::Frame->new( $this, -1, "Draw Spectrum",
         wxDefaultPosition, wxDefaultSize, );
     EVT_PAINT( $SpectrumWindow, \&OnPaint );

     #toolbar
     $SpectrumWindow->CreateToolBar( wxNO_BORDER | wxHORIZONTAL | wxTB_FLAT,
         $ID_TOOLBAR4 );
     my $toolbar = $SpectrumWindow->GetToolBar();
     $toolbar->AddTool( $ID_QUIT, "exit",
         Wx::Bitmap->new( $ProgramPath . "exit.png", wxBITMAP_TYPE_PNG ),
         wxNullBitmap, wxITEM_NORMAL, "exit" );
     $toolbar->Realize();

     #set the default colours
$SpectrumWindow->SetBackgroundColour($SpectrumBackgroundColour);
$SpectrumWindow->SetForegroundColour($SpectrumForegroundColour);

     EVT_TOOL( $this, $ID_QUIT, \&DrawSpectrumWindow::OnDrawSpectrumQuit );

     $SpectrumWindow->SetTitle("Draw Spectrum");
     $SpectrumWindow->SetSize(
         Wx::Size->new( $SpectrumWidth, $SpectrumHeight ) );

     #    $this->do_DrawSpectrumLayout();

     # make sure the window has the focus rather than hiding
     # under the main window
     $SpectrumWindow->SetFocus;

# quantum stuff
..
     $SpectrumWindow->Show();
     return $this;
}

sub OnPaint {
     my ( $self, $event ) = @_;

     #setup
     my $dc = Wx::PaintDC->new($self);
     my $pen = Wx::Pen->new( wxBLACK, 1, wxSOLID );
     $dc->SetPen($pen);
     my $brush = Wx::Brush->new( wxWHITE, wxSOLID );
     $dc->SetBrush($brush);

     #draw the first operator in the queue
     &DrawSpectrumAllOps($dc);
}


#more stuff
.
.
sub OnDrawSpectrumQuit {
     my ( $self, $event ) = @_;

     $self->Close(1);
}