This document covers the following topics:
Anmerkung:
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 stetchy 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.
Anmerkung:
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'
Anmerkung:
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.
Anmerkung:
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
Anmerkung:
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.