| |
To use XFLOGM, just insert XFLOGM.f90.
XFLOGM, as DFLOGM, is useful for both Win32 and QuickWin
applications. Since Mar 10. 2003, XFLOGM is compatible
with DFLOGM.lib from all CVF versions (verified on 5.0D and 6.6B - please
contact me if you have problems).
-
DLG_BKCOLOR and
DLG_COLOR control indices are available static text, group boxes, push buttons, check
boxes, and radio buttons. Syntax is:
result = DlgSet/DlgGet(Dlg, idControl, nRGBvalue, DLG_COLOR)
result = DlgSet/DlgGet(Dlg, idControl, nRGBvalue, DLG_BKCOLOR)
where nRGBvalue is integer in Win32 COLORREF format. nRGBValue can be
obtained using:
- Hex notation #BBGGRR
- MSFLIB RGBToInteger function
- DFWIN RGB function
Remarks
For push buttons, due to Win32 design, these flags affect only "focus
rectangle"; for other controls text background and text color are
affected, as in picture.
To retreat to the default color values, use -1 as
nRGBvalue argument.¹
-
DLG_VISIBLE control
index shows or hides the control. Syntax is:
result = DlgSet/DlgGet(Dlg, idControl, bVisible, DLG_VISIBLE)
where bVisible is flag which determines visibility of the control.
Remarks
In version of May 7th 2001, XFLOGM is fixed so that:
- DLG_VISIBLE property is correctly initialized according to control's
"Visible" style as set up in resource editor; earlier, it was
always initialized to .TRUE., causing misbehaviour for controls which are
initially hidden.
- DLG_VISIBLE property is not updated when the dialog is hidden. Before the
fix, when the dialog is hidden using ShowWindow or during DlgInitCallback,
DlgGet(...DLG_VISIBLE) would always return .FALSE.; now, it returns the last
visible state of the control.
-
DLG_BITMAP and
DLG_ICON¹ control indices are available for push buttons, push-like check boxes, push-like
radio buttons and static controls (with "icon" or
"bitmap" style). You have to set "Bitmap" or
"Icon" style on
control's property
sheet in order to assign the bitmap to it. Syntax is:
result = DlgSet/DlgGet(Dlg, idControl,
hImage, DLG_BITMAP)
where hImage is integer representing handle of the image. You can
obtain hBitmap using one of the following Win32 (DFWIN) functions:
LoadBitmap, LoadImage, CreateBitmapIndirect, CreateBitmap, LoadIcon
Where LoadImage is the most useful, with capability of loading bitmaps and
icons both as
resource and from file and providing "transparent" effect
(LR_LOADMAP3DCOLORS), i.e. light-gray in the original bitmap is replaced
with the 3D face color in the actual color scheme. Also, to use 16x16 or
other non-default size icons you have to use LoadImage.
Remarks
LoadImage function is not declared in CVF versions up to 6.0 (to my
knowledge) Please refer to comments in Test.f90 about declaring and using
LoadImage function, as well as your Win32 help.
For static controls, hBitmap argument can be also handle of an icon. Icon
can be loaded using LoadIcon or LoadImage Win32 function. The static control
has to have "icon" style.
-
DlgSetHelp routine enables you to register
your own callback routine when either the user presses the F1 key or uses
"context help" dialog feature. DlgSetHelp is similar to DlgSetSub,
except that Syntax is:
result = DlgSetHelp(Dlg, HelpCallback)
Where HelpCallback is an EXTERNAL routine which has to be of prototype:
SUBROUTINE HelpCallback(Dlg, idControl, MouseX, MouseY)
where idControl is ID of the control that's been clicked on in the
"context help" mode of the dialog, and MouseX and MouseY are mouse
coordinates (in screen coordinates).
When CONTEXTID symbol
is !DEC$DEFINEd on top of XFLOGM.f90 source (or in Project
settings/Fortran/Preprocessor), an additonal argument, idContext, is passed
to HelpCallback. HelpCallback must have the following prototype:
SUBROUTINE HelpCallback(Dlg, idControl, idContext,
MouseX, MouseY)
idContext is control's help context ID. When used, it
can be passed directly to WinHelp function and appropriate popup will appear
- no need for SELECT CASE(idControl).
Remarks
HelpCallback routine typically invokes an user-provided help page from a
.hlp file. Please refer to WinHelp Win32 function for details, and Test.f90
sample.
In order to enable context-help feature, you must check both "system
menu" and "context help" styles on the dialog's property
sheet in resource editor. If so, HelpCallback will be called upon clicking
on a control with "question mark" cursor; idControl argument
contains ID of the control. HelpCallback should then invoke appropriate
popup description using WinHelp function with HELP_CONTEXTPOPUP flag.
On pressing F1 key idControl will contain the ID of the control which has
the keyboard focus. However, note that the dialog need not have neither
"context help" nor "system menu" style in order to
respond to F1 key. If you decide to use a single help page for entire dialog
instead of context help popups, simply ignore idControl argument and invoke
appropriate page using WinHelp with HELP_CONTEXT flag. <Greg>If
CONTEXTID feature is used, by using the HelpID
property check box, the resource compiler produces an output Resource.HM
file. This resource file may then be used directly in the [MAP] section of
the .HPJ project file when compiling the .HLP file, thus saving the process
of adding each topic individually. Of course, the .RTF file must then use
the ContextID rather than the ControlID when writing each topic. </Greg>
MouseX and MouseY arguments are typically ignored; use them if you want to
use a mechanism other than WinHelp, such as tooltips.
-
DLG_DRAWITEM
control index can be used in conjunction with DlgSetSub for static-controls
with "owner-drawn" style. Owner-drawn static controls enable you
to draw on its surface at run-time, providing means for displaying bitmaps
that change at run-time. Test.f90 sample uses an owner-drawn static control
for creation of a simple animation. Syntax is:
result = DlgSetSub(Dlg, idStatic, OwnerDrawCallback, DLG_DRAWITEM)
where idStatic is ID of static control with "owner-draw" style,
and OwnerDrawCallback is EXTERNAL callback routine of prototype:
SUBROUTINE OwnerDrawCallback(Dlg, idControl, hDC)
where hDC is integer handle of control's DC. Note that OwnerDrawCallback is
of the same prototype as any other routine registered with DlgSetSub. Third
argument is used to pass handle of control's DC so that the routine can
perform drawing. With other "standard" callbacks this argument is
used to indicate type of event that happened on the control; however, since
static controls do not respond to user input, this argument is used for
other purpose.
Also, note that "standard" callbacks are invoked when the user
performs an action on the control. DLG_DRAWITEM callback is, however,
invoked without direct user's action -- whenever the control has to be
redrawn. Redrawing occurs whenever a part of the control is revealed, e.g.
when another window is moved over the control or when the application comes
into foreground. Also, the application itself can force redrawing using
Win32 function InvalidateRect. In Test.f90 sample, animation is realised so
that a timer is started immediately before DlgModal; the timer function is
invoked every 0.1 s and it changes the global radius of the circle and then
calls InvalidateRect function, which indirectly triggers the DLG_DRAWITEM
callback. For example, if you want the image to change as result of an event
in another control in the dialog, simply make a callback routine for that
control which calls InvalidateRect. Note that data necessary to perform
drawing has to be either exchanged via global variables, or
OwnerDrawCallback has to be "intelligent", performing the drawing
on the basis of state of other controls in the dialog.
Remarks
Drawing on control's surface has to be done using Win32 GDI functions.
MSFLIB functions such as MoveTo, Rectangle, SetColor are unusable for this
purpose. Please refer to "Painting and Drawing" section of Win32
help for detailed description.
VS resource editor does not enable you to specify "owner drawn"
style for static controls from the IDE (on the control's property sheet). To
workaround this, insert a "picture" control of type "black
frame". After saving resource, open the .rc file in a text editor
(from VS IDE, in File/Open dialog, specify "Text" in "Open
as" dropdown) and replace "SS_BLACKFRAME" with
"SS_OWNERDRAW" for that control. Make sure that control ID is
other than IDC_STATIC.
-
You can specify
handle of the dialog's owner window as second optional argument to DlgModal,
which is useful for Win32 applications.
-
A change in behaviour
of dialogs with "center" style is introduced in XFLOGM. By
default, dialogs with this style are displayed in center of the screen. More
logical behaviour is that they are centered relative to its owner-window (as
specified in above-mentioned change in DlgModal). In QuickWin
applications, you can obtain handle of dialog's parent window using
GetHWNDQQ MSFLIB function.
-
With
original DFLOGM, tabbed dialogs had a flaw that the tab key did not work
correctly to navigate between items in child dialogs. The cause of the
problem was that it required child dialogs to be children of Tab control.
Tab control gets in the way of how IsDialogMessage handles special keys
(Tab, Enter, Cancel).
A far better setup is to set child dialogs to have main dialog as
parent. XFLOGM now allows you to specify
result = DlgModeless(ChildDlg, SW_HIDE, MainDlg%hWnd)
("old" style is still supported). Also,
don't forget that child dialogs have to have "Child" and
"Control" styles for tab key to work correctly.²
-
Subroutine
DlgSetTitle(Dlg, title) sets the caption of the dialog. ³
¹) As of Dec 11 2001.
²) As of
Apr 11 2002.
³) As of
Mar 10 2003.
|