The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl -w
#
#  MonthCal sample
#
use strict;
use warnings;
use Win32::GUI();

# main Window
my $Window = new Win32::GUI::Window (
    -name     => "Window",
    -title    => "MonthCal Sample",
    -pos      => [100, 100],
    -size     => [440, 400],
) or die "new Window";

# Mono select MonthCal control
$Window->AddMonthCal (
    -name     => "MonthCalMono",
    -pos      => [10, 10],
    -size     => [200, 160],
    -onSelect => \&OnSelect,
    -onSelChange => \&OnSelChange,
);

# Play with color
$Window->MonthCalMono->BackColor(0x7F7F7F);
$Window->MonthCalMono->BackMonthColor(0x7FFFFF);
$Window->MonthCalMono->BackTitleColor(0xFF7F7F);
$Window->MonthCalMono->TextColor(0x7F0000);
$Window->MonthCalMono->TitleTextColor(0x7FFF7F);
$Window->MonthCalMono->TrailingTextColor(0xA0A0A0);

# Multi Select MonthCal control
$Window->AddMonthCal (
    -name     => "MonthCalMulti",
    -pos      => [220, 10],
    -size     => [200, 160],
    -onSelect => \&OnSelectMulti,
    -onSelChange => \&OnSelChangeMulti,
    -onDayState  => \&OnDayState,
    -multiselect => 1,               # Allow multi select 
    -weeknumber => 1,                # Show Week number
    -notoday => 1,                   # Remove Today 
    -daystate => 1,
);

# Change default 7 days select to 14 days select
$Window->MonthCalMulti->SetMaxSelCount(14);

# Init first month daystate (day 15 is bold)
$Window->MonthCalMulti->SetDayState( (1<<(15-1)) );

# Event loop
$Window->Show();
Win32::GUI::Dialog();

# Main window event handler
sub Window_Terminate {
  return -1;
}

# Event handler

sub OnSelect {
  my ($self, $y, $m, $d) = @_;
  my $name = $self->{-name};
  print "$name Select = $d/$m/$y\n";
}

sub OnSelChange {
  my ($self, $y, $m, $d) = @_;
  my $name = $self->{-name};
  print "$name SelChange = $d/$m/$y\n";
}

sub OnSelectMulti {
  my ($self, $yf, $mf, $df, $yt, $mt, $dt) = @_;
  my $name = $self->{-name};
  print "$name Select from $df/$mf/$yf to $dt/$mt/$yt\n";
}

sub OnSelChangeMulti {
  my ($self, $yf, $mf, $df, $yt, $mt, $dt) = @_;
  my $name = $self->{-name};
  print "$name SelChange from $df/$mf/$yf to $dt/$mt/$yt\n";
}

# Change Day state in calendar
sub OnDayState {

  my ($self, $y, $m, $d, $max, $refarray) = @_;
  my $name = $self->{-name};

  print "$name DayState from $d/$m/$y for $max months\n";

  # $refarray is an array reference
  # Each item is an integer value where each bit represent a day.
  for my $i (0..$max-1) {
    $$refarray[$i] |= (1<<(15-1));  # Set day 15 bold for all day
  }
}