package Win32::GUI::AxWindow;
# $Id: AxWindow.pm,v 1.4 2006/10/15 14:07:45 robertemay Exp $
use strict;
use warnings;
use Carp;
use Win32::GUI qw(WS_CHILD WS_CLIPCHILDREN WS_VISIBLE WS_TABSTOP
WS_HSCROLL WS_VSCROLL WS_DISABLED);
require DynaLoader;
our @ISA = qw(DynaLoader Win32::GUI::Window);
our $VERSION = '0.09';
my $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
bootstrap Win32::GUI::AxWindow $XS_VERSION;
# Initialise
Win32::GUI::AxWindow::_Initialise();
# DeInitialise
END {
Win32::GUI::AxWindow::_DeInitialise();
}
#
# new : Create a new ActiveX Window
#
sub new {
my $class = shift;
my %in = @_;
### Control option
croak("-parent undefined") unless exists $in{-parent};
croak("-name undefined") unless exists $in{-name};
croak("-control undefined") unless exists $in{-control};
my $parent = $in{-parent};
my $name = $in{-name};
my $clsid = $in{-control};
# print "Parent = $parent->{-name}\n";
# print "Name = $name\n";
# print "Control = $clsid\n";
### Size
my ($x, $y, $w, $h) = (0,0,1,1);
$x = $in{-left} if exists $in{-left};
$y = $in{-top} if exists $in{-top};
$w = $in{-width} if exists $in{-width};
$h = $in{-height} if exists $in{-height};
($x, $y) = ($in{-pos}[0] , $in{-pos}[1]) if exists $in{-pos};
($w, $h) = ($in{-size}[0],$in{-size}[1]) if exists $in{-size};
# print "(x,y) = ($x,$y)\n(w,h) = ($w,$h)\n";
### Window Style
my $style = WS_CHILD | WS_CLIPCHILDREN;
$style = $in{-style} if exists $in{-style};
$style |= $in{-pushstyle} if exists $in{-pushstyle};
$style ^= $in{-popstyle} if exists $in{-popstyle};
$style |= $in{-addstyle} if exists $in{-addstyle};
$style ^= $in{-remstyle} if exists $in{-remstyle};
$style |= WS_VISIBLE unless exists $in{-visible} && $in{-visible} == 0;
$style |= WS_TABSTOP unless exists $in{-tabstop} && $in{-tabstop} == 0;
$style |= WS_DISABLED if exists $in{-enable} && $in{-enable} == 0;
$style |= WS_HSCROLL if exists $in{-hscroll} && $in{-hscroll} == 1;
$style |= WS_VSCROLL if exists $in{-vscroll} && $in{-vscroll} == 1;
# print "Style = $style\n";
### Window ExStyle
my $exstyle = 0;
$exstyle = $in{-exstyle} if exists $in{-exstyle};
$exstyle |= $in{-pushexstyle} if exists $in{-pushexstyle};
$exstyle ^= $in{-popexstyle} if exists $in{-popexstyle};
$exstyle |= $in{-addexstyle} if exists $in{-addexstyle};
$exstyle ^= $in{-remexstyle} if exists $in{-remexstyle};
# print "ExStyle = $exstyle\n";
### Create Window and ActiveX Object
my $self = {};
bless $self, $class;
if ( $self->_Create($parent, $clsid, $style, $exstyle, $x, $y, $w, $h) )
{
### Store Data (Win32::GUI glue)
$self->{-name} = $in{-name};
$parent->{$name} = $self;
return $self;
}
return undef;
}
#
# CallMethod : Use Invoke with DISPATCH_METHOD
#
sub CallMethod {
my $self = shift;
return $self->Invoke (0x01, @_);
}
#
# GetProperty : Use Invoke with DISPATCH_PROPERTYGET
#
sub GetProperty {
my $self = shift;
return $self->Invoke (0x02, @_);
}
#
# PutProperty : Use Invoke with DISPATCH_PROPERTYPUT
#
sub SetProperty {
my $self = shift;
return $self->Invoke (0x04, @_);
}
1;
__END__
=head1 NAME
Win32::GUI::AxWindow - Host ActiveX Controls in Win32::GUI windows
=head1 SYNOPSIS
use Win32::GUI();
use Win32::GUI::AxWindow;
# Main Window
$Window = new Win32::GUI::Window(
-name => "Window",
-title => "Win32::GUI::AxWindow test",
-pos => [100, 100],
-size => [400, 400],
);
# Add a WebBrowser AxtiveX
$Control = new Win32::GUI::AxWindow (
-parent => $Window,
-name => "Control",
-control => "Shell.Explorer",
-pos => [0, 0],
-size => [400, 400],
);
# Register some event
$Control->RegisterEvent("StatusTextChange",
sub {
$self = shift;
$eventid = shift;
print "Event : ", @_, "\n";
} );
# Call Method
$Control->CallMethod("Navigate", 'http://www.perl.com/');
# Event loop
$Window->Show();
Win32::GUI::Dialog();
# Main window event handler
sub Window_Resize {
if (defined $Window) {
($width, $height) = ($Window->GetClientRect)[2..3];
$Control->Move (0, 0);
$Control->Resize ($width, $height);
}
}
=head1 DESCRIPTION
=head2 AxWindow
=over
=item C<new> (...)
Create a new ActiveX window.
options :
-parent => parent window (Required)
-name => window name (Required)
-size => window size [ width, heigth ]
-pos => window pos [ left, top ]
-width => window width
-height => window height
-left => window left
-top => window top
-control => clisd (see below) (Required).
C<clsid> is a string identifier to create the control.
Must be formatted in one of the following ways:
- A ProgID such as "MSCAL.Calendar.7"
- A CLSID such as "{8E27C92B-1264-101C-8A2F-040224009C02}"
- A URL such as "http://www.microsoft.com"
- A reference to an Active document such as 'file://Documents/MyDoc.doc'
- A fragment of HTML such as "MSHTML:<HTML><BODY>This is a line of text</BODY></HTML>"
Note that "MSHTML:" must precede the HTML fragment so that it is designated as
being an MSHTML stream.
styles:
-visible => 0/1
-tabstop => 0/1
-hscroll => 0/1
-vscroll => 0/1
-style, -addstyle, -pushstyle, -remstyle, -popstyle
-exstyle, -exaddstyle, -expushstyle, -exremstyle, -expopstyle
Default style is : C<WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN>
=item C<Release> ()
If you have a crash when exiting, call this function before all the
windows are destroyed (i.e. before C<Win32::GUI::Dialog();> exits).
Generaly, call this function in the Window_Terminate event handler.
=back
=head2 Property
=over
=item C<EnumPropertyID> ()
Return a list of all the Property IDs of the control.
=item C<EnumPropertyName> ()
Return a list of all the Property names of the control.
=item C<GetPropertyInfo> (ID_or_Name)
Return a hash with information about the Property from C<ID_or_Name>.
Hash entry :
-Name => Property Name.
-ID => Property ID.
-VarType => Property Type (Variant type).
-EnumValue => A formated string of enum value ( enum1=value1,enum2=value2,... ).
-ReadOnly => Indicate if a property can only be read.
-Description => Property Description.
-Prototype => Prototype
=item C<GetProperty> (ID_or_Name, [index, ...])
Get property value.
For indexed property, add index list.
=item C<SetProperty> (ID_or_Name, [index, ...], value)
Set property value
For indexed property, add index list before value.
=back
=head2 Method
=over
=item C<EnumMethodID> ()
Return a list of all the Method IDs of the control.
=item C<EnumMethodName> ()
Return a list of all the Method names of the control.
=item C<GetMethodInfo> (ID_Name)
Return a hash with information about the Method from ID or Name.
Hash entry :
-Name => Method Name.
-ID => Method ID.
-Description => Method Description.
-Prototype => Method Prototype.
=item C<CallMethod> (ID_or_Name, ...)
Invoke a method of an ActiveX control.
=back
=head2 Event
=over
=item C<EnumEventID> ()
Return a list of all the Event IDs of the control.
=item C<EnumEventName> ()
Return a list of all the Event Names of the control.
=item C<GetEventInfo> (ID_or_Name)
Return a hash with information about the Event from C<ID_or_Name>.
Hash entry :
-Name => Method Name.
-ID => Method ID.
-Description => Method Description.
-Prototype => Method Prototype.
=item C<RegisterEvent> (ID_or_Name, Callback)
Associate a Callback for an ActiveX Event.
=back
=head2 Win32::OLE
=over
=item C<GetOLE> ()
Return a Win32::OLE object of Hosted ActiveX Control.
You MUST add C<use Win32::OLE;> in your script.
=back
=head1 AUTHOR
Laurent Rocher (lrocher@cpan.org)
=head1 SEE ALSO
L<Win32::GUI|Win32::GUI> L<http://perl-win32-gui.sourceforge.net/>
=head1 DEPENDENCIES
This module requires these other modules and libraries:
=over
=item L<Win32::GUI|Win32::GUI>
=item Active Template Library (ATL)
=back
=head1 COPYRIGHT AND LICENCE
Copyright 2003 by Laurent Rocher (lrocher@cpan.org).
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See L<http://www.perl.com/perl/misc/Artistic.html>
=cut