>I need to be able to continually add lines to the window, from different
>sources (from the clipboard , textfields / buttons ), then the user
>needs to be able to edit it before sending it to print.
Attached is a gui library that does exactly that. You should be able to
hunt it down - the RE is made in &gui_init, and the text is appended in
&gui_note. If you have any questions, lemme know.
###############################################################################
# LIST OF ROUTINES BELOW: #
###############################################################################
# gui_init() - start the gui and display the window #
# gui_listen() - listen for window events for our gui #
# gui_note() - send a note to our gui window #
# open_url() - open a url in the system's default browser #
# _things() - various routines that control the gui and should be private #
###############################################################################
# these variables are global for
# the Windows gui - they just keep
# track of various things that listen
# and notes need to know about.
my ($hwnd, $icon, $hwnd_class, $window, $menu_bar);
my ($img, $sys_tray_icon, $font, $logbox);
###############################################################################
# gui_init() - start the gui and display the window #
###############################################################################
# USAGE: #
# &gui_init; #
# #
# NOTES: #
# This routine loads specific libraries specific to the OS and attempts to #
# do everything necessary to start up a GUI window and start listening for #
# events. Further down in this file, you should see supplementary GUI #
# routines (starting with _) that are part of the GUI happenings this #
# routine inits. #
# #
# Most of the code within this routine is thanks to David Berube. #
# #
# RETURNS: #
# 1; this routine always returns happily. #
###############################################################################
sub gui_init {
use Win32::GUI;
# hwnd is a handle to a window - basically, window's
# way of keeping track of it's program windows...
$hwnd = GUI::GetPerlWindow();
# comment this to see error messages in a dos window
# otherwise, this will hide the blasted thing...
GUI::Hide($hwnd);
# get the width and height of the user's system.
my $screen_width = Win32::GUI::GetSystemMetrics(0);
my $screen_height = Win32::GUI::GetSystemMetrics(1);
# create the icon handler.
$icon = new Win32::GUI::Icon($SETTINGS->{files}->{gui_win_icon});
# create a window class for our window.
$hwnd_class = new Win32::GUI::Class( -name => "$SETTINGS->{app}->{name}
Class",
-icon => $icon
);
# set up our menu bar. these point to various
# routines defined later on in this file, as
# well as set up key commands for the items.
$menu_bar = new Win32::GUI::Menu( "&File" => "File",
" > E&xit" => "_FileExit",
"&Edit" => "Edit",
" > &Copy Ctrl+C" => "_EditCopy",
" > Select &All Ctrl+A" => "_EditSelectAll"
);
# creates the main window. notice that we use a generic
# "Name" parameter, which is used for events, which must
# have the format Name_EventName.
$window = new Win32::GUI::Window( -name => '_Window',
-text => $SETTINGS->{app}->{name},
-left => ($screen_width - 600)/2,
-top => ($screen_height - 400)/2,
-width => 480, -height => 400,
-menu => $menu_bar,
-class => $hwnd_class,
-icon => $icon,
-maximizebox => 0
);
# $window->SetWindowLong(-20, 641); #-20 = GWL_EXSTYLE. 0x40000 =
WS_EX_APPWINDOW.
# create the systray icon.
$sys_tray_icon = $window->AddNotifyIcon( -name => "_Systray",
-id => 1,
-icon => $icon,
-tip => $SETTINGS->{app}->{name}
);
# create our pretty logo - we need to figure out
# a good window size and height and then fix this
# stuff (and the logbox) up...
$window->AddLabel( -text => "",
-name => "Bitmap",
-left => -34,
-top => -3,
-width => 505,
-height => 116,
-style => 14,
-visible => 1,
);
# actually display the image...
$img = new Win32::GUI::Bitmap($SETTINGS->{files}->{gui_win_logo});
$window->Bitmap->SetImage($img); $window->Bitmap->Resize(505, 116);
# set the font of our log box below.
$font = Win32::GUI::Font->new( -name => "Verdana", -size => 12 );
# create the log box which is gonna hold all our info.
$logbox = $window->AddRichEdit( -name => "_RichEdit",
-font => $font,
-top => 116,
-left => 0,
-width => 505,
-height => 240,
-tabstop => 1,
-style => WS_CHILD | WS_VISIBLE | ES_LEFT |
ES_MULTILINE | ES_AUTOVSCROLL |
WS_VSCROLL |
ES_READONLY,
-exstyle => WS_EX_CLIENTEDGE
);
# and make it a little smaller than our window size.
$logbox->Resize( $window->ScaleWidth, $window->ScaleHeight - 118);
# finally, show all the junk we just did.
$window->Show();
return 1;
}
1;
###############################################################################
# gui_listen() - listen for window events for our gui #
###############################################################################
# USAGE: #
# &gui_listen; #
# #
# NOTES: #
# This routine checks the event queue and sees if there is anything that #
# needs to be done. It's called from the main loop of our program. #
# #
# RETURNS: #
# 1; this routine always returns happily. #
###############################################################################
sub gui_listen {
# anyone there?
Win32::GUI::PeekMessage(0,0,0);
Win32::GUI::DoEvents();
return 1;
}
1;
###############################################################################
# gui_note() - send a note to our gui window #
###############################################################################
# USAGE: #
# &gui_note("This is a gui window line. Yup."); #
# #
# NOTES: #
# Much like ¬e, only we send our message to our os specific gui window. #
# #
# RETURNS: #
# 1; this routine always returns happily. #
###############################################################################
sub gui_note {
my ($message) = @_;
# select our last line.
$logbox->Select(999999,999999);
$logbox->ReplaceSel("$message\n", 1);
select(undef, undef, undef, 0.25);
# autoscroll the log box.
$logbox->SendMessage (0x115, 1, 0) while $message =~ /\n|$/g;
# listen for good measure.
Win32::GUI::PeekMessage(0,0,0);
Win32::GUI::DoEvents();
return 1;
}
1;
###############################################################################
# open_url() - open a url in the system's default browser #
###############################################################################
# USAGE: #
# &open_url( "http://127.0.0.1:8888/" ); #
# #
# OS SPECIFIC NOTES: #
# This routine loads the Win32::Shell module to execute the "open" #
# command which will open the browser and load the URL. However, if the #
# user has defined a local path to a browser, we try to open that instead. #
# #
# RETURNS: #
# 1; we instruct the user to open their browser if we can't. #
###############################################################################
sub open_url {
my ($url) = @_;
# we spit out our suggestion just to catch all instances.
¬e("If your browser doesn't load, go to <$url>", 1);
# if a browser_path hasn't been set, try
# to open the default browser using the native API.
# and no, I have no clue what this junk does.
if ( $SETTINGS->{user}->{browser_path} eq "default" ) {
use Win32::API;
my $ShellExecute = new Win32::API("shell32", "ShellExecuteA", ['N','P',
'P', 'P', 'P', 'I'], 'N');
$ShellExecute->Call(0, "open", $url, 0, 0, 1);
}
# if a browser_path has been defined, try passing
# the $url to the .exe and hope it understands.
else {
# if we see "program files" or "internet explorer", we take
# a chance and try to change them to their common eight char
# equivalents. this won't work for all users but covers
# a good large portion of them. yup yup. fun. chicks on speed.
$SETTINGS->{user}->{browser_path} =~ s/program files/progra~1/ig;
$SETTINGS->{user}->{browser_path} =~ s/internet explorer/intern~1/ig;
¬e("Trying to load $SETTINGS->{user}->{browser_path}.");
unless ( fork ) { system("$SETTINGS->{user}->{browser_path} $url"); }
}
return 1;
}
1;
###############################################################################
# _things() - various routines that control the gui and should be private #
###############################################################################
# USAGE: #
# These are internally called by the GUI and shouldn't be publically #
# used. So stop poking around here. Sheesh. Flippin' nosy people. Sigh. #
###############################################################################
# various menu commands.
sub _FileExit_Click { GUI::Show($hwnd); $window->Disable(); $window->Hide;
exit; }
sub _EditCopy_Click { $logbox->SendMessage(0x301,0,0); }
sub _EditSelectAll_Click { $logbox->Select(0,999999);}
# hide the window if it's been minimized. the only
# way to get it back would be from the systray icon.
# we need to figure out what to do when people click
# the "X' on the window. minimize? or close the app?
sub _Window_Minimize { $window->Hide(); }
sub _Window_Terminate { Win32::GUI::NotifyIcon::Delete(
$sys_tray_icon->{-parent}, -id => $sys_tray_icon->{-id} ); exit; }
# if the systray icon is clicked, reenable the window.
# if it's right clicked, hide the main window (weird).
sub _Systray_Click { $window->Enable(); $window->Show; }
sub _Systray_RightClick { $window->Disable(); $window->Hide;
_Window_Terminate();}
Morbus Iff
.sig on other machine.
http://www.disobey.com/
http://www.gamegrene.com/