This document covers the following topics:
Note
Status bar
controls are not to be confused with the traditional dialog status bar which
is created by selecting the status bar check box in the Dialog Attributes window in the dialog editor, or by setting the
dialog's HAS-STATUS-BAR
attribute at run-time. If
you are using status bar controls, you should leave the status bar
check box unchecked and not set the HAS-STATUS-BAR
attribute.
Status bar controls are created in the dialog editor in the same way as other standard controls (such
as list boxes or push buttons) are. That is, they are either created statically in the
dialog editor via the
menu or by drag and drop from the Insert tool bar, or
dynamically at run-time by using a PROCESS GUI ACTION
ADD
statement with the TYPE
attribute set to
STATUSBARCTRL
.
Unlike most other control types, status bar controls cannot be nested within another control and cannot be created within an MDI child dialog. In an MDI application, the status bar control(s) must belong to the MDI frame dialog.
A status bar control may have zero or more panes associated with it. Panes may be defined
in the dialog editor
from within the status bar control's attribute window, or at run-time by performing a
PROCESS GUI ACTION
ADD
statement with the TYPE
attribute set to
STATUSBARPANE
.
A status bar control without panes offers restricted functionality, because most attributes providing access to the enhanced functionality of status bar controls are only supported for status bar panes. If you wish to do more with a status bar control than simply display a line of text, but don't need to split up the status bar control into multiple sections, you should create a single pane that occupies the full width of the status bar control.
If panes are defined for a status bar control, it should be decided whether each pane should stretch (or contract) when the containing dialog is resized, or whether it should maintain a constant width. The former are referred to here as "stretchy" panes, and the latter as "non-stretchy" panes.
There is no explicit flag in the Status Bar Control
Attributes window to mark a pane as stretchy or non-stretchy. Instead, any
pane defined with a width (RECTANGLE-W
attribute) of 0 is implicitly
assumed to be a stretchy pane, whereas any panes with a non-zero width definition are
implicitly assumed to be fixed-width panes of the specified width (in pixels). Because
the RECTANGLE-W
attribute defaults to 0, all
panes are initially stretchy when defined in the dialog editor.
The width of a visible stretchy pane is determined by taking the total width available for all panes in the status bar control, subtracting the widths of all visible fixed-width panes, then dividing the result by the number of visible stretchy panes.
Note
The total available width for all panes normally excludes the sizing gripper,
implying that the last pane stops short of the gripper, if present. However, if the
status bar
control has exactly one pane, and that pane is a stretchy pane, the full
width of the dialog (including any sizing gripper) is used.
Text can be output to the status bar control in one of three ways:
For status bar controls with panes, by setting the STRING
attribute of the pane whose text
is to be set.
By setting the STRING
attribute of the status bar control
itself, which is equivalent to setting the STRING
attribute of the
first stretchy pane (if any) for status bar controls with panes.
By setting the STATUS-TEXT
attribute of the dialog.
This is equivalent to setting the STRING
attribute of the status bar control
(if any) identified by the dialog's STATUS-HANDLE
attribute.
Note that the last method is often the most convenient for setting the message text, because it does not require a knowledge of the status bar control or pane handles.
Example:
DEFINE DATA LOCAL 01 #DLG$WINDOW HANDLE OF WINDOW 01 #STAT-1 HANDLE OF STATUSBARCTRL 01 #PANE-1 HANDLE OF STATUSBARPANE END-DEFINE ... #DLG$WINDOW.STATUS-HANDLE := #STAT-1 ... #PANE-1.STRING := 'Method 1' ... #STAT-1.STRING := 'Method 2' ... #DLG$WINDOW.STATUS-TEXT := 'Method 3'
Note
The dialog editor
automatically generates code to set the STATUS-HANDLE
attribute to the
first status bar control (if any). Therefore, the STATUS-HANDLE
attribute only
needs to be set explicitly if you are dynamically creating status bar controls, or if you
have defined more than one status bar control in a dialog, and wish to switch between
them.
Because status bar controls cannot be created for MDI child dialogs, it is convenient to not have to define multiple status bar controls in the MDI frame dialog. An alternative method is to define just a single status bar, and share it between each child dialog. This can be achieved as follows:
Define all possible panes you wish to use in your application within a single status bar control in the MDI frame dialog.
Mark all panes as "shared".
Export the handles of all panes to corresponding shadow variables in a GDA, so that the MDI child dialogs can access them directly.
In the COMMAND-STATUS
event handler, set the VISIBLE
attribute of all panes you wish
to display for that dialog to TRUE
. All other panes will be automatically
made invisible.
Note
In the COMMAND-STATUS
event, you must also set the ENABLED
state of any
commands (signals, or menu or tool bar items which do not reference another object via
their SAME-AS
attribute) associated with the
dialog, otherwise they will be automatically disabled. The commands associated with the
dialog are all non-shared commands for the MDI frame and all shared commands for the
active MDI child (or MDI frame, if no MDI child dialog is active).
Context menus are defined for the status bar control and not per-pane. However, if you wish to ensure that the context menu for a status bar control only appears when the user right clicks a particular pane, you can associate a context menu with the status bar control, but suppress it if the user clicks outside that pane.
Example:
DEFINE DATA LOCAL 01 #CTXMENU-1 HANDLE OF CONTEXTMENU 01 #STAT-1 HANDLE OF STATUSBARCTRL 01 #PANE-1 HANDLE OF STATUSBARPANE 01 #PANE-2 HANDLE OF STATUSBARPANE 01 #PANE-3 HANDLE OF STATUSBARPANE 01 #PANE HANDLE OF STATUSBARPANE 01 #X (I4) 01 #Y (I4) END-DEFINE ... #STAT-1.CONTEXT-MENU := #CTXMENU-1 ... DECIDE ON FIRST *CONTROL ... VALUE #CTXMENU-1 DECIDE ON FIRST *EVENT ... VALUE 'BEFORE-OPEN' /* Get click position relative to status bar control PROCESS GUI ACTION INQ-CLICKPOSITION WITH #STAT-1 #X #Y GIVING *ERROR /* Get pane (if any) at specified position PROCESS GUI ACTION INQ-ITEM-BY-POSITION WITH #STAT-1 #X #Y #PANE /* Only show context menu if user clicked in second pane IF #PANE = #PANE-2 #CTXMENU-1.ENABLED := TRUE ELSE #CTXMENU-1.ENABLED := FALSE END-IF ... END-DECIDE ... END-DECIDE ... END
Note
If you wish to display a different context menu for different status bar panes, the
menu items must be created dynamically in the context menu's BEFORE-OPEN
event.