Hello everyone,
I'm currently developing a rather complex application that contains a broad
variety of the Win32::GUI controls, among them the toolbar control which
causes problems in my case.
I have coded a little sample that demonstrates the issue (the script tries
to load a 16x16 px 2 bit bitmap and a 16x16 px 24 bit bitmap but it will
work the same without them, so just ignore the initial warnings for now):
##### START OF SAMPLE CODE #####
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32;
use Win32::GUI qw(TBSTYLE_BUTTON TBSTATE_ENABLED TBSTYLE_AUTOSIZE
TBSTYLE_SEP);
my $window_main = Win32::GUI::Window->new(
-name => 'Window',
-text => 'Code sample "toolbar problem"',
-width => 640,
-height => 480,
-onResize => \&resizeWindowMain,
-onTerminate => \&quitApplication,
);
my $imagelist_buttons = new Win32::GUI::ImageList(16, 16, 0|24|1, 1, 0);
$imagelist_buttons->Add('dummy.bmp', 'dummy_mask.bmp');
$window_main->AddToolbar(
-imagelist => $imagelist_buttons,
-name => 'Toolbar',
-flat => 1,
-multiline => 1,
-flat => 1,
);
$window_main->{'Toolbar'}->AddString('Dummy button');
$window_main->{'Toolbar'}->AddButtons(
14,
0, 1, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 2, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 3, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,
0, 4, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 5, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 6, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 7, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,
0, 8, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 9, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0,
0, 10, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
0, 11, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, 0,
);
$window_main->AddTreeView(
-name => 'Treeview',
-width => 200,
);
$window_main->Center();
$window_main->Show();
Win32::GUI::Dialog();
$window_main->Hide();
exit(0);
sub quitApplication {
return -1;
}
sub resizeWindowMain {
my $windowMain_height = $window_main->ScaleHeight();
my $windowMain_width = $window_main->ScaleWidth();
my $toolbar_height = $window_main->{'Toolbar'}->Height();
$window_main->{'Toolbar'}->AutoSize();
$window_main->{'Treeview'}->Change(
-pos => [0, $toolbar_height],
);
$window_main->{'Treeview'}->Height($windowMain_height - $toolbar_height);
print $window_main->{'Toolbar'}->GetRows()." rows retrieved.\n";
}
##### END OF SAMPLE CODE #####
This sample creates a simple window with a toolbar containing a lot of dummy
buttons and a treeview. I expected that the treeview control would appear
just below the toolbar. But when I run this script on my machine (Active
Perl 5.10.0.1001, Win32::GUI 1.05.90, Windows Vista 6.0.6000) and resize the
window there appears some space between the two items that increases with
the number of toolbar lines. If the window is wide enough for just one line
of toolbuttons there is no space but as soon as the buttons begin to wrap
due to smaller window dimensions the upper border of the treeview is placed
wrong. Maybe this is a simple mistake in my resizing subroutine but I can't
find any explanation for this behaviour.
As a next step to achieve optimal Windows look and feel under XP / Vista I
decided to use the rebar control, too. The documentation that comes with the
PPM distribution has leaks on this topic and left me with a lot of
questions... I found another version of the rebar help in the sourceforge
documentation project but still I'm not quite sure how to deal with this
control.
There it said that any rebar band can only contain one single child control
so you had to create a window (with "popstyle => WS_CAPTION | WS_SIZEBOX"
and "-pushstyle => WS_CHILD") which contains the controls first and then
assign it to a rebar band as a child. But how can I integrate my former
toolbar into the band? My first thought was to assign the toolbar to the
child window. It kind of worked but in my case looked really weird because
I'm using a manifest file (like the one Rob posted some days ago). The rebar
band uses the correct style (this bluish / glassy optic) but the child
window is simply embedded and appears as an ugly gray overlay... Am I
missing any required style constants here that could help? (I already tried
everything like "WS_CLIP..." and "..._TRANSPARENT" without success.)
Anyway I'm not sure at all if this is the right way to do it because it
seems a little too complicated. I also tried to assign the toolbar directly
to the rebar band. This produced the desired look but now the toolbar
covered the grippers and chevrons of the band. Aaaarghh!!! I think there
must be another way to combine these two controls, right? In the
documentation it even says that "TBSTYLE_EX_HIDECLIPPEDBUTTONS" could be
used for toolbars displayed in rebars to hide partially clipped buttons that
are covered by an adjacent band and show them on the chevron's dropdown menu
instead. I couldn't get that one to work either... :'-(
I guess this is a lot of question marks at once :-) but I'm grateful for
every little hint that could help me to get on the right track. Has anyone
made any experiences with this stuff?
Thanks in advance, best regards from Bonn, Germany,
Matthias.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Perl-Win32-GUI-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/