Hi Huub,

It all worked perfectly first time.

Thanks for everything! Both this and the wxConfig (which I haven't yet
tested).

Regards

Steve

-----Original Message-----
From: Huub Peters [mailto:i...@huubpeters.com] 
Sent: 26 September 2009 10:24
To: Steve Cookson
Cc: wxperl-users@perl.org
Subject: Re: Mouse Event coordinates

Steve Cookson wrote:
> 
> 
> Hi Guys,
> 
> I have a small piece of code which displays a bitmap, then when you click
> on the bitmap it should draw a circle round the point you clicked.
> 
> It works OK, except that it always returns (0, 0) as the coordinates of 
> the mouse,
> where-ever you click.
> 
> Where am I going wrong?
> 
> Here is the code.
> 
> Thanks in advance. 
> 
> Regards
> 
> Steve
> 
> #!/usr/bin/perl -w --
> 
> use Wx 0.15 qw[:allclasses];
> use strict;
> 
> package MyFrame;
> 
> use Wx qw[:everything];
> use base qw(Wx::Frame);
> use strict;
> our $gl_self;
> sub new {
>  my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;
>  $parent = undef              unless defined $parent;
>  $id     = -1                 unless defined $id;
>  $title  = ""                 unless defined $title;
>  $pos    = wxDefaultPosition  unless defined $pos;
>  $size   = wxDefaultSize      unless defined $size;
>  $name   = ""                 unless defined $name;
> 
>  $style = wxDEFAULT_FRAME_STYLE
>   unless defined $style;
> 
>  $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, 
> $name );
>  $self->SetTitle("Drawing on image");
> 
>  $gl_self= $self; # Set Global variable for use in EVT handler
>  
> # Image for drawing on
>  $self->{image1} = Wx::Image->new( 'C:set_your_own_bitmap.jpg',  
> wxBITMAP_TYPE_ANY, -1 );
>  $self->{Loc_Photo_Bmp} = Wx::Bitmap->new( $self->{image1} ) ;
>  $self->{bitmap_1} = my $static_bitmap = Wx::StaticBitmap->new( $self, 
> -1, $self->{Loc_Photo_Bmp});
>  $self->{bitmap_1}->SetCursor(wxCROSS_CURSOR);
>  
> # Button to draw image
>  
>  $self->{button_1} = Wx::Button->new($self, -1, "button_1");
>  use Wx::Event qw(EVT_BUTTON  EVT_LEFT_UP EVT_LEFT_DOWN);
>  EVT_LEFT_DOWN( $self->{bitmap_1}, \&on_button );
>  EVT_LEFT_UP( $self->{bitmap_1}, \&on_button );
> 
> #
> # Sizer
> #
> 
>  $self->{sizer_1} = Wx::BoxSizer->new(wxVERTICAL);
>  $self->{sizer_1}->Add($self->{bitmap_1}, 0, 0, 0);
>  $self->{sizer_1}->Add($self->{button_1}, 0, 0, 0);
>  $self->SetSizer($self->{sizer_1});
>  $self->{sizer_1}->Fit($self);
>  $self->Layout();
>  
>  return $self;
> 
> }
> sub on_button{
> 
>         my ($self, $event) = @_;
>  # select it into a memory dc
>        if (defined $gl_self->{Loc_Photo_Bmp}){
>   my $mdc = Wx::MemoryDC->new();
>   $mdc->SelectObject($gl_self->{Loc_Photo_Bmp});
>   my $pen = Wx::Pen->new( Wx::Colour->new(255,255,255), 10, wxSOLID);
>   $mdc->SetPen( $pen );
>   $mdc->SetBrush( wxTRANSPARENT_BRUSH );
> # Determine mouse event

You don't need this:
>   my $m= Wx::MouseEvent->new($event);

>   my $r = 50;

>   my $x=$m->GetX();
>   my $y=$m->GetY();
Replace this with:
  my $x=$event->GetX();
  my $y=$event->GetY();

> # Draw circle round mouse event
>   $mdc->DrawCircle( $x, $y, $r );
>   $mdc->SelectObject(wxNullBitmap); # deselect the bitmap out of the DC
>   $gl_self->{bitmap_1} ->SetBitmap($gl_self->{Loc_Photo_Bmp});
>         }
>  
>  $event->Skip() ;
>  return $self;
> }
> 
> 1;
> 
> 
> package main;
> 
> unless(caller){
>  local *Wx::App::OnInit = sub{1};
>  my $app = Wx::App->new();
>  Wx::InitAllImageHandlers();
> 
>  my $frame_1 = MyFrame->new();
> 
>  $app->SetTopWindow($frame_1);
>  $frame_1->Show(1);
>  $app->MainLoop();
> }
> 

Untested but if memory serves me right the above patches should work.
Cheers,

Huub

Reply via email to