As of today the following works. I made three changes:
- Removed use Wx::Image;
- Replaced the image file name with one on my system (ie Create "c:\\halo2.jpg" or change the file name and/or path.)
- Replaced $bmp = $image->ConvertToBitmap(); with $bmp=Wx::Bitmap->new( $image );
Here is the full code (don't forget to change the image path and name):
#!/usr/bin/perl
use Wx;
package MyApp;
#As always, we need to subclass Wx::App and populate it with a frame.
use strict;
use vars qw(@ISA);
@ISA=qw(Wx::App);
sub OnInit {
my $this = @_;
my $frame = MyFrame->new( "Mini-image demo", [-1,-1], [-1,-1]);
# if the frame didn't get created, exit early. don't use die here, as
+it seems to be a little unstable...
# if OnInit returns false,though, wx will clean up after itself nicely
+.
unless ($frame) {print "unable to create frame -- exiting."; return
+undef}
$frame->Show( 1 );
1; #everything's ok, on with the show.
}
package MyFrame;
# subclass wx::Frame to insert the image control.
use vars qw(@ISA);
use strict;
#
# All we load here are 2 constants used
# to keep the image stretched to the dimensions of the window.
#
use Wx qw( wxWidth wxHeight);
#
# Wx::Image loads the Image control and all of the Image handlers.
#
use IO::File;
@ISA=qw(Wx::Frame);
sub new {
my $class = shift;
my $this = $class->SUPER::new( undef, -1, $_[0], $_[1], $_[2] );
#
# replace the filename with something appropriate.
#
my $file = IO::File->new( "c:\\halo2.jpg", "r" ) or return undef;
binmode $file;
#
# define a handler for jpeg images.
# handlers are half of what translates file formats (.jpg in thi
+s case)
# into streams readable by wxBitmap objects for diplay.
# yes, this means you typically can't cram a file's contents int
+o
# a wxBitmap control -- the exception being windows bitmaps.
#
# There is a method called 'Wx::Image::FindHandlerType', but I c
+ouldn't
# get the thing to work in any way, shape or form.
#
my $handler = Wx::JPEGHandler->new();
#
# wxImages are the other half of getting images displayed --
# they hold the data stream created by a handler.
# Although there's many functions that can be performed with an
+wxImage,
# all we're interested is turning the stream into a bitmap.
#
my $image = Wx::Image->new();
my $bmp; # used to hold the bitmap.
#
# here we load the file into $image. simple enough.
#
$handler->LoadFile( $image, $file );
#
# and here, we turn the data in $image into a bitmap, and store
+in $bmp.
# if the data in $bmp is bad for some reason, $bmp->Ok() will fa
+il.
#$bmp = $image->ConvertToBitmap();
$bmp=Wx::Bitmap->new( $image );
if( $bmp->Ok() ) {
# create a static bitmap called ImageViewer that displays the
# selected image.
$this->{ImageViewer}= Wx::StaticBitmap->new($this, -1, $bmp);
}
# At this point, we could just return the frame, and be ok.
# unfortunately, the static bitmap could be *really* static and
+not
# resize itself when the window's resized, which'd look pretty u
+gly.
#
# To make sure everything looks ok, we'll assign constraints to
# Imageviewer.
# Layout constraints determine how controls will appear within t
+he
# window. They consist of 4 members : left, top, width and heigh
+t.
# constraints are objects by themselves, and need to be assigned
+ to
# objects in order to have any use. We'll be using this contstra
+int
# in order to stretch the picture out to the full size of the wi
+ndow.
#
my $b1 = Wx::LayoutConstraints->new();
# set the upper left corner to absolute [0,0].
# if there were other controls using constraints, we could change
+these to
# something like $b1->left->RightOf ($widget, 5) to make this cont
+rol appear
# 5 pixels to the right of $widget's constraints.
$b1->left->Absolute(0);
$b1->top->Absolute(0);
# now set the width and height to 100% each way.
$b1->width->PercentOf( $this, wxWidth,100);
$b1->height->PercentOf( $this, wxHeight, 100);
#
# Now that all the dimensions of the constraint are complete,
# assign it to ImageViewer.
#
$this->{ImageViewer}->SetConstraints( $b1 );
$this; # return the frame object to the calling application.
}
package main;
my $app = MyApp->new();# create an instance of the Wx::App-derived cla
+ss
$app->MainLoop(); # run
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.