Hi Guys,

I realise I probably don't understand enough about inheritance, because I
don't understand the difference between:

*       use Wx;
*       use Wx 0.15 qw[:allclasses];
*       use Wx qw[:allclasses];
*       use Wx qw[:everything];

And in trying to hack the DemoPrint example to try to do a PDF print, I get
a segfault.

The code is below. What do you think?

Thanks and regards.

Steve

 
#!/usr/bin/perl -w -- 
 
use strict;
 
package Test_RTC_Print;
 
use Wx qw(:everything);
use Wx qw(:allclasses);
 
use strict;
use base qw(Wx::Panel);
 
sub new {
     my( $class, $parent, $id, $pos, $size, $style, $name ) = @_;
 $parent = undef              unless defined $parent;
 $id     = wxID_ANY           unless defined $id;
 #$title  = ""                 unless defined $title;
 $pos    = wxDefaultPosition  unless defined $pos;
 $size   = wxDefaultSize      unless defined $size;
 $name   = ""                 unless defined $name;
        $style  = 0                  unless defined $style;
 
  #my $class = shift;
  my $this = $class->SUPER::new( $parent, $id, $pos, $size, $style, $name
);
 
  my $top = Wx::BoxSizer->new( wxVERTICAL );
  my $canvas = Test_RTC_Print::Canvas->new( $this, -1 );
 
  my $preview = Wx::Button->new( $this, -1, "Preview" );
  my $print = Wx::Button->new( $this, -1, "Print" );
 
  my $buttons = Wx::BoxSizer->new( wxHORIZONTAL );
  $buttons->Add( $preview, 0, wxALL, 5 );
  $buttons->Add( $print, 0, wxALL, 5 );
 
  $top->Add( $canvas, 1, wxGROW );
  $top->Add( $buttons, 0, wxGROW );
 
  $this->SetSizer( $top );
  $this->SetAutoLayout( 1 );
 
  $this->{CANVAS} = $canvas;
 
  EVT_BUTTON( $this, $preview, \&OnPreview );
  EVT_BUTTON( $this, $print, \&OnPrint );
 
  return $this;
}
 
sub canvas { $_[0]->{CANVAS} }
 
#use Wx qw(wxTheApp);
 
sub OnPreview {
  my( $this, $event ) = @_;
 
  my $prev = Test_RTC_Print::Printout->new( $this->canvas, "Preview" );
  my $print = Test_RTC_Print::Printout->new( $this->canvas, "Print" );
  my $preview = Wx::PrintPreview->new( $prev, $print );
  my $frame = Test_RTC_Print::PreviewFrame->new( $preview,
wxTheApp->GetTopWindow,
                                     "Printing Demo Preview", [-1, -1],
[600, -1] );
  $frame->Initialize();
 
  $frame->Show( 1 );
}
 
sub OnPrint {
  my( $this, $event ) = @_;
 
  my $printer = Wx::Printer->new;
  my $printout = Test_RTC_Print::Printout->new( $this->canvas, "Print" );
  $printer->Print( $this, $printout, 1 );
 
  $printout->Destroy;
}
 
sub add_to_tags { qw(misc) };
sub title { 'Printing' };
 
1;
 
package Test_RTC_Print::PreviewFrame;
 
use strict;
 
use Wx qw(:allclasses);
use base qw(Wx::PlPreviewFrame);
 
sub Initialize {
    Wx::LogMessage( 'Test_RTC_Print::PreviewFrame::Initialize' );
 
    $_[0]->SUPER::Initialize;
}
 
sub CreateControlBar {
    Wx::LogMessage( 'Test_RTC_Print::PreviewFrame::CreateControlBar' );
 
    $_[0]->SetPreviewControlBar
      ( Test_RTC_Print::ControlBar->new( $_[0]->GetPrintPreview, $_[0] ) );
    $_[0]->GetPreviewControlBar->CreateButtons;
}
 
package Test_RTC_Print::ControlBar;
 
use strict;
use base 'Wx::PlPreviewControlBar';
 
sub new {
    Wx::LogMessage( 'Test_RTC_Print::ControlBar::new' );
 
    $_[0]->SUPER::new( $_[1], 0xffffffff, $_[2], [0, 0], [400, 40] );
}
 
sub CreateButtons {
    Wx::LogMessage( 'Test_RTC_Print::ControlBar::CreateButtons' );
 
    shift->SUPER::CreateButtons;
}
 
package Test_RTC_Print::Printout;
 
use strict;
use base qw(Wx::Printout);
 
sub new {
  my $class = shift;
  my $canvas = shift;
  my $this = $class->SUPER::new( @_ );
 
  $this->{CANVAS} = $canvas;
 
  return $this;
}
 
sub GetPageInfo {
  my $this = shift;
 
  Wx::LogMessage( "GetPageInfo" );
 
  return ( 1, 2, 1, 2 );
}
 
sub HasPage {
  my $this = shift;
 
  Wx::LogMessage( "HasPage: %d", $_[0] );
 
  return $_[0] == 1 || $_[0] == 2;
}
 
sub OnBeginDocument {
  my $this = shift;
 
  Wx::LogMessage( "OnBeginDocument: %d, %d", @_ );
 
  return $this->SUPER::OnBeginDocument( @_ );
}
 
sub OnEndDocument {
  my $this = shift;
 
  Wx::LogMessage( "OnEndDocument" );
 
  return $this->SUPER::OnEndDocument();
}
 
sub OnBeginPrinting {
  my $this = shift;
 
  Wx::LogMessage( "OnBeginPrinting" );
 
  return $this->SUPER::OnBeginPrinting();
}
 
sub OnEndPrinting {
  my $this = shift;
 
  Wx::LogMessage( "OnEndPrinting" );
 
  return $this->SUPER::OnEndPrinting();
}
 
sub OnPrintPage {
  my( $this, $page ) = @_;
  my $dc = $this->GetDC();
 
  # we need to set the appropriate scale
  my( $x_size, $y_size ) = ( $Test_RTC_Print::Canvas::x_size,
                             $Test_RTC_Print::Canvas::y_size );
 
  my( $xmargin, $ymargin ) = ( 50, 50 );
  # total size ( borders on top/bottom, left/right )
  my( $xsize, $ysize ) = ( $x_size + 2 * $xmargin, $y_size + 2 * $ymargin );
 
  # dc size
  my( $xdc, $ydc ) = $dc->GetSizeWH();
 
  # calculate the scale
  my( $xscale, $yscale ) = ( $xdc / $xsize, $ydc / $ysize );
  my $scale = ( $xscale < $yscale ) ? $xscale : $yscale;
  # center the image
  my( $xoff, $yoff ) = ( ( $xdc - ( $scale * $x_size ) ) / 2.0,
                         ( $ydc - ( $scale * $y_size ) ) / 2.0 );
 
  # set the DC origin / scale
  $dc->SetUserScale( $scale, $scale );
  $dc->SetDeviceOrigin( $xoff, $yoff );
 
  if( $page == 1 ) { } # $this->{CANVAS}->OnDraw( $dc ); 
  if( $page == 2 ) { } # empty page
}
 
package Test_RTC_Print::Canvas;
 
use strict;
use Wx qw(:everything);
use Wx qw(:allclasses);
 
use base qw(Wx::ScrolledWindow);
#use Wx::Event qw(:everything);
 
use vars qw($x_size $y_size);
 
( $x_size, $y_size ) = ( 800, 800 );
 
sub new {
    
    my( $class, $parent, $id, $pos, $size, $style, $name ) = @_;
 $parent = undef              unless defined $parent;
 $id     = wxID_ANY           unless defined $id;
 #$title  = ""                 unless defined $title;
 $pos    = wxDefaultPosition  unless defined $pos;
 $size   = wxDefaultSize      unless defined $size;
 $name   = ""                 unless defined $name;
        $style  = 0                  unless defined $style;
 
  my $this = Wx::ScrolledWindow->new( $parent, $id, $pos, $size, $style,
$name  );
  
  $this->SetScrollbars( 1, 1, $x_size, $y_size );
  $this->SetBackgroundColour( wxWHITE );
  $this->SetCursor( Wx::Cursor->new( wxCURSOR_PENCIL ) );
 
  EVT_MOTION( $this, \&OnMouseMove );
  EVT_LEFT_DOWN( $this, \&OnButton );
  EVT_LEFT_UP( $this, \&OnButton );
 
  return $this;
}
 
use Wx qw(:font);
use Wx qw(:colour :pen);
 
sub OnDraw {
  my $this = shift;
  my $dc = shift;
#  my $font = Wx::Font->new( 20, wxSCRIPT, wxSLANT, wxBOLD );
 
#  $dc->SetFont( $font );
  $dc->DrawRotatedText( "Draw Here", 200, 200, 35 );
 
  $dc->DrawEllipse( 20, 20, 50, 50 );
  $dc->DrawEllipse( 20, $y_size - 50 - 20, 50, 50 );
  $dc->DrawEllipse( $x_size - 50 - 20, 20, 50, 50 );
  $dc->DrawEllipse( $x_size - 50 - 20, $y_size - 50 - 20, 50, 50 );
 
  $dc->SetPen( Wx::Pen->new( wxRED, 5, wxSOLID ) );
  # wxGTK does not like DrawLines in this context
  foreach my $i ( @{$this->{LINES}} ) {
    my $prev;
 
    foreach my $j ( @$i ) {
      if( $j != ${$i}[0] ) {
        $dc->DrawLine( @$prev, @$j );
#       $dc->DrawLines( $i );
      }
      $prev = $j;
    }
  }
}
 
sub OnMouseMove {
  my( $this, $event ) = @_;
 
  return unless $event->Dragging;
 
  my $dc = Wx::ClientDC->new( $this );
  $this->PrepareDC( $dc );
  my $pos = $event->GetLogicalPosition( $dc );
  my( $x, $y ) = ( $pos->x, $pos->y );
 
  push @{$this->{CURRENT_LINE}}, [ $x, $y ];
  my $elems = @{$this->{CURRENT_LINE}};
 
  $dc->SetPen( Wx::Pen->new( wxRED, 5, wxSOLID ) );
  $dc->DrawLine( @{$this->{CURRENT_LINE}[$elems-2]},
                 @{$this->{CURRENT_LINE}[$elems-1]} );
 
}
 
sub OnButton {
  my( $this, $event ) = @_;
 
  my $dc = Wx::ClientDC->new( $this );
  $this->PrepareDC( $dc );
  my $pos = $event->GetLogicalPosition( $dc );
  my( $x, $y ) = ( $pos->x, $pos->y );
 
  if( $event->LeftUp ) {
    push @{$this->{CURRENT_LINE}}, [ $x, $y ];
    push @{$this->{LINES}}, $this->{CURRENT_LINE};
    $this->ReleaseMouse();
  } else {
    $this->{CURRENT_LINE} = [ [ $x, $y ] ];
    $this->CaptureMouse();
  }
 
  $dc->SetPen( Wx::Pen->new( wxRED, 5, wxSOLID ) );
  $dc->DrawLine( $x, $y, $x, $y );
}
 

1;
 
package main;
 
unless(caller){
 local *Wx::App::OnInit = sub{1};
 my $app = Wx::App->new();
 Wx::InitAllImageHandlers();
 
 my $dialog_1 = Test_RTC_Print->new();
 
 #$app->SetTopWindow($dialog_1);
 $dialog_1->Show(1);
 $app->MainLoop();
}

<<Blank Bkgrd.gif>>

Reply via email to