The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl -w
#
# This sample show different event model availlabnle in Win32::GUI
#  - OEM (Old Event Model) : Call a function evnet based on control name and event name
#  - NEM (Nem Event Model) : Associate a sub event for a control.
# It present how to use both event model for a control.
# And event work with custom registered Class.
#
# NOTE : An event handler should return -1 for stop program, 0 for stop default event processing 
#        and other value for contine default event.
#
use strict;
use warnings;

use Win32::GUI qw(BS_NOTIFY);
use FindBin();

# Load a cursor bitmap
my $C = new Win32::GUI::Bitmap("$FindBin::Dir/harrow.cur", 2);

# Register a BUTTON class with cursor
my $BC = new Win32::GUI::Class(
	-name => 'Class_Button',            # Class name
	-extends => 'BUTTON',               # Extending Windows BUTTON class
	-widget => 'Button',                # Use button class event loop.
	-cursor   => $C,                    # Specific cursor for class
);	

# Create your main window
my $Window = new Win32::GUI::Window(
    -name   => "Window",                    # Window name (important for OEM event)
    -title  => "Win32::GUI test",           # Title window
    -pos    => [100,100],                   # Default position
    -size   => [400,400],                   # Default size
    -dialogui => 1,                         # Enable keyboard navigation like DialogBox
);


# Add a fisrt button in main window using default OEM event
$Window->AddButton (
    -name    => "OEM",                      # Button name (important for OEM event)
    -pos     => [5,5],                      # Default position
    -text    => "Click button OEM",         # Text show on button
    -addstyle => BS_NOTIFY,                 # Force notify style for more event
    -tabstop  => 1,                         # Allow tab navigation
);

# Add a second button in main window using NEM event (Automaticly set to NEM by using NEM Event)
$Window->AddButton (
    -name    => "NEM",
    -pos     => [5,35],
    -text    => "Click button NEM",
    -onClick     => sub { print "NEM Click !!!\n";},          # Register some NEN event
    -onDblClick  => sub { print "NEM DblClick !!!\n";},
    -onGotFocus  => sub { print "NEM GotFocus !!!\n";},
    -onLostFocus => sub { print "NEM LostFocus !!!\n";},
    -tabstop  => 1,                         # Allow tab navigation
);

# Add a third button in main window using both event model (OEM/NEM)
$Window->AddButton (
    -name    => "BOTH",
    -pos     => [5,70],
    -text    => "Click button BOTH",
    -eventmodel => "both",                  # Force both event model
    -onClick     => sub { print "BOTH Click using NEM !!!\n";
                          return 1; },      # Return 1 for permit OEM event call, 0 for ignore it.
    -tabstop  => 1,                         # Allow tab navigation
);

# Add a last button in main window using your class
$Window->AddButton (
    -name    => "CLASS",
    -pos     => [5,105],
    -text    => "Click button Class",
    -class   => $BC,
    -onClick => sub { print "Class Click !!!\n"; },
    -tabstop  => 1,                         # Allow tab navigation
);

# Show Main Window
$Window->Show();
# Go to event message loooooop....
Win32::GUI::Dialog();

#===========================================================
# Window event
#=========================================================== 
# Terminate Event
sub Window_Terminate {
    return -1;   # Stop message loop and finish program
}

# MouseMove event
sub Window_MouseMove {
    print "Window_MouseMove\n";     
}

# Activate event
sub Window_Activate {
    print "Window_Activate !!!\n";
    return 1;    # Continue default processing
}

# Deactivate event
sub Window_Deactivate {
    print "Window_Deactivate !!!\n";
    return 1;    # Continue default processing
}

# Minimize event
sub Window_Minimize {
    print "Window_Minimize !!!\n";
    return 1;    # Continue default processing or 0 for stop minimize
}

# Maximise event
sub Window_Maximize {
    print "Window_Maximize !!!\n";
    return 1;    # Continue default processing or 0 for stop maximize
}

#===========================================================
# OEM Button event
#=========================================================== 

# Click Event
sub OEM_Click {
    print "OEM_Click !!!\n";
}

# DblClick Event
sub OEM_DblClick {
    print "OEM_DblClick !!!\n";
}

# GotFocus Event
sub OEM_GotFocus {
    print "OEM_GotFocus !!!\n";
}

# LostFocus Event
sub OEM_LostFocus {
    print "OEM_LostFocus !!!\n";
}

# MouseMove Event
sub OEM_MouseMove {
    print "OEM_MouseMouve\n";
}

# MouseDown Event
sub OEM_MouseDown {
    print "OEM_MouseDown\n";
    return 1; # Continue default processing or 0 for stop (don't receive click event)
}

# MouseUp Event
sub OEM_MouseUp {
    print "OEM_MouseUp\n";
    return 1; # Continue default processing or 0 for stop (don't receive click event)
}

# KeyDown Event
sub OEM_KeyDown {
    print "OEM_KeyDown\n";
    return 1; # Continue default processing or 0 for stop (button not push)
}

# KeyUp Event
sub OEM_KeyUp {
    print "OEM_KeyUp\n";
    return 1; # Continue default processing or 0 for stop (button not unpush)
}

#===========================================================
# BOTH Button event
#=========================================================== 

# Click  Event
sub BOTH_Click {
    print "BOTH_Click using OEM !!!\n";
}

# MouseMove Event
sub BOTH_MouseMove {
    print "BOTH_MouseMouve using OEM !!!\n";
}