home *** CD-ROM | disk | FTP | other *** search
- ###############################################################################
- #
- # Win32::GUI - Perl-Win32 Graphical User Interface Extension
- #
- # 29 Jan 1997 by Aldo Calpini <dada@perl.it>
- #
- # Version: 0.0.665 (27 Feb 2002)
- #
- # Copyright (c) 1997..2002 Aldo Calpini. All rights reserved.
- # This program is free software; you can redistribute it and/or
- # modify it under the same terms as Perl itself.
- #
- # $Id: GUI.pm,v 1.5 2003/12/28 07:17:42 caelum Exp $
- #
- ###############################################################################
- package Win32::GUI;
-
- eval { require Win32 };
- require Exporter; # to export the constants to the main:: space
- require DynaLoader; # to dynuhlode the module.
-
- # Reserves GUI in the main namespace for us (uhmmm...)
- *GUI:: = \%Win32::GUI::;
-
- ###############################################################################
- # STATIC OBJECT PROPERTIES
- #
- $VERSION = "0.0.670";
- $MenuIdCounter = 1;
- $TimerIdCounter = 1;
- $NotifyIconIdCounter = 1;
- %Menus = ();
- %Accelerators = ();
- $AcceleratorCounter = 9001;
-
- @ISA = qw( Exporter DynaLoader );
- @EXPORT = qw(
- BS_3STATE
- BS_AUTO3STATE
- BS_AUTOCHECKBOX
- BS_AUTORADIOBUTTON
- BS_CHECKBOX
- BS_DEFPUSHBUTTON
- BS_GROUPBOX
- BS_LEFTTEXT
- BS_NOTIFY
- BS_OWNERDRAW
- BS_PUSHBUTTON
- BS_RADIOBUTTON
- BS_USERBUTTON
- BS_BITMAP
- BS_BOTTOM
- BS_CENTER
- BS_ICON
- BS_LEFT
- BS_MULTILINE
- BS_RIGHT
- BS_RIGHTBUTTON
- BS_TEXT
- BS_TOP
- BS_VCENTER
-
- COLOR_3DFACE
- COLOR_ACTIVEBORDER
- COLOR_ACTIVECAPTION
- COLOR_APPWORKSPACE
- COLOR_BACKGROUND
- COLOR_BTNFACE
- COLOR_BTNSHADOW
- COLOR_BTNTEXT
- COLOR_CAPTIONTEXT
- COLOR_GRAYTEXT
- COLOR_HIGHLIGHT
- COLOR_HIGHLIGHTTEXT
- COLOR_INACTIVEBORDER
- COLOR_INACTIVECAPTION
- COLOR_MENU
- COLOR_MENUTEXT
- COLOR_SCROLLBAR
- COLOR_WINDOW
- COLOR_WINDOWFRAME
- COLOR_WINDOWTEXT
-
- DS_3DLOOK
- DS_ABSALIGN
- DS_CENTER
- DS_CENTERMOUSE
- DS_CONTEXTHELP
- DS_CONTROL
- DS_FIXEDSYS
- DS_LOCALEDIT
- DS_MODALFRAME
- DS_NOFAILCREATE
- DS_NOIDLEMSG
- DS_RECURSE
- DS_SETFONT
- DS_SETFOREGROUND
- DS_SYSMODAL
-
- DTS_UPDOWN
- DTS_SHOWNONE
- DTS_SHORTDATEFORMAT
- DTS_LONGDATEFORMAT
- DTS_TIMEFORMAT
- DTS_APPCANPARSE
- DTS_RIGHTALIGN
-
- ES_AUTOHSCROLL
- ES_AUTOVSCROLL
- ES_CENTER
- ES_LEFT
- ES_LOWERCASE
- ES_MULTILINE
- ES_NOHIDESEL
- ES_NUMBER
- ES_OEMCONVERT
- ES_PASSWORD
- ES_READONLY
- ES_RIGHT
- ES_UPPERCASE
- ES_WANTRETURN
-
- GW_CHILD
- GW_HWNDFIRST
- GW_HWNDLAST
- GW_HWNDNEXT
- GW_HWNDPREV
- GW_OWNER
-
- IMAGE_BITMAP
- IMAGE_CURSOR
- IMAGE_ICON
-
- LR_DEFAULTCOLOR
- LR_MONOCHROME
- LR_COLOR
- LR_COPYRETURNORG
- LR_COPYDELETEORG
- LR_LOADFROMFILE
- LR_LOADTRANSPARENT
- LR_DEFAULTSIZE
- LR_LOADMAP3DCOLORS
- LR_CREATEDIBSECTION
- LR_COPYFROMRESOURCE
- LR_SHARED
-
- MB_ABORTRETRYIGNORE
- MB_OK
- MB_OKCANCEL
- MB_RETRYCANCEL
- MB_YESNO
- MB_YESNOCANCEL
- MB_ICONEXCLAMATION
- MB_ICONWARNING
- MB_ICONINFORMATION
- MB_ICONASTERISK
- MB_ICONQUESTION
- MB_ICONSTOP
- MB_ICONERROR
- MB_ICONHAND
- MB_DEFBUTTON1
- MB_DEFBUTTON2
- MB_DEFBUTTON3
- MB_DEFBUTTON4
- MB_APPLMODAL
- MB_SYSTEMMODAL
- MB_TASKMODAL
- MB_DEFAULT_DESKTOP_ONLY
- MB_HELP
- MB_RIGHT
- MB_RTLREADING
- MB_SETFOREGROUND
- MB_TOPMOST
- MB_SERVICE_NOTIFICATION
- MB_SERVICE_NOTIFICATION_NT3X
-
- MF_STRING
- MF_POPUP
-
- SM_ARRANGE
- SM_CLEANBOOT
- SM_CMOUSEBUTTONS
- SM_CXBORDER
- SM_CYBORDER
- SM_CXCURSOR
- SM_CYCURSOR
- SM_CXDLGFRAME
- SM_CYDLGFRAME
- SM_CXDOUBLECLK
- SM_CYDOUBLECLK
- SM_CXDRAG
- SM_CYDRAG
- SM_CXEDGE
- SM_CYEDGE
- SM_CXFIXEDFRAME
- SM_CYFIXEDFRAME
- SM_CXFRAME
- SM_CYFRAME
- SM_CXFULLSCREEN
- SM_CYFULLSCREEN
- SM_CXHSCROLL
- SM_CYHSCROLL
- SM_CXHTHUMB
- SM_CXICON
- SM_CYICON
- SM_CXICONSPACING
- SM_CYICONSPACING
- SM_CXMAXIMIZED
- SM_CYMAXIMIZED
- SM_CXMAXTRACK
- SM_CYMAXTRACK
- SM_CXMENUCHECK
- SM_CYMENUCHECK
- SM_CXMENUSIZE
- SM_CYMENUSIZE
- SM_CXMIN
- SM_CYMIN
- SM_CXMINIMIZED
- SM_CYMINIMIZED
- SM_CXMINSPACING
- SM_CYMINSPACING
- SM_CXMINTRACK
- SM_CYMINTRACK
- SM_CXSCREEN
- SM_CYSCREEN
- SM_CXSIZE
- SM_CYSIZE
- SM_CXSIZEFRAME
- SM_CYSIZEFRAME
- SM_CXSMICON
- SM_CYSMICON
- SM_CXSMSIZE
- SM_CYSMSIZE
- SM_CXVSCROLL
- SM_CYVSCROLL
- SM_CYCAPTION
- SM_CYKANJIWINDOW
- SM_CYMENU
- SM_CYSMCAPTION
- SM_CYVTHUMB
- SM_DBCSENABLED
- SM_DEBUG
- SM_MENUDROPALIGNMENT
- SM_MIDEASTENABLED
- SM_MOUSEPRESENT
- SM_MOUSEWHEELPRESENT
- SM_NETWORK
- SM_PENWINDOWS
- SM_SECURE
- SM_SHOWSOUNDS
- SM_SLOWMACHINE
- SM_SWAPBUTTON
-
- WM_CREATE
- WM_DESTROY
- WM_MOVE
- WM_SIZE
- WM_ACTIVATE
- WM_SETFOCUS
- WM_KILLFOCUS
- WM_ENABLE
- WM_SETREDRAW
- WM_COMMAND
- WM_KEYDOWN
- WM_SETCURSOR
- WM_KEYUP
-
- WS_BORDER
- WS_CAPTION
- WS_CHILD
- WS_CHILDWINDOW
- WS_CLIPCHILDREN
- WS_CLIPSIBLINGS
- WS_DISABLED
- WS_DLGFRAME
- WS_GROUP
- WS_HSCROLL
- WS_ICONIC
- WS_MAXIMIZE
- WS_MAXIMIZEBOX
- WS_MINIMIZE
- WS_MINIMIZEBOX
- WS_OVERLAPPED
- WS_OVERLAPPEDWINDOW
- WS_POPUP
- WS_POPUPWINDOW
- WS_SIZEBOX
- WS_SYSMENU
- WS_TABSTOP
- WS_THICKFRAME
- WS_TILED
- WS_TILEDWINDOW
- WS_VISIBLE
- WS_VSCROLL
-
- WS_EX_ACCEPTFILES
- WS_EX_APPWINDOW
- WS_EX_CLIENTEDGE
- WS_EX_CONTEXTHELP
- WS_EX_CONTROLPARENT
- WS_EX_DLGMODALFRAME
- WS_EX_LEFT
- WS_EX_LEFTSCROLLBAR
- WS_EX_LTRREADING
- WS_EX_MDICHILD
- WS_EX_NOPARENTNOTIFY
- WS_EX_OVERLAPPEDWINDOW
- WS_EX_PALETTEWINDOW
- WS_EX_RIGHT
- WS_EX_RIGHTSCROLLBAR
- WS_EX_RTLREADING
- WS_EX_STATICEDGE
- WS_EX_TOOLWINDOW
- WS_EX_TOPMOST
- WS_EX_TRANSPARENT
- WS_EX_WINDOWEDGE
-
- TPM_LEFTBUTTON
- TPM_RIGHTBUTTON
- TPM_LEFTALIGN
- TPM_CENTERALIGN
- TPM_RIGHTALIGN
- TPM_TOPALIGN
- TPM_VCENTERALIGN
- TPM_BOTTOMALIGN
- TPM_HORIZONTAL
- TPM_VERTICAL
- TPM_NONOTIFY
- TPM_RETURNCMD
- TPM_RECURSE
- );
-
- ###############################################################################
- # This AUTOLOAD is used to 'autoload' constants from the constant()
- # XS function. If a constant is not found then control is passed
- # to the AUTOLOAD in AutoLoader.
- #
-
- sub AUTOLOAD {
- my($constname);
- ($constname = $AUTOLOAD) =~ s/.*:://;
- #reset $! to zero to reset any current errors.
- $! = 0;
- my $val = constant($constname, @_ ? $_[0] : 0);
- if ($! != 0) {
- if ($! =~ /Invalid/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
- goto &AutoLoader::AUTOLOAD;
- } else {
- my($pack,$file,$line) = caller; # undef $pack;
- die "Can't find '$constname' in package '$pack' ".
- "used at $file line $line.";
- }
- }
- eval "sub $AUTOLOAD { $val }";
- goto &$AUTOLOAD;
- }
-
- sub bootstrap_subpackage {
- my($package) = @_;
- $package = 'Win32::GUI::' . $package;
- my $symbol = $package;
- $symbol =~ s/\W/_/g;
- no strict 'refs';
- DynaLoader::dl_install_xsub(
- "${package}::bootstrap",
- DynaLoader::dl_find_symbol_anywhere( "boot_$symbol" )
- );
- &{ "${package}::bootstrap" };
- }
-
- ###############################################################################
- # PUBLIC METHODS
- # (@)PACKAGE:Win32::GUI
-
- ###########################################################################
- # (@)METHOD:Version()
- # Returns the module version number.
- sub Version {
- return $VERSION;
- }
-
- ###########################################################################
- # (@)METHOD:SetFont(FONT)
- # Sets the font of the window (FONT is a Win32::GUI::Font object).
- sub SetFont {
- my($self, $font) = @_;
- $font = $font->{-handle} if ref($font);
- # 48 == WM_SETFONT
- return Win32::GUI::SendMessage($self, 48, $font, 0);
- }
-
- ###########################################################################
- # (@)METHOD:GetFont(FONT)
- # Gets the font of the window (returns an handle; use
- # $Font = $W->GetFont();
- # %details = Win32::GUI::Font::Info( $Font );
- # to get font details).
- sub GetFont {
- my($self) = shift;
- # 49 == WM_GETFONT
- return Win32::GUI::SendMessage($self, 49, 0, 0);
- }
-
- ###########################################################################
- # (@)METHOD:SetIcon(ICON, [TYPE])
- # Sets the icon of the window; TYPE can be 0 for the small icon, 1 for
- # the big icon. Default is the same icon for small and big.
- sub SetIcon {
- my($self, $icon, $type) = @_;
- $icon = $icon->{-handle} if ref($icon);
- # 128 == WM_SETICON
- if(defined($type)) {
- return Win32::GUI::SendMessage($self, 128, $type, $icon);
- } else {
- Win32::GUI::SendMessage($self, 128, 0, $icon); # small icon
- Win32::GUI::SendMessage($self, 128, 1, $icon); # big icon
- }
- }
-
- ###########################################################################
- # (@)METHOD:SetRedraw(FLAG)
- # Determines if a window is automatically redrawn when its content changes.
- # FLAG can be a true value to allow redraw, false to prevent it.
- sub SetRedraw {
- my($self, $value) = @_;
- # 11 == WM_SETREDRAW
- my $r = Win32::GUI::SendMessage($self, 11, $value, 0);
- return $r;
- }
-
- ###########################################################################
- # (@)INTERNAL:MakeMenu(...)
- # better used as new Win32::GUI::Menu(...)
- sub MakeMenu {
- my(@menudata) = @_;
- my $i;
- my $M = new Win32::GUI::Menu();
- my $text;
- my %data;
- my $level;
- my %last;
- my $parent;
- for($i = 0; $i <= $#menudata; $i += 2) {
- $text = $menudata[$i];
- undef %data;
- if(ref($menudata[$i+1])) {
- %data = %{$menudata[$i+1]};
- } else {
- $data{-name} = $menudata[$i+1];
- }
- $level = 0;
- $level++ while($text =~ s/^\s*>\s*//);
-
- # print "PM(MakeMenu) processing '$data{-name}', level=$level\n";
-
- if($level == 0) {
- $M->{$data{-name}} = $M->AddMenuButton(
- -id => $MenuIdCounter++,
- -text => $text,
- %data,
- );
- $last{$level} = $data{-name};
- $last{$level+1} = "";
- } elsif($level == 1) {
- $parent = $last{$level-1};
- if($text eq "-") {
- $data{-name} = "dummy$MenuIdCounter";
- $M->{$data{-name}} = $M->{$parent}->AddMenuItem(
- -item => 0,
- -id => $MenuIdCounter++,
- -separator => 1,
- -name => $data{-name},
- );
- } else {
- $M->{$data{-name}} = $M->{$parent}->AddMenuItem(
- -item => 0,
- -id => $MenuIdCounter++,
- -text => $text,
- %data,
- );
- }
- $last{$level} = $data{-name};
- $last{$level+1} = "";
- } else {
- $parent = $last{$level-1};
- if(!$M->{$parent."_Submenu"}) {
- $M->{$parent."_Submenu"} = new Win32::GUI::Menu();
- $M->{$parent."_SubmenuButton"} =
- $M->{$parent."_Submenu"}->AddMenuButton(
- -id => $MenuIdCounter++,
- -text => $parent,
- -name => $parent."_SubmenuButton",
- );
- $M->{$parent}->Change(
- -submenu => $M->{$parent."_SubmenuButton"}
- );
- }
- if($text eq "-") {
- $data{-name} = "dummy$MenuIdCounter";
- $M->{$data{-name}} =
- $M->{$parent."_SubmenuButton"}->AddMenuItem(
- -item => 0,
- -id => $MenuIdCounter++,
- -separator => 1,
- -name => $data{-name},
- );
- } else {
- $M->{$data{-name}} =
- $M->{$parent."_SubmenuButton"}->AddMenuItem(
- -item => 0,
- -id => $MenuIdCounter++,
- -text => $text,
- %data,
- );
- }
- $last{$level} = $data{-name};
- $last{$level+1} = "";
- }
- }
- return $M;
- }
-
- ###########################################################################
- # (@)INTERNAL:_new(TYPE, %OPTIONS)
- # This is the generalized constructor;
- # it works pretty well for almost all controls.
- # However, other kind of objects may overload it.
- sub _new {
- # this is always Win32::GUI (class of _new):
- my $xclass = shift;
-
- # the window type passed by new():
- my $type = shift;
-
- # this is the real class:
- my $class = shift;
-
- my $oself = {};
- # bless($oself, $class);
- my %tier = ();
- tie %tier, $class, $oself;
- my $self = bless \%tier, $class;
-
-
- my (@input) = @_;
- # print "PM(Win32::GUI::_new) self='$self' type='$type' input='@input'\n";
- my $handle = Win32::GUI::Create($self, $type, @input);
-
- # $self->{-handle} = $handle;
-
- # print "[_new] enumerating self.keys\n";
- # foreach my $k (keys %$self) {
- # print "[_new] '$k' = '$self->{$k}'\n";
- # }
- if($handle) {
- return $self;
- } else {
- return undef;
- }
- }
-
- ###############################################################################
- # SUB-PACKAGES
- #
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Font
- #
- package Win32::GUI::Font;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Font(%OPTIONS)
- # Creates a new Font object. %OPTIONS are:
- # -size
- # -height
- # -width
- # -escapement
- # -orientation
- # -weight
- # -bold => 0/1
- # -italic => 0/1
- # -underline => 0/1
- # -strikeout => 0/1
- # -charset
- # -outputprecision
- # -clipprecision
- # -family
- # -quality
- # -name
- # -face
- sub new {
- my $class = shift;
- my $self = {};
-
- my $handle = Create(@_);
-
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Bitmap
- #
- package Win32::GUI::Bitmap;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Bitmap(FILENAME, [TYPE, X, Y, FLAGS])
- # Creates a new Bitmap object reading from FILENAME; all other arguments
- # are optional. TYPE can be:
- # 0 bitmap (this is the default)
- # 1 icon
- # 2 cursor
- # You can eventually specify your desired size for the image with X and
- # Y and pass some FLAGS to the underlying LoadImage API (at your own risk)
- sub new {
- my $class = shift;
- my $self = {};
-
- my $handle = Win32::GUI::LoadImage(@_);
-
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Icon
- #
- package Win32::GUI::Icon;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Icon(FILENAME)
- # Creates a new Icon object reading from FILENAME.
- sub new {
- my $class = shift;
- my $file = shift;
- my $self = {};
-
- my $handle = Win32::GUI::LoadImage(
- $file,
- Win32::GUI::constant("IMAGE_ICON", 0),
- );
-
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)INTERNAL:DESTROY()
- sub DESTROY {
- my $self = shift;
- Win32::GUI::DestroyIcon($self);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Cursor
- #
- package Win32::GUI::Cursor;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Cursor(FILENAME)
- # Creates a new Cursor object reading from FILENAME.
- sub new {
- my $class = shift;
- my $file = shift;
- my $self = {};
-
- my $handle = Win32::GUI::LoadImage(
- $file,
- Win32::GUI::constant("IMAGE_CURSOR", 0),
- );
-
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)INTERNAL:DESTROY()
- sub DESTROY {
- my $self = shift;
- Win32::GUI::DestroyCursor($self);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Class
- #
- package Win32::GUI::Class;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD: new Win32::GUI::Class(%OPTIONS)
- # Creates a new window class object.
- # Allowed %OPTIONS are:
- # -name => STRING
- # the name for the class (it must be unique!).
- # -icon => Win32::GUI::Icon object
- # -cursor => Win32::GUI::Cursor object
- # -color => COLOR or Win32::GUI::Brush object
- # the window background color.
- # -menu => STRING
- # a menu name (not yet implemented).
- # -extends => STRING
- # name of the class to extend (aka subclassing).
- # -widget => STRING
- # name of a widget class to subclass; currently available are:
- # Button, Listbox, TabStrip, RichEdit.
- # -style => FLAGS
- # use with caution!
- sub new {
- my $class = shift;
- my %args = @_;
- my $self = {};
-
- # figure out the correct background color
- # (to avoid the "white background" syndrome on XP)
- if(not exists $args{-color}) {
- my($undef, $major, $minor) = Win32::GetOSVersion();
- if($major == 5 && $minor > 0) {
- $args{-color} = Win32::GUI::constant("COLOR_BTNFACE", 0)+1;
- } else {
- $args{-color} = Win32::GUI::constant("COLOR_WINDOW", 0);
- }
- }
-
- my $handle = Win32::GUI::RegisterClassEx(%args);
-
- if($handle) {
- $self->{-name} = $args{-name};
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Window
- #
- package Win32::GUI::Window;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Window(%OPTIONS)
- # Creates a new Window object.
- # Class specific %OPTIONS are:
- # -minsize => [X, Y]
- # specifies the minimum size (width and height) in pixels;
- # X and Y must be passed in an array reference
- # -maxsize => [X, Y]
- # specifies the maximum size (width and height) in pixels;
- # X and Y must be passed in an array reference
- # -minwidth => N
- # -minheight => N
- # -maxwidht => N
- # -maxheight => N
- # specify the minimum and maximum size width
- # and height, in pixels
- # -topmost => 0/1 (default 0)
- # the window "stays on top" even when deactivated
- sub new {
- my $self = Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__WINDOW", 0), @_);
- if($self) {
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)METHOD:AddButton(%OPTIONS)
- # See new Win32::GUI::Button().
- sub AddButton { return Win32::GUI::Button->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddLabel(%OPTIONS)
- # See new Win32::GUI::Label().
- sub AddLabel { return Win32::GUI::Label->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddCheckbox(%OPTIONS)
- # See new Win32::GUI::Checkbox().
- sub AddCheckbox { return Win32::GUI::Checkbox->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddRadioButton(%OPTIONS)
- # See new Win32::GUI::RadioButton().
- sub AddRadioButton { return Win32::GUI::RadioButton->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddGroupbox(%OPTIONS)
- # See new Win32::GUI::Groupbox().
- sub AddGroupbox { return Win32::GUI::Groupbox->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddTextfield(%OPTIONS)
- # See new Win32::GUI::Textfield().
- sub AddTextfield { return Win32::GUI::Textfield->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddListbox(%OPTIONS)
- # See new Win32::GUI::Listbox().
- sub AddListbox { return Win32::GUI::Listbox->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddCombobox(%OPTIONS)
- # See new Win32::GUI::Combobox().
- sub AddCombobox { return Win32::GUI::Combobox->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddStatusBar(%OPTIONS)
- # See new Win32::GUI::StatusBar().
- sub AddStatusBar { return Win32::GUI::StatusBar->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddProgressBar(%OPTIONS)
- # See new Win32::GUI::ProgressBar().
- sub AddProgressBar { return Win32::GUI::ProgressBar->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddTabStrip(%OPTIONS)
- # See new Win32::GUI::TabStrip().
- sub AddTabStrip { return Win32::GUI::TabStrip->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddToolbar(%OPTIONS)
- # See new Win32::GUI::Toolbar().
- sub AddToolbar { return Win32::GUI::Toolbar->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddListView(%OPTIONS)
- # See new Win32::GUI::ListView().
- sub AddListView { return Win32::GUI::ListView->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddTreeView(%OPTIONS)
- # See new Win32::GUI::TreeView().
- sub AddTreeView { return Win32::GUI::TreeView->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddRichEdit(%OPTIONS)
- # See new Win32::GUI::RichEdit().
- sub AddRichEdit { return Win32::GUI::RichEdit->new(@_); }
-
- ###########################################################################
- # (@)INTERNAL:AddTrackbar(%OPTIONS)
- # Better used as AddSlider().
- sub AddTrackbar { return Win32::GUI::Trackbar->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddSlider(%OPTIONS)
- # See new Win32::GUI::Slider().
- sub AddSlider { return Win32::GUI::Slider->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddUpDown(%OPTIONS)
- # See new Win32::GUI::UpDown().
- sub AddUpDown { return Win32::GUI::UpDown->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddAnimation(%OPTIONS)
- # See new Win32::GUI::Animation().
- sub AddAnimation { return Win32::GUI::Animation->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddRebar(%OPTIONS)
- # See new Win32::GUI::Rebar().
- sub AddRebar { return Win32::GUI::Rebar->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddHeader(%OPTIONS)
- # See new Win32::GUI::Header().
- sub AddHeader { return Win32::GUI::Header->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddComboboxEx(%OPTIONS)
- # See new Win32::GUI::Combobox().
- sub AddComboboxEx { return Win32::GUI::ComboboxEx->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddSplitter(%OPTIONS)
- # See new Win32::GUI::Splitter().
- sub AddSplitter { return Win32::GUI::Splitter->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddTimer(NAME, ELAPSE)
- # See new Win32::GUI::Timer().
- sub AddTimer { return Win32::GUI::Timer->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddNotifyIcon(%OPTIONS)
- # See new Win32::GUI::NotifyIcon().
- sub AddNotifyIcon { return Win32::GUI::NotifyIcon->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddDateTime(%OPTIONS)
- # See new Win32::GUI::DateTime().
- sub AddDateTime { return Win32::GUI::DateTime->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddGraphic(%OPTIONS)
- # See new Win32::GUI::Graphic().
- sub AddGraphic { return Win32::GUI::Graphic->new(@_); }
-
- ###########################################################################
- # (@)METHOD:AddMenu()
- # See new Win32::GUI::Menu().
- sub AddMenu {
- my $self = shift;
- my $menu = Win32::GUI::Menu->new();
- my $r = Win32::GUI::SetMenu($self, $menu->{-handle});
- # print "SetMenu=$r\n";
- return $menu;
- }
-
- ###########################################################################
- # (@)METHOD:GetDC()
- # Returns the DC object associated with the window.
- sub GetDC {
- my $self = shift;
- return Win32::GUI::DC->new($self);
- }
-
- ###########################################################################
- # (@)INTERNAL:DESTROY(HANDLE)
- sub DESTROY {
- my $self = shift;
- if(tied($self)) {
- my $timer;
- if( exists $self->{-timers} ) {
- foreach $timer ($self->{-timers}) {
- undef $self->{-timers}->{$timer};
- }
- }
- }
- # Win32::GUI::DestroyWindow($self);
- }
-
- ###########################################################################
- # (@)INTERNAL:AUTOLOAD(HANDLE, METHOD)
- sub AUTOLOAD {
- my($self, $method) = @_;
- $AUTOLOAD =~ s/.*:://;
- # print "Win32::GUI::Window::AUTOLOAD called for object '$self', method '$method', AUTOLOAD=$AUTOLOAD\n";
- if( exists $self->{$AUTOLOAD}) {
- return $self->{$AUTOLOAD};
- } else {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
- goto &AutoLoader::AUTOLOAD;
- }
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::DialogBox
- #
- package Win32::GUI::DialogBox;
- @ISA = qw(Win32::GUI::Window);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::DialogBox(%OPTIONS)
- # Creates a new DialogBox object. See new Win32::GUI::Window().
- sub new {
- my $self = Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__DIALOG", 0), @_);
- if($self) {
- $self->DialogUI(1);
- return $self;
- } else {
- return undef;
- }
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::MDI
- #
- package Win32::GUI::MDI;
- @ISA = qw(
- Win32::GUI::Window
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::MDI(%OPTIONS)
- # Creates a new MDI (Multiple Document Interface) object.
- # Class specific %OPTIONS are:
- # -minsize => [X, Y]
- # specifies the minimum size (width and height) in pixels;
- # X and Y must be passed in an array reference
- # -maxsize => [X, Y]
- # specifies the maximum size (width and height) in pixels;
- # X and Y must be passed in an array reference
- # -minwidth => N
- # -minheight => N
- # -maxwidht => N
- # -maxheight => N
- # specify the minimum and maximum size width
- # and height, in pixels
- # -topmost => 0/1 (default 0)
- # the window "stays on top" even when deactivated
- sub new {
- my $self = Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__MDICLIENT", 0), @_);
- if($self) {
- return $self;
- } else {
- return undef;
- }
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Button
- #
- package Win32::GUI::Button;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Button(PARENT, %OPTIONS)
- # Creates a new Button object;
- # can also be called as PARENT->AddButton(%OPTIONS).
- # Class specific %OPTIONS are:
- # -align => left/center/right (default left)
- # -valign => top/center/bottom
- #
- # -default => 0/1 (default 0)
- # -ok => 0/1 (default 0)
- # -cancel => 0/1 (default 0)
- # -bitmap => Win32::GUI::Bitmap object
- # -picture => see -bitmap
- # -icon => Win32::GUI::Icon object
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__BUTTON", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SetImage(BITMAP)
- # Draws the specified BITMAP, a Win32::GUI::Bitmap or Win32::GUI::Icon
- # object, in the Button.
- sub SetImage {
- my $self = shift;
- my $image = shift;
- my $type = Win32::GUI::constant("IMAGE_BITMAP", 0);
- $type = Win32::GUI::constant("IMAGE_ICON", 0) if ref($image) =~ /Icon/;
- $image = $image->{-handle} if ref($image);
- # 247 == BM_SETIMAGE
- return Win32::GUI::SendMessage($self, 247, $type, $image);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::RadioButton
- #
- package Win32::GUI::RadioButton;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::RadioButton(PARENT, %OPTIONS)
- # Creates a new RadioButton object;
- # can also be called as PARENT->AddRadioButton(%OPTIONS).
- # %OPTIONS are the same of Button (see new Win32::GUI::Button() ).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__RADIOBUTTON", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:Checked([VALUE])
- # Gets or sets the checked state of the RadioButton; if called without
- # arguments, returns the current state:
- # 0 not checked
- # 1 checked
- # If a VALUE is specified, it can be one of these (eg. 0 to uncheck the
- # RadioButton, 1 to check it).
- sub Checked {
- my $self = shift;
- my $check = shift;
- if(defined($check)) {
- # 241 == BM_SETCHECK
- return Win32::GUI::SendMessage($self, 241, $check, 0);
- } else {
- # 240 == BM_GETCHECK
- return Win32::GUI::SendMessage($self, 240, 0, 0);
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Checkbox
- #
- package Win32::GUI::Checkbox;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Checkbox(PARENT, %OPTIONS)
- # Creates a new Checkbox object;
- # can also be called as PARENT->AddCheckbox(%OPTIONS).
- # %OPTIONS are the same of Button (see new Win32::GUI::Button() ).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__CHECKBOX", 0), @_);
- }
-
-
- ###########################################################################
- # (@)METHOD:GetCheck()
- # Returns the check state of the Checkbox:
- # 0 not checked
- # 1 checked
- # 2 indeterminate (grayed)
- sub GetCheck {
- my $self = shift;
- # 240 == BM_GETCHECK
- return Win32::GUI::SendMessage($self, 240, 0, 0);
- }
-
- ###########################################################################
- # (@)METHOD:SetCheck([VALUE])
- # Sets the check state of the Checkbox; for a list of possible values,
- # see GetCheck().
- # If called without arguments, it checks the Checkbox (eg. state = 1).
- sub SetCheck {
- my $self = shift;
- my $check = shift;
- $check = 1 unless defined($check);
- # 241 == BM_SETCHECK
- return Win32::GUI::SendMessage($self, 241, $check, 0);
- }
-
- ###########################################################################
- # (@)METHOD:Checked([VALUE])
- # Gets or sets the check state of the Checkbox; if called without
- # arguments, returns the current state:
- # 0 not checked
- # 1 checked
- # 2 indeterminate (grayed)
- # If a VALUE is specified, it can be one of these (eg. 0 to uncheck the
- # Checkbox, 1 to check it).
- sub Checked {
- my $self = shift;
- my $check = shift;
- if(defined($check)) {
- # 241 == BM_SETCHECK
- return Win32::GUI::SendMessage($self, 241, $check, 0);
- } else {
- # 240 == BM_GETCHECK
- return Win32::GUI::SendMessage($self, 240, 0, 0);
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Groupbox
- #
- package Win32::GUI::Groupbox;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Groupbox(PARENT, %OPTIONS)
- # Creates a new Groupbox object;
- # can also be called as PARENT->AddGroupbox(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__GROUPBOX", 0), @_);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Label
- #
- package Win32::GUI::Label;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Label(PARENT, %OPTIONS)
- # Creates a new Label object;
- # can also be called as PARENT->AddLabel(%OPTIONS).
- # Class specific %OPTIONS are:
- # -align => left/center/right (default left)
- # -bitmap => Win32::GUI::Bitmap object
- # -fill => black/gray/white/none (default none)
- # fills the control rectangle ("black", "gray" and "white" are
- # the window frame color, the desktop color and the window
- # background color respectively).
- # -frame => black/gray/white/etched/none (default none)
- # draws a border around the control. colors are the same
- # of -fill, with the addition of "etched" (a raised border).
- # -icon => Win32::GUI::Icon object
- # -noprefix => 0/1 (default 0)
- # disables the interpretation of "&" as accelerator prefix.
- # -notify => 0/1 (default 0)
- # enables the Click(), DblClick, etc. events.
- # -picture => see -bitmap
- # -sunken => 0/1 (default 0)
- # draws a half-sunken border around the control.
- # -truncate => 0/1/word/path (default 0)
- # specifies how the text is to be truncated:
- # 0 the text is not truncated
- # 1 the text is truncated at the end
- # path the text is truncated before the last "\"
- # (used to shorten paths).
- # -wrap => 0/1 (default 1)
- # the text wraps automatically to a new line.
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__STATIC", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SetImage(BITMAP)
- # Draws the specified BITMAP, a Win32::GUI::Bitmap object, in the Label.
- sub SetImage {
- my $self = shift;
- my $image = shift;
- $image = $image->{-handle} if ref($image);
- my $type = Win32::GUI::constant("IMAGE_BITMAP", 0);
- # 370 == STM_SETIMAGE
- return Win32::GUI::SendMessage($self, 370, $type, $image);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Textfield
- #
- package Win32::GUI::Textfield;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Textfield(PARENT, %OPTIONS)
- # Creates a new Textfield object;
- # can also be called as PARENT->AddTextfield(%OPTIONS).
- # Class specific %OPTIONS are:
- # -align => left/center/right (default left)
- # aligns the text in the control accordingly.
- # -keepselection => 0/1 (default 0)
- # the selection is not hidden when the control loses focus.
- # -multiline => 0/1 (default 0)
- # the control can have more than one line (note that newline
- # is "\r\n", not "\n"!).
- # -password => 0/1 (default 0)
- # masks the user input (like password prompts).
- # -passwordchar => char (default '*')
- # the char that is shown instead of the text with -password => 1.
- # -prompt => (see below)
- # -readonly => 0/1 (default 0)
- # text can't be changed.
- #
- # The -prompt option is very special; if a string is passed, a
- # Win32::GUI::Label object (with text set to the string passed) is created
- # to the left of the Textfield.
- # Example:
- # $Window->AddTextfield(
- # -name => "Username",
- # -left => 75,
- # -top => 150,
- # -prompt => "Your name:",
- # );
- # Furthermore, the value to -prompt can be a reference to a list containing
- # the string and an additional parameter, which sets the width for
- # the Label (eg. [ STRING, WIDTH ] ). If WIDTH is negative, it is calculated
- # relative to the Textfield left coordinate. Example:
- #
- # -left => 75, (Label left) (Textfield left)
- # -prompt => [ "Your name:", 30 ], 75 105 (75+30)
- #
- # -left => 75,
- # -prompt => [ "Your name:", -30 ], 45 (75-30) 75
- #
- # Note that the Win32::GUI::Label object is named like the Textfield, with
- # a "_Prompt" suffix (in the example above, the Label is named
- # "Username_Prompt").
- sub new {
- my($class, $parent, @options) = @_;
- my %options = @options;
- if(exists $options{-prompt}) {
- my $add = 0;
- my ($text, $left, $width, $height, );
- my $visible = 1;
- # Convert -pos and -size options to -left, -top, -width and -height options
- if (exists $options{-pos}) {
- $options{-left} = $options{-pos}[0];
- $options{-top} = $options{-pos}[1];
- }
- if (exists $options{-size}) {
- $options{-width} = $options{-size}[0];
- $options{-height} = $options{-size}[1];
- }
-
- if(ref($options{-prompt}) eq "ARRAY") {
- $left = pop(@{$options{'-prompt'}});
- $text = pop(@{$options{'-prompt'}});
- if($left < 0) {
- $left = $options{-left} + $left;
- $width = -$left;
- } else {
- $width = $left;
- $left = $options{-left};
- $add = $width;
- }
- } else {
- $text = $options{-prompt};
- $add = -1;
- }
- if(exists $options{-height}) {
- $height = $options{-height}-3;
- } else {
- $height = 0;
- }
- if(exists $options{-visible}) {
- $visible = $options{-visible};
- }
- my $prompt = new Win32::GUI::Label(
- $parent,
- -name => $options{-name} . '_Prompt',
- -width => $width,
- -left => $left,
- -top => $options{-top} + 3,
- -text => $text,
- -height => $height,
- -visible => $visible,
- );
- $add = $prompt->Width if $add == -1;
- $options{-left} += $add;
-
- # Update array options
- for (my $i = 0; $i < @options; $i += 2) {
- if ($options[$i] eq '-left') {
- $options[$i+1] = $options{-left};
- last;
- }
- if ($options[$i] eq '-pos') {
- $options[$i+1][0] = $options{-left};
- last;
- }
- }
- }
- return Win32::GUI->_new(
- Win32::GUI::constant("WIN32__GUI__EDIT", 0),
- $class, $parent, @options,
- );
- }
-
- ###########################################################################
- # (@)METHOD:Select(START, END)
- # Selects the specified range of characters.
- sub Select {
- my($self, $wparam, $lparam) = @_;
- # 177 == EM_SETSEL
- return Win32::GUI::SendMessage($self, 177, $wparam, $lparam);
- }
-
- ###########################################################################
- # (@)METHOD:SelectAll()
- sub SelectAll {
- my($self, $wparam, $lparam) = @_;
- # 177 == EM_SETSEL
- # 14 == WM_GETTEXTLENGTH
- return Win32::GUI::SendMessage(
- $self, 177,
- 0, Win32::GUI::SendMessage($self, 14, 0, 0),
- );
- }
-
- ###########################################################################
- # (@)METHOD:MaxLength([CHARS])
- sub MaxLength {
- my($self, $chars) = @_;
- if(defined $chars) {
- # 197 == EM_SETLIMITTEXT
- return Win32::GUI::SendMessage($self, 197, $chars, 0);
- } else {
- # 213 == EM_GETLIMITTEXT
- return Win32::GUI::SendMessage($self, 213, 0, 0);
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Listbox
- #
- package Win32::GUI::Listbox;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Listbox(PARENT, %OPTIONS)
- # Creates a new Listbox object;
- # can also be called as PARENT->AddListbox(%OPTIONS).
- # Class specific %OPTIONS are:
- # -multisel => 0/1/2 (default 0)
- # specifies the selection type:
- # 0 single selection
- # 1 multiple selection
- # 2 multiple selection ehnanced (with Shift, Control, etc.)
- # -sort => 0/1 (default 0)
- # items are sorted alphabetically.
-
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__LISTBOX", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SelectedItem()
- sub SelectedItem {
- my $self = shift;
- # 392 == LB_GETCURSEL
- return Win32::GUI::SendMessage($self, 392, 0, 0);
- }
- ###########################################################################
- # (@)METHOD:ListIndex()
- sub ListIndex { SelectedItem(@_); }
-
- ###########################################################################
- # (@)METHOD:Select(INDEX)
- # Selects the zero-based INDEX item in the Listbox.
- sub Select {
- my $self = shift;
- my $item = shift;
- # 390 == LB_SETCURSEL
- my $r = Win32::GUI::SendMessage($self, 390, $item, 0);
- return $r;
- }
-
- ###########################################################################
- # (@)METHOD:Reset()
- sub Reset {
- my $self = shift;
- # 388 == LB_RESETCONTENT
- my $r = Win32::GUI::SendMessage($self, 388, 0, 0);
- return $r;
- }
- ###########################################################################
- # (@)METHOD:Clear()
- sub Clear { Reset(@_); }
-
-
- ###########################################################################
- # (@)METHOD:RemoveItem(INDEX)
- # Removes the zero-based INDEX item from the Listbox.
- sub RemoveItem {
- my $self = shift;
- my $item = shift;
- # 386 == LB_DELETESTRING
- my $r = Win32::GUI::SendMessage($self, 386, $item, 0);
- return $r;
- }
-
- ###########################################################################
- # (@)METHOD:Count()
- # Returns the number of items in the Listbox.
- sub Count {
- my $self = shift;
- # 395 == LB_GETCOUNT
- my $r = Win32::GUI::SendMessage($self, 395, 0, 0);
- return $r;
- }
-
- sub List {
- my $self = shift;
- my $index = shift;
- if(not defined $index) {
- my @list = ();
- for my $i (0..($self->Count-1)) {
- push @list, Win32::GUI::Listbox::Item->new($self, $i);
- }
- return @list;
- } else {
- return Win32::GUI::Listbox::Item->new($self, $index);
- }
- }
- sub Item { &List; }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Listbox::Item
- #
- package Win32::GUI::Listbox::Item;
-
- sub new {
- my($class, $listbox, $index) = @_;
- $self = {
- -parent => $listbox,
- -index => $index,
- -string => $listbox->GetString($index),
- };
- return bless $self, $class;
- }
-
- sub Remove {
- my($self) = @_;
- $self->{-parent}->RemoveItem($self->{-index});
- undef $_[0];
- }
-
- sub Select {
- my($self) = @_;
- $self->{-parent}->Select($self->{-index});
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Combobox
- #
- package Win32::GUI::Combobox;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Combobox(PARENT, %OPTIONS)
- # Creates a new Combobox object;
- # can also be called as PARENT->AddCombobox(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__COMBOBOX", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SelectedItem()
- # Returns the zero-based index of the currently selected item, or -1 if
- # no item is selected.
- sub SelectedItem {
- my $self = shift;
- # 327 == CB_GETCURSEL
- return Win32::GUI::SendMessage($self, 327, 0, 0);
- }
- ###########################################################################
- # (@)METHOD:ListIndex()
- # See SelectedItem().
- sub ListIndex { SelectedItem(@_); }
-
- ###########################################################################
- # (@)METHOD:Select(INDEX)
- # Selects the zero-based INDEX item in the Combobox.
- sub Select {
- my $self = shift;
- my $item = shift;
- # 334 == CB_SETCURSEL
- my $r = Win32::GUI::SendMessage($self, 334, $item, 0);
- return $r;
- }
-
- ###########################################################################
- # (@)METHOD:Reset()
- sub Reset {
- my $self = shift;
- # 331 == CB_RESETCONTENT
- my $r = Win32::GUI::SendMessage($self, 331, 0, 0);
- return $r;
- }
- ###########################################################################
- # (@)METHOD:Clear()
- sub Clear { Reset(@_); }
-
- ###########################################################################
- # (@)METHOD:RemoveItem(INDEX)
- # Removes the zero-based INDEX item from the Combobox.
- sub RemoveItem {
- my $self = shift;
- my $item = shift;
- # 324 == CB_DELETESTRING
- my $r = Win32::GUI::SendMessage($self, 324, $item, 0);
- return $r;
- }
-
- ###########################################################################
- # (@)METHOD:Count()
- sub Count {
- my $self = shift;
- # 326 == CB_GETCOUNT
- my $r = Win32::GUI::SendMessage($self, 326, 0, 0);
- return $r;
- }
-
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ProgressBar
- #
- package Win32::GUI::ProgressBar;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::ProgressBar(PARENT, %OPTIONS)
- # Creates a new ProgressBar object;
- # can also be called as PARENT->AddProgressBar(%OPTIONS).
- # Class specific %OPTIONS are:
- # -smooth => 0/1 (default 0)
- # uses a smooth bar instead of the default segmented bar.
- # -vertical => 0/1 (default 0)
- # display progress status vertically (from bottom to top).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__PROGRESS", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SetPos(VALUE)
- # Sets the position of the ProgressBar to the specified VALUE.
- sub SetPos {
- my $self = shift;
- my $pos = shift;
- # 1026 == PBM_SETPOS
- return Win32::GUI::SendMessage($self, 1026, $pos, 0);
- }
-
- ###########################################################################
- # (@)METHOD:StepIt()
- # Increments the position of the ProgressBar of the defined step value;
- # see SetStep().
- sub StepIt {
- my $self = shift;
- # 1029 == PBM_STEPIT
- return Win32::GUI::SendMessage($self, 1029, 0, 0);
- }
-
- ###########################################################################
- # (@)METHOD:SetRange([MIN], MAX)
- sub SetRange {
- my $self = shift;
- my ($min, $max) = @_;
- ($min, $max) = (0, $min) unless defined($max);
- # 1030 == PBM_SETRANGE32
- # return Win32::GUI::SendMessage($self, 1030, 0, ($max + $min >> 8));
- return Win32::GUI::SendMessage($self, 1030, $min, $max);
- }
-
- ###########################################################################
- # (@)METHOD:SetStep([VALUE])
- # Sets the increment value for the ProgressBar; see StepIt().
- sub SetStep {
- my $self = shift;
- my $step = shift;
- $step = 10 unless $step;
- # 1028 == PBM_SETSTEP
- return Win32::GUI::SendMessage($self, 1028, $step, 0);
- }
-
- # TODO 4.71: Color, BackColor
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::StatusBar
- #
- package Win32::GUI::StatusBar;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::StatusBar(PARENT, %OPTIONS)
- # Creates a new StatusBar object;
- # can also be called as PARENT->AddStatusBar(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__STATUS", 0), @_);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::TabStrip
- #
- package Win32::GUI::TabStrip;
- @ISA = qw(
- Win32::GUI::Window
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::TabStrip(PARENT, %OPTIONS)
- # Creates a new TabStrip object;
- # can also be called as PARENT->AddTabStrip(%OPTIONS).
- # Class specific %OPTIONS are:
- # -bottom => 0/1 (default 0)
- # -buttons => 0/1 (default 0)
- # -hottrack => 0/1 (default 0)
- # -imagelist => Win32::GUI::ImageList object
- # -justify => 0/1 (default 0)
- # -multiline => 0/1 (default 0)
- # -right => 0/1 (default 0)
- # -vertical => 0/1 (default 0)
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__TAB", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SelectedItem()
- # Returns the zero-based index of the currently selected item.
- sub SelectedItem {
- my $self = shift;
- # 4875 == TCM_GETCURSEL
- return Win32::GUI::SendMessage($self, 4875, 0, 0);
- }
-
- ###########################################################################
- # (@)METHOD:Select(INDEX)
- # Selects the zero-based INDEX item in the TabStrip.
- sub Select {
- my $self = shift;
- # 4876 == TCM_SETCURSEL
- return Win32::GUI::SendMessage($self, 4876, shift, 0);
- }
-
- ###########################################################################
- # (@)METHOD:DisplayArea()
- sub DisplayArea {
- my $self = shift;
- my ($left,$top,$right,$bottom) = $self->AdjustRect($self->GetClientRect());
- return ($left, $top, $right - $left, $bottom - $top);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Toolbar
- #
- package Win32::GUI::Toolbar;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Toolbar(PARENT, %OPTIONS)
- # Creates a new Toolbar object;
- # can also be called as PARENT->AddToolbar(%OPTIONS).
- # Class specific %OPTIONS are:
- # -flat => 0/1
- # -imagelist => IMAGELIST
- # -multiline => 0/1
- # -nodivider => 0/1
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__TOOLBAR", 0), @_);
- }
-
- ###########################################################################
- # (@)METHOD:SetBitmapSize([X, Y])
- sub SetBitmapSize {
- my $self = shift;
- my ($x, $y) = @_;
- $x = 16 unless defined($x);
- $y = 15 unless defined($y);
- # 1056 == TB_SETBITMAPSIZE
- return Win32::GUI::SendMessage($self, 1056, 0, ($x | $y << 16));
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::RichEdit
- #
- package Win32::GUI::RichEdit;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::RichEdit(PARENT, %OPTIONS)
- # Creates a new RichEdit object;
- # can also be called as PARENT->AddRichEdit(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__RICHEDIT", 0), @_);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ListView
- #
- package Win32::GUI::ListView;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::ListView(PARENT, %OPTIONS)
- # Creates a new ListView object;
- # can also be called as PARENT->AddListView(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__LISTVIEW", 0), @_);
- }
-
- sub Item {
- my($self, $index) = @_;
- return Win32::GUI::ListView::Item->new($self, $index);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ListView::Item
- #
- package Win32::GUI::ListView::Item;
-
- sub new {
- my($class, $listview, $index) = @_;
- my $self = {
- -parent => $listview,
- -index => $index,
- };
- return bless $self, $class;
- }
-
- sub SubItem {
- my($self, $index) = @_;
- return Win32::GUI::ListView::SubItem->new($self, $index);
- }
-
- sub Remove {
- my($self) = @_;
- $self->{-parent}->DeleteItem($self->{-index});
- undef $_[0];
- }
-
- sub Select {
- my($self) = @_;
- $self->{-parent}->Select($self->{-index});
- }
-
- sub Text {
- my($self, $text) = @_;
- if(not defined $text) {
- my %data = $self->{-parent}->ItemInfo($self->{-index});
- return $data{-text};
- } else {
- return $self->{-parent}->ChangeItem(
- -item => $self->{-index},
- -text => $text,
- );
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ListView::SubItem
- #
- package Win32::GUI::ListView::SubItem;
-
- sub new {
- my($class, $parent, $index) = @_;
- my $self = {
- -parent => $parent->{-parent},
- -index => $parent->{-index},
- -subindex => $index,
- };
- return bless $self, $class;
- }
-
- sub Text {
- my($self, $text) = @_;
- if(not defined $text) {
- my %data = $self->{-parent}->ItemInfo(
- $self->{-index},
- $self->{-subindex},
- );
- return $data{-text};
- } else {
- return $self->{-parent}->ChangeItem(
- -item => $self->{-index},
- -subitem => $self->{-subindex},
- -text => $text,
- );
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::TreeView
- #
- package Win32::GUI::TreeView;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::TreeView(PARENT, %OPTIONS)
- # Creates a new TreeView object
- # can also be called as PARENT->AddTreeView(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__TREEVIEW", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Slider
- # also Trackbar
- #
- package Win32::GUI::Trackbar;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Slider(PARENT, %OPTIONS)
- # Creates a new Slider object;
- # can also be called as PARENT->AddSlider(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__TRACKBAR", 0), @_);
- }
-
- sub SetRange {
-
- }
-
- sub Min {
- my $self = shift;
- my $value = shift;
- if(defined($value)) {
- my $flag = shift;
- $flag = 1 unless defined($flag);
- # 1031 == TBM_SETRANGEMIN
- return Win32::GUI::SendMessage($self, 1031, $flag, $value);
- } else {
- # 1025 == TBM_GETRANGEMIN
- return Win32::GUI::SendMessage($self, 1025, 0, 0);
- }
- }
-
- sub Max {
- my $self = shift;
- my $value = shift;
- if(defined($value)) {
- my $flag = shift;
- $flag = 1 unless defined($flag);
- # 1032 == TBM_SETRANGEMAX
- return Win32::GUI::SendMessage($self, 1032, $flag, $value);
- } else {
- # 1026 == TBM_GETRANGEMAX
- return Win32::GUI::SendMessage($self, 1026, 0, 0);
- }
- }
-
- sub Pos {
- my $self = shift;
- my $value = shift;
- if(defined($value)) {
- my $flag = shift;
- $flag = 1 unless defined($flag);
- # 1029 == TBM_SETPOS
- return Win32::GUI::SendMessage($self, 1029, $flag, $value);
- } else {
- # 1024 == TBM_GETPOS
- return Win32::GUI::SendMessage($self, 1024, 0, 0);
- }
- }
-
- sub TicFrequency {
- my $self = shift;
- my $value = shift;
- # 1044 == TBM_SETTICFREQ
- return Win32::GUI::SendMessage($self, 1044, $value, 0);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Slider
- #
- package Win32::GUI::Slider;
- @ISA = qw(Win32::GUI::Trackbar);
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::UpDown
- #
- package Win32::GUI::UpDown;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::UpDown(PARENT, %OPTIONS)
- # Creates a new UpDown object;
- # can also be called as PARENT->AddUpDown(%OPTIONS).
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__UPDOWN", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Tooltip
- #
- package Win32::GUI::Tooltip;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Tooltip(PARENT, %OPTIONS)
- # (preliminary) creates a new Tooltip object
- sub new {
- my $parent = $_[1];
- my $new = Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__TOOLTIP", 0), @_);
- if($new) {
- if($parent->{-tooltips}) {
- push(@{$parent->{-tooltips}}, $new->{-handle});
- } else {
- $parent->{-tooltips} = [ $new->{-handle} ];
- }
- }
- return $new;
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Animation
- #
- package Win32::GUI::Animation;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Animation(PARENT, %OPTIONS)
- # Creates a new Animation object;
- # can also be called as PARENT->AddAnimation(%OPTIONS).
- # Class specific %OPTIONS are:
- # -autoplay => 0/1 (default 0)
- # starts playing the animation as soon as an AVI clip is loaded
- # -center => 0/1 (default 0)
- # centers the animation in the control window
- # -transparent => 0/1 (default 0)
- # draws the animation using a transparent background
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__ANIMATION", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Rebar
- #
- package Win32::GUI::Rebar;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Rebar(PARENT, %OPTIONS)
- # Creates a new Rebar object;
- # can also be called as PARENT->AddRebar(%OPTIONS).
- # Class specific %OPTIONS are:
- # -bandborders => 0/1 (default 0)
- # display a border to separate bands.
- # -fixedorder => 0/1 (default 0)
- # band position cannot be swapped.
- # -imagelist => Win32::GUI::ImageList object
- # -varheight => 0/1 (default 1)
- # display bands using the minimum required height.
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__REBAR", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Header
- #
- package Win32::GUI::Header;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Header(PARENT, %OPTIONS)
- # Creates a new Header object;
- # can also be called as PARENT->AddHeader(%OPTIONS).
- # Class specific %OPTIONS are:
- # -buttons => 0/1 (default 0)
- # header items look like push buttons and can be clicked.
- # -hottrack => 0/1 (default 0)
- # -imagelist => Win32::GUI::ImageList object
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__HEADER", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Splitter
- #
- package Win32::GUI::Splitter;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Splitter(PARENT, %OPTIONS)
- # Creates a new Splitter object;
- # can also be called as PARENT->AddHeader(%OPTIONS).
- # Class specific %OPTIONS are:
- # -buttons => 0/1 (default 0)
- # header items look like push buttons and can be clicked.
- # -hottrack => 0/1 (default 0)
- # -imagelist => Win32::GUI::ImageList object
- sub new {
- my $new = Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__SPLITTER", 0), @_);
- if($new) {
- $new->{-tracking} = 0;
- return $new;
- } else {
- return undef;
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ComboboxEx
- #
- package Win32::GUI::ComboboxEx;
- @ISA = qw(
- Win32::GUI::Combobox
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::ComboboxEx(PARENT, %OPTIONS)
- # Creates a new ComboboxEx object;
- # can also be called as PARENT->AddComboboxEx(%OPTIONS).
- # Class specific %OPTIONS are:
- # -imagelist => Win32::GUI::ImageList object
- # Except for images, a ComboboxEx object acts like a Win32::GUI::Combobox
- # object. See also new Win32::GUI::Combobox().
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__COMBOBOXEX", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::DateTime
- #
- package Win32::GUI::DateTime;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::DateTime(PARENT, %OPTIONS)
- # Creates a new DateTime object;
- # can also be called as PARENT->AddDateTime(%OPTIONS).
- # Class specific %OPTIONS are:
- # -align => 'right'/'left' (default 'left')
- # The drop-down month calendar alignement.
- # -format => 'shortdate', 'longdate', 'time'
- # Control format type (Use local format date/time).
- # -shownone => 0/1 (default 0)
- # Allow no datetime (add a prefix checkbox).
- # -updown => 0/1 (default 0 for date, 1 for time format)
- # Use updown control instead of the drop-down month calendar.
- sub new {
- return Win32::GUI->_new(Win32::GUI::constant("WIN32__GUI__DTPICK", 0), @_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Graphic
- #
- package Win32::GUI::Graphic;
- @ISA = qw(
- Win32::GUI
- Win32::GUI::WindowProps
- );
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Graphic(PARENT, %OPTIONS)
- # Creates a new Graphic object;
- # can also be called as PARENT->AddGraphic(%OPTIONS).
- # Class specific %OPTIONS are:
- sub new {
- my $class = shift;
- my $self = {};
- bless($self, $class);
- my(@input) = @_;
- my $handle = Win32::GUI::Create($self, 101, @input);
- if($handle) {
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)METHOD:GetDC()
- # Returns the DC object associated with the window.
- sub GetDC {
- my $self = shift;
- return Win32::GUI::DC->new($self);
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::ImageList
- #
- package Win32::GUI::ImageList;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::ImageList(X, Y, FLAGS, INITAL, GROW)
- # Creates an ImageList object; X and Y specify the size of the images,
- # FLAGS [TBD]. INITIAL and GROW specify the number of images the ImageList
- # actually contains (INITIAL) and the number of images for which memory
- # is allocated (GROW).
- sub new {
- my $class = shift;
- my $self = {};
- my $handle = Win32::GUI::ImageList::Create(@_);
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)METHOD:Add(BITMAP, [BITMAPMASK])
- # Adds a bitmap to the ImageList; both BITMAP and BITMAPMASK can be either
- # Win32::GUI::Bitmap objects or filenames.
- sub Add {
- my($self, $bitmap, $bitmapMask) = @_;
- $bitmap = new Win32::GUI::Bitmap($bitmap) unless ref($bitmap);
- if(defined($bitmapMask)) {
- $bitmapMask = new Win32::GUI::Bitmap($bitmapMask) unless ref($bitmapMask);
- $self->AddBitmap($bitmap, $bitmapMask);
- } else {
- $self->AddBitmap($bitmap);
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Menu
- #
- package Win32::GUI::Menu;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Menu(...)
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my $self = {};
-
- if($#_ > 0) {
- return Win32::GUI::MakeMenu(@_);
- } else {
- my $handle = Win32::GUI::CreateMenu();
-
- if($handle) {
- $self->{-handle} = $handle;
- bless($self, $class);
- return $self;
- } else {
- return undef;
- }
- }
- }
-
- ###########################################################################
- # (@)METHOD:AddMenuButton()
- # see new Win32::GUI::MenuButton()
- sub AddMenuButton {
- return Win32::GUI::MenuButton->new(@_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::MenuButton
- #
- package Win32::GUI::MenuButton;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::MenuButton()
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my $menu = shift;
- $menu = $menu->{-handle} if ref($menu);
- # print "new MenuButton: menu=$menu\n";
- my %args = @_;
- my $self = {};
-
- my $handle = Win32::GUI::CreatePopupMenu();
-
- if($handle) {
- $args{-submenu} = $handle;
- # print "PM(MenuButton::new) calling InsertMenuItem with menu=$menu, args=", join(", ", %args), "\n";
- Win32::GUI::MenuButton::InsertMenuItem($menu, %args);
- # print "PM(MenuButton::new) back from InsertMenuItem\n";
- $self->{-handle} = $handle;
- bless($self, $class);
- $Win32::GUI::Menus{ $args{-id} } = $handle;
- #if($args{-name}) {
- # $Win32::GUI::Menus{$args{-id}} = $self;
- # $self->{-name} = $args{-name};
- #}
- # print "PM(MenuButton::new) returning self=$self\n";
- return $self;
- } else {
- return undef;
- }
- }
-
- ###########################################################################
- # (@)METHOD:AddMenuItem()
- # see new Win32::GUI::MenuItem()
- sub AddMenuItem {
- return Win32::GUI::MenuItem->new(@_);
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::MenuItem
- #
- package Win32::GUI::MenuItem;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::MenuItem()
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my $menu = shift;
- return undef unless ref($menu) =~ /^Win32::GUI::Menu/;
- my %args = @_;
- my $self = {};
-
- # print "PM(MenuItem::new) calling InsertMenuItem with menu=$menu, args=", join(", ", %args), "\n";
- my $handle = Win32::GUI::MenuButton::InsertMenuItem($menu, %args);
- # print "PM(MenuItem::new) back from InsertMenuItem\n";
-
- if($handle) {
- # $self->{-handle} = $handle;
- # $Win32::GUI::menucallbacks{$args{-id}} = $args{-function} if $args{-function};
- $self->{-id} = $args{-id};
- $self->{-menu} = $menu->{-handle};
- bless($self, $class);
- $Win32::GUI::Menus{ $args{-id} } = $menu->{-handle};
- #if($args{-name}) {
- # $Win32::GUI::Menus{$args{-id}} = $self;
- # $self->{-name} = $args{-name};
- #}
- # print "PM(MenuItem::new) returning self=$self\n";
- return $self;
- } else {
- return undef;
- }
- }
-
- ###############################################################################
- # (@)PACKAGE: Win32::GUI::Timer
- #
- package Win32::GUI::Timer;
- @ISA = qw(Win32::GUI);
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Timer(PARENT, NAME, ELAPSE)
- # Creates a new timer in the PARENT window named NAME that will
- # trigger its Timer() event after ELAPSE milliseconds.
- # Can also be called as PARENT->AddTimer(NAME, ELAPSE).
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my $window = shift;
- my $name = shift;
- my $elapse = shift;
-
- my %args = @_;
- my $id = $Win32::GUI::TimerIdCounter;
-
- $Win32::GUI::TimerIdCounter++;
-
- Win32::GUI::SetTimer($window, $id, $elapse);
-
- my $self = {};
- bless($self, $class);
-
- # add $self->{name}
- $self->{-id} = $id;
- $self->{-name} = $name;
- $self->{-parent} = $window;
- $self->{-handle} = $window->{-handle};
- $self->{-interval} = $elapse;
-
- # add to $window->timers->{$id} = $self;
- $window->{-timers}->{$id} = $self;
- $window->{$name} = $self;
-
- return $self;
- }
-
- ###########################################################################
- # (@)METHOD:Interval(ELAPSE)
- sub Interval {
- my $self = shift;
- my $interval = shift;
- if(defined $interval) {
- Win32::GUI::SetTimer($self->{-parent}->{-handle}, $self->{-id}, $interval);
- $self->{-interval} = $interval;
- } else {
- return $self->{-interval};
- }
- }
-
- ###########################################################################
- # (@)METHOD:Kill()
- sub Kill {
- my $self = shift;
- Win32::GUI::KillTimer($self->{-parent}->{-handle}, $self->{-id});
- }
-
- ###########################################################################
- # (@)INTERNAL:DESTROY(HANDLE)
- sub DESTROY {
- my $self = shift;
- Win32::GUI::KillTimer($self->{-handle}, $self->{-id});
- undef $self->{-parent}->{-timers}->{$self->{-id}};
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::NotifyIcon
- #
- package Win32::GUI::NotifyIcon;
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::NotifyIcon(PARENT, %OPTIONS)
- # Creates a new NotifyIcon (also known as system tray icon) object;
- # can also be called as PARENT->AddNotifyIcon(%OPTIONS).
- # %OPTIONS are:
- # -icon => Win32::GUI::Icon object
- # -id => NUMBER
- # a unique identifier for the NotifyIcon object
- # -name => STRING
- # the name for the object
- # -tip => STRING
- # the text that will appear as tooltip when the mouse is
- # on the NotifyIcon
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my $window = shift;
-
- my %args = @_;
-
- $Win32::GUI::NotifyIconIdCounter++;
-
- if(!exists($args{-id})) {
- $args{-id} = $Win32::GUI::NotifyIconIdCounter;
- }
-
- Win32::GUI::NotifyIcon::Add($window, %args);
-
- my $self = {};
- bless($self, $class);
-
- $self->{-id} = $args{-id};
- $self->{-name} = $args{-name};
- $self->{-parent} = $window;
- $self->{-handle} = $window->{-handle};
-
- $window->{-notifyicons}->{$args{-id}} = $self;
- $window->{$args{-name}} = $self;
-
- return $self;
- }
-
- ###########################################################################
- # (@)INTERNAL:DESTROY(OBJECT)
-
- sub DESTROY {
- my($self) = @_;
- if ( defined $self &&
- defined $self->{-parent} &&
- defined $self->{-id} &&
- defined $self->{-parent}->{$self->{-name}} ) {
- Win32::GUI::NotifyIcon::Delete(
- $self->{-parent},
- -id => $self->{-id},
- );
- undef $self->{-parent}->{$self->{-name}};
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::DC
- #
- package Win32::GUI::DC;
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::DC(WINDOW | DRIVER, DEVICE)
- # Creates a new DC object; the first form (WINDOW is a Win32::GUI object)
- # gets the DC for the specified window (can also be called as
- # WINDOW->GetDC). The second form creates a DC for the specified DEVICE;
- # actually, the only supported DRIVER is the display driver (eg. the
- # screen). To get the DC for the entire screen use:
- # $Screen = new Win32::GUI::DC("DISPLAY");
- #
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
-
- my $self = {};
- bless($self, $class);
-
- my $window = shift;
- if(defined($window)) {
- if(ref($window)) {
- $self->{-handle} = GetDC($window->{-handle});
- $self->{-window} = $window->{-handle};
- } else {
- my $device = shift;
- $self->{-handle} = CreateDC($window, $device);
- }
- } else {
- $self = CreateDC("DISPLAY", 0);
- }
- return $self;
- }
-
- sub DESTROY {
- my $self = shift;
- if($self->{-window}) {
- ReleaseDC($self->{-window}, $self->{-handle});
- } else {
- DeleteDC($self->{-handle});
- }
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Pen
- #
- package Win32::GUI::Pen;
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Pen(COLOR | %OPTIONS)
- # Creates a new Pen object.
- # Allowed %OPTIONS are:
- # -style =>
- # 0 PS_SOLID
- # 1 PS_DASH
- # 2 PS_DOT
- # 3 PS_DASHDOT
- # 4 PS_DASHDOTDOT
- # 5 PS_NULL
- # 6 PS_INSIDEFRAME
- # -width => number
- # -color => COLOR
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
-
- my $self = {};
- bless($self, $class);
- $self->{-handle} = Create(@_);
- return $self;
- }
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::Brush
- #
- package Win32::GUI::Brush;
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::Brush(COLOR | %OPTIONS)
- # Creates a new Brush object.
- # Allowed %OPTIONS are:
- # -style =>
- # 0 BS_SOLID
- # 1 BS_NULL
- # 2 BS_HATCHED
- # 3 BS_PATTERN
- # -pattern => Win32::GUI::Bitmap object (valid for -style => BS_PATTERN)
- # -hatch => (valid for -style => BS_HATCHED)
- # 0 HS_ORIZONTAL (-----)
- # 1 HS_VERTICAL (|||||)
- # 2 HS_FDIAGONAL (\\\\\)
- # 3 HS_BDIAGONAL (/////)
- # 4 HS_CROSS (+++++)
- # 5 HS_DIAGCROSS (xxxxx)
- # -color => COLOR
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
-
- my $self = {};
- bless($self, $class);
- $self->{-handle} = Create(@_);
- return $self;
- }
-
-
- ###############################################################################
- # (@)PACKAGE:Win32::GUI::AcceleratorTable
- # an accelerator table
- #
-
- package Win32::GUI::AcceleratorTable;
-
- ###########################################################################
- # (@)METHOD:new Win32::GUI::AcceleratorTable(%ACCELERATORS)
- # Creates an AcceleratorTable object.
- # %ACCELERATORS is an associative array of key combinations and
- # accelerator names, in pair:
- # Example:
- # $A = new Win32::GUI::AcceleratorTable(
- # "Ctrl-X" => "Close",
- # "Shift-N" => "New",
- # "Ctrl-Alt-Del" => "Reboot",
- # );
- # The AcceleratorTable object can be associated to a window
- # with the -accel option; then, when an accelerator is used, a
- # corresponding <name>_Click event is fired.
- # Keyboard combinations currently support the following modifier :
- # Shift
- # Ctrl (or Control)
- # Alt
- # and the following keys:
- # A..Z, 0..9
- # Left, Right, Up, Down
- # Home, End, PageUp, PageDown (or PgUp/PgDn)
- # Space, Ins, Del, Esc, Backspace, Tab, Return
- # F1..F12
- sub new {
- my $class = shift;
- $class = "Win32::" . $class if $class =~ /^GUI::/;
- my($k, $v);
- my $flag = 0;
- my $key = 0;
- my %accels = @_;
-
- while( ($k, $v) = each %accels) {
- $flag = 0x0001;
- if($k =~ s/shift[-\+]//i) { $flag |= 0x0004; }
- if($k =~ s/(ctrl|control)[-\+]//i) { $flag |= 0x0008; }
- if($k =~ s/alt[-\+]//i) { $flag |= 0x0010; }
-
- # { $key = 0x01; } # VK_LBUTTON
- # { $key = 0x02; } # VK_RBUTTON
- # { $key = 0x03; } # VK_CANCEL
- # { $key = 0x04; } # VK_MBUTTON
- if($k =~ /^backspace$/i) { $key = 0x08; } # VK_BACK
- elsif($k =~ /^tab$/i) { $key = 0x09; } # VK_TAB
- # elsif($k =~ /^clear$/i) { $key = 0x0c; } # VK_CLEAR
- elsif($k =~ /^return$/i) { $key = 0x0d; } # VK_RETURN
- # { $key = 0x10; } # VK_SHIFT
- # { $key = 0x11; } # VK_CONTROL
- # { $key = 0x12; } # VK_MENU /ALT
- elsif($k =~ /^pause$/i) { $key = 0x13; } # VK_PAUSE
- elsif($k =~ /^capslock$/i) { $key = 0x14; } # VK_CAPITAL
- elsif($k =~ /^(esc|escape)$/i) { $key = 0x1b; } # VK_ESCAPE
- elsif($k =~ /^space$/i) { $key = 0x20; } # VK_SPACE
- elsif($k =~ /^(pgup|pageup)$/i) { $key = 0x21; } # VK_PRIOR
- elsif($k =~ /^(pgdn|pagedn|pagedown)$/i) { $key = 0x22; } # VK_NEXT
- elsif($k =~ /^end$/i) { $key = 0x23; } # VK_END
- elsif($k =~ /^home$/i) { $key = 0x24; } # VK_HOME
- elsif($k =~ /^left$/i) { $key = 0x25; } # VK_LEFT
- elsif($k =~ /^up$/i) { $key = 0x26; } # VK_UP
- elsif($k =~ /^right$/i) { $key = 0x27; } # VK_RIGHT
- elsif($k =~ /^down$/i) { $key = 0x28; } # VK_DOWN
- # elsif($k =~ /^select$/i) { $key = 0x29; } # VK_SELECT
- # elsif($k =~ /^print$/i) { $key = 0x2a; } # VK_PRINT
- # elsif($k =~ /^execute$/i) { $key = 0x2b; } # VK_EXECUTE
- elsif($k =~ /^(prntscrn|printscreen)$/i) { $key = 0x2c; } # VK_SNAPSHOT
- elsif($k =~ /^ins$/i) { $key = 0x2d; } # VK_INSERT
- elsif($k =~ /^del$/i) { $key = 0x2e; } # VK_DELETE
- # elsif($k =~ /^help$/i) { $key = 0x2f; } # VK_HELP
- elsif($k =~ /^[0-9a-z]$/i) { $key = ord(uc($k)); }
- # 0x30-0x39: ASCII 0-9
- # 0x41-0x5a: ASCII A-Z
- elsif($k =~ /^left(win|windows)$/i) { $key = 0x5b; } # VK_LWIN
- elsif($k =~ /^right(win|windows)$/i) { $key = 0x5c; } # VK_RWIN
- elsif($k =~ /^(app|application)$/i) { $key = 0x5d; } # VK_APPS
- # elsif($k =~ /^sleep$/i) { $key = 0x5e; } # VK_SLEEP
- elsif($k =~ /^(num|numeric|keypad)0$/i) { $key = 0x60; } # VK_NUMPAD0
- elsif($k =~ /^(num|numeric|keypad)1$/i) { $key = 0x61; } # VK_NUMPAD1
- elsif($k =~ /^(num|numeric|keypad)2$/i) { $key = 0x62; } # VK_NUMPAD2
- elsif($k =~ /^(num|numeric|keypad)3$/i) { $key = 0x63; } # VK_NUMPAD3
- elsif($k =~ /^(num|numeric|keypad)4$/i) { $key = 0x64; } # VK_NUMPAD4
- elsif($k =~ /^(num|numeric|keypad)5$/i) { $key = 0x65; } # VK_NUMPAD5
- elsif($k =~ /^(num|numeric|keypad)6$/i) { $key = 0x66; } # VK_NUMPAD6
- elsif($k =~ /^(num|numeric|keypad)7$/i) { $key = 0x67; } # VK_NUMPAD7
- elsif($k =~ /^(num|numeric|keypad)8$/i) { $key = 0x68; } # VK_NUMPAD8
- elsif($k =~ /^(num|numeric|keypad)9$/i) { $key = 0x69; } # VK_NUMPAD9
- elsif($k =~ /^multiply$/i) { $key = 0x6a; } # VK_MULTIPLY
- elsif($k =~ /^add$/i) { $key = 0x6b; } # VK_ADD
- # elsif($k =~ /^separator$/i) { $key = 0x6c; } # VK_SEPARATOR
- elsif($k =~ /^subtract$/i) { $key = 0x6d; } # VK_SUBTRACT
- elsif($k =~ /^decimal$/i) { $key = 0x6e; } # VK_DECIMAL
- elsif($k =~ /^divide$/i) { $key = 0x6f; } # VK_DIVIDE
- elsif($k =~ /^f1$/i) { $key = 0x70; } # VK_F1
- elsif($k =~ /^f2$/i) { $key = 0x71; } # VK_F2
- elsif($k =~ /^f3$/i) { $key = 0x72; } # VK_F3
- elsif($k =~ /^f4$/i) { $key = 0x73; } # VK_F4
- elsif($k =~ /^f5$/i) { $key = 0x74; } # VK_F5
- elsif($k =~ /^f6$/i) { $key = 0x75; } # VK_F6
- elsif($k =~ /^f7$/i) { $key = 0x76; } # VK_F7
- elsif($k =~ /^f8$/i) { $key = 0x77; } # VK_F8
- elsif($k =~ /^f9$/i) { $key = 0x78; } # VK_F9
- elsif($k =~ /^f10$/i) { $key = 0x79; } # VK_F10
- elsif($k =~ /^f11$/i) { $key = 0x7a; } # VK_F11
- elsif($k =~ /^f12$/i) { $key = 0x7b; } # VK_F12
- # elsif($k =~ /^f13$/i) { $key = 0x7c; } # VK_F13
- # elsif($k =~ /^f14$/i) { $key = 0x7d; } # VK_F14
- # elsif($k =~ /^f15$/i) { $key = 0x7e; } # VK_F15
- # elsif($k =~ /^f16$/i) { $key = 0x7f; } # VK_F16
- # elsif($k =~ /^f17$/i) { $key = 0x80; } # VK_F17
- # elsif($k =~ /^f18$/i) { $key = 0x81; } # VK_F18
- # elsif($k =~ /^f19$/i) { $key = 0x82; } # VK_F19
- # elsif($k =~ /^f20$/i) { $key = 0x83; } # VK_F20
- # elsif($k =~ /^f21$/i) { $key = 0x84; } # VK_F21
- # elsif($k =~ /^f22$/i) { $key = 0x85; } # VK_F22
- # elsif($k =~ /^f23$/i) { $key = 0x86; } # VK_F23
- # elsif($k =~ /^f24$/i) { $key = 0x87; } # VK_F24
- elsif($k =~ /^numlock$/i) { $key = 0x90; } # VK_NUMLOCK
- elsif($k =~ /^scrolllock$/i) { $key = 0x91; } # VK_SCROLL
- # { $key = 0xa0; } # VK_LSHIFT
- # { $key = 0xa1; } # VK_RSHIFT
- # { $key = 0xa2; } # VK_LCONTROL
- # { $key = 0xa3; } # VK_RCONTROL
- # { $key = 0xa4; } # VK_LMENU
- # { $key = 0xa5; } # VK_RMENU
- # elsif($k =~ /^browserback$/i) { $key = 0xa6; } # VK_BROWSER_BACK
- # elsif($k =~ /^browserforward$/i) { $key = 0xa7; } # VK_BROWSER_FORWARD
- # elsif($k =~ /^browserrefresh$/i) { $key = 0xa8; } # VK_BROWSER_REFRESH
- # elsif($k =~ /^browserstop$/i) { $key = 0xa9; } # VK_BROWSER_STOP
- # elsif($k =~ /^browsersearch$/i) { $key = 0xaa; } # VK_BROWSER_SEARCH
- # elsif($k =~ /^browserfavorites$/i) { $key = 0xab; } # VK_BROWSER_FAVORITES
- # elsif($k =~ /^browserhome$/i) { $key = 0xac; } # VK_BROWSER_HOME
- # elsif($k =~ /^volumemute$/i) { $key = 0xad; } # VK_VOLUME_MUTE
- # elsif($k =~ /^volumedown$/i) { $key = 0xae; } # VK_VOLUME_UP
- # elsif($k =~ /^volumenup$/i) { $key = 0xaf; } # VK_VOLUME_DOWN
- # elsif($k =~ /^medianexttrack$/i) { $key = 0xb0; } # VK_MEDIA_NEXT_TRACK
- # elsif($k =~ /^mediaprevtrack$/i) { $key = 0xb1; } # VK_MEDIA_PREV_TRACK
- # elsif($k =~ /^mediastop$/i) { $key = 0xb2; } # VK_MEDIA_STOP
- # elsif($k =~ /^mediaplaypause$/i) { $key = 0xb3; } # VK_MEDIA_PLAY_PAUSE
- # elsif($k =~ /^launchmail$/i) { $key = 0xb4; } # VK_LAUNCH_MAIL
- # elsif($k =~ /^launchmediaselect$/i) { $key = 0xb5; } # VK_LAUNCH_MEDIA_SELECT
- # elsif($k =~ /^launchapp1$/i) { $key = 0xb6; } # VK_LAUNCH_APP1
- # elsif($k =~ /^launchapp2$/i) { $key = 0xb7; } # VK_LAUNCH_APP2
- elsif($k =~ /^semicolon$/i) { $key = 0xba; } # VK_OEM_1
- elsif($k =~ /^(plus|equal)$/i) { $key = 0xbb; } # VK_OEM_PLUS
- elsif($k =~ /^(comma|lessthan)$/i) { $key = 0xbc; } # VK_OEM_COMMA
- elsif($k =~ /^(minus|underscore)$/i) { $key = 0xbd; } # VK_OEM_MINUS
- elsif($k =~ /^(period|greaterthan)$/i) { $key = 0xbe; } # VK_OEM_PERIOD
- elsif($k =~ /^(slash|question)$/i) { $key = 0xbf; } # VK_OEM_2
- elsif($k =~ /^(acute|tilde)$/i) { $key = 0xc0; } # VK_OEM_3
- elsif($k =~ /^(left|open)brac(e|ket)$/i) { $key = 0xdb; } # VK_OEM_4
- elsif($k =~ /^(backslash|verticalbar)$/i) { $key = 0xdc; } # VK_OEM_5
- elsif($k =~ /^(right|close)brac(e|ket)$/i) { $key = 0xdd; } # VK_OEM_6
- elsif($k =~ /^(single|double|)quote$/i) { $key = 0xde; } # VK_OEM_7
- # elsif($k =~ /^unknown$/i) { $key = 0xdf; } # VK_OEM_8
- # elsif($k =~ /^process$/i) { $key = 0xe5; } # VK_PROCESSKEY
- elsif($k =~ /^(attn|attention)$/i) { $key = 0xf6; } # VK_ATTN
- elsif($k =~ /^crsel$/i) { $key = 0xf7; } # VK_CRSEL
- elsif($k =~ /^exsel$/i) { $key = 0xf8; } # VK_EXSEL
- elsif($k =~ /^(ereof|eraseeof)$/i) { $key = 0xf9; } # VK_EREOF
- elsif($k =~ /^play$/i) { $key = 0xfa; } # VK_PLAY
- elsif($k =~ /^zoom$/i) { $key = 0xfb; } # VK_ZOOM
- elsif($k =~ /^noname$/i) { $key = 0xfc; } # VK_NONAME
- elsif($k =~ /^pa1$/i) { $key = 0xfd; } # VK_PA1
- elsif($k =~ /^oem_clear$/i) { $key = 0xfe; } # VK_OEM_CLEAR
- else {$key = 0; print "Key name '$k' unknown\n"; }
-
- if ($key) {
- my $id = $Win32::GUI::AcceleratorCounter++;
- push @acc, $id, $key, $flag;
- $Win32::GUI::Accelerators{$id} = $v;
- }
- }
- my $handle = Win32::GUI::CreateAcceleratorTable( @acc );
- if($handle) {
- my $self = {};
- $self->{-handle} = $handle;
- bless $self, $class;
- return $self;
- } else {
- return undef;
- }
- }
-
- sub DESTROY {
- my($self) = @_;
- # print "DESTROYING AcceleratorTable $self->{-handle}\n";
- if( $self->{-handle} ) {
- Win32::GUI::DestroyAcceleratorTable( $self->{-handle} );
- }
- }
-
- ###############################################################################
- # (@)INTERNAL:Win32::GUI::WindowProps
- # the package to tie to a window hash to set/get properties in a more
- # fashionable way...
- #
- package Win32::GUI::WindowProps;
-
- my %TwoWayMethodMap = (
- -text => "Text",
- -left => "Left",
- -top => "Top",
- -width => "Width",
- -height => "Height",
- -dialogui => "DialogUI",
- );
-
- my $Textfield_TwoWayMethodMap = {
- -passwordchar => "PasswordChar",
- };
-
- my %PackageSpecific_TwoWayMethodMap = (
- Splitter => {
- -min => "Min",
- -max => "Max",
- -horizontal => "Horizontal",
- -vertical => "Vertical",
- },
- MenuItem => {
- -checked => "Checked",
- -enabled => "Enabled",
- },
- Textfield => $Textfield_TwoWayMethodMap,
- RichEdit => $Textfield_TwoWayMethodMap,
- );
-
-
- my %OneWayMethodMap = (
- -scalewidth => "ScaleHeight",
- -scaleheight => "ScaleWidth",
- -abstop => "AbsTop",
- -absleft => "AbsLeft",
- );
-
- ###########################################################################
- # (@)INTERNAL:TIEHASH
- sub TIEHASH {
- my($class, $object) = @_;
- # my $tied = { UNDERLYING => $object };
- # print "[TIEHASH] called for '$class' '$object'\n";
- # return bless $tied, $class;
- return bless $object, $class;
- }
-
- ###########################################################################
- # (@)INTERNAL:STORE
- sub STORE {
- my($self, $key, $value) = @_;
- # print "[STORE] called for '$self' {$key}='$value'\n";
-
- my $Package = ref($self);
- $Package =~ s/Win32::GUI:://;
-
- if(exists $PackageSpecific_TwoWayMethodMap{$Package}{$key}) {
- if(my $method = $self->can($PackageSpecific_TwoWayMethodMap{$Package}{$key})) {
- #print "[STORE] calling method '$PackageSpecific_TwoWayMethodMap{$Package}{$key}' on '$self'\n";
- return &{$method}($self, $value);
- } else {
- #print "[STORE] PROBLEM: method '$PackageSpecific_TwoWayMethodMap{$Package}{$key}' not found on '$self'\n";
- }
- } elsif(exists $TwoWayMethodMap{$key}) {
- if(my $method = $self->can($TwoWayMethodMap{$key})) {
- # print "[STORE] calling method '$TwoWayMethodMap{$key}' on '$self'\n";
- return &{$method}($self, $value);
- } else {
- # print "[STORE] PROBLEM: method '$TwoWayMethodMap{$key}' not found on '$self'\n";
- }
- } elsif($key eq "-style") {
- # print "[STORE] calling GetWindowLong\n";
- return Win32::GUI::GetWindowLong($self, -16, $value);
-
- } else {
- # print "[STORE] storing key '$key' in '$self'\n";
- # return $self->{UNDERLYING}->{$key} = $value;
- return $self->{$key} = $value;
- }
- }
-
- ###########################################################################
- # (@)INTERNAL:FETCH
- sub FETCH {
- my($self, $key) = @_;
-
- my $Package = ref($self);
- $Package =~ s/Win32::GUI:://;
-
- if($key eq "UNDERLYING") {
- # print "[FETCH] returning UNDERLYING for '$self'\n";
- return $self->{UNDERLYING};
-
- } elsif(exists $PackageSpecific_TwoWayMethodMap{$Package}{$key}) {
- if(my $method = $self->can($PackageSpecific_TwoWayMethodMap{$Package}{$key})) {
- #print "[FETCH] calling method '$PackageSpecific_TwoWayMethodMap{$package}{$key}' on '$self'\n";
- return &{$method}($self);
- } else {
- #print "[FETCH] PROBLEM: method '$PackageSpecific_TwoWayMethodMap{$package}{$key}' not found on '$self'\n";
- }
-
- } elsif(exists $TwoWayMethodMap{$key}) {
- # if(my $method = $self->{UNDERLYING}->can($TwoWayMethodMap{$key})) {
- if(my $method = $self->can($TwoWayMethodMap{$key})) {
- # print "[FETCH] calling method $TwoWayMethodMap{$key} on $self->{UNDERLYING}\n";
- # print "[FETCH] calling method '$TwoWayMethodMap{$key}' on '$self'\n";
- # return &{$method}($self->{UNDERLYING});
- return &{$method}($self);
- } else {
- # print "[FETCH] method not found '$TwoWayMethodMap{$key}'\n";
- return undef;
- }
-
- } elsif($key eq "-style") {
- return Win32::GUI::GetWindowLong($self->{UNDERLYING}, -16);
-
- #} elsif(exists $self->{UNDERLYING}->{$key}) {
- # print "[FETCH] fetching key $key from $self->{UNDERLYING}\n";
- # return $self->{UNDERLYING}->{$key};
-
- } elsif(exists $self->{$key}) {
- # print "[FETCH] fetching key '$key' from '$self'\n";
- return $self->{$key};
-
- } else {
- # print "Win32::GUI::WindowProps::FETCH returning nothing for '$key' on $self->{UNDERLYING}\n";
- # print "[FETCH] returning nothing for '$key' on '$self'\n";
- return undef;
- # return 0;
- }
- }
-
- sub FIRSTKEY {
- my $self = shift;
- my $a = keys %{ $self };
- my ($k, $v) = each %{ $self };
- # print "[FIRSTKEY] k='$k' v='$v'\n";
- return $k;
- }
-
- sub NEXTKEY {
- my $self = shift;
- my ($k, $v) = each %{ $self };
- # print "[NEXTKEY] k='$k' v='$v'\n";
- return $k;
- }
-
- sub EXISTS {
- my($self, $key) = @_;
- # return exists $self->{UNDERLYING}->{$key};
- return exists $self->{$key};
- }
-
-
- ###############################################################################
- # dynamically load in the GUI.dll module.
- #
-
- package Win32::GUI;
-
- bootstrap Win32::GUI;
-
- bootstrap_subpackage 'Animation';
- bootstrap_subpackage 'Bitmap';
- bootstrap_subpackage 'DC';
- bootstrap_subpackage 'Font';
- bootstrap_subpackage 'ImageList';
- bootstrap_subpackage 'Label';
- bootstrap_subpackage 'Listbox';
- bootstrap_subpackage 'ListView';
- bootstrap_subpackage 'NotifyIcon';
- bootstrap_subpackage 'Rebar';
- bootstrap_subpackage 'RichEdit';
- bootstrap_subpackage 'Splitter';
- bootstrap_subpackage 'TabStrip';
- bootstrap_subpackage 'Textfield';
- bootstrap_subpackage 'Toolbar';
- bootstrap_subpackage 'TreeView';
-
- # Preloaded methods go here.
-
- $Win32::GUI::StandardWinClass = Win32::GUI::Class->new(
- -name => "PerlWin32GUI_STD_OBSOLETED"
- );
-
- $Win32::GUI::StandardWinClassVisual = Win32::GUI::Class->new(
- -name => "PerlWin32GUI_STD",
- -visual => 1,
- );
-
- $Win32::GUI::GraphicWinClass = Win32::GUI::Class->new(
- -name => "Win32::GUI::Graphic",
- -widget => "Graphic",
- );
-
- $Win32::GUI::InteractiveGraphicWinClass = Win32::GUI::Class->new(
- -name => "Win32::GUI::InteractiveGraphic",
- -widget => "InteractiveGraphic",
- );
-
- $Win32::GUI::SplitterHorizontal = Win32::GUI::Class->new(
- -name => "Win32::GUI::Splitter(horizontal)",
- -widget => "SplitterH",
- );
- $Win32::GUI::SplitterVertical = Win32::GUI::Class->new(
- -name => "Win32::GUI::Splitter(vertical)",
- -widget => "Splitter",
- );
-
- $Win32::GUI::RICHED = Win32::GUI::LoadLibrary("RICHED32");
-
- END {
- # print "Freeing library RICHED32\n";
- Win32::GUI::FreeLibrary($Win32::GUI::RICHED);
- }
-
- #Currently Autoloading is not implemented in Perl for win32
- # Autoload methods go after __END__, and are processed by the autosplit program.
-
- 1;
- __END__
-
-
-