1. New Features
1.1 New Control Classes
This release introduces four new user controls: BITMAP, IMAGE, METAFILE,
and ICON.
1.1.1 BITMAP Control Class
The BITMAP control class is based on the Win32 static bitmap control,
and is used to display a (possibly scaled) bitmap in a rectangular
region of the dialog box. The format for the BITMAP control is:
ctl[n]:BITMAP(<bitmap_properties>),image="filename",<general_properties>
where '(<bitmap_properties>)' is an optional comma-separated list of
bitmap-specific properties, including:
NOTIFY - enables the control to send messages when it is
clicked. You must specify this if the control is
to process tooltips, cause an action, or invoke a
handler; otherwise, this control is purely passive.
CENTERIMAGE - centers the bitmap within the rectangle instead of
scaling it to cover the entire rectangle
SUNKEN - draws a sunken-looking frame around the rectangle
BORDER - these properties draw other various frames around
CLIENTEDGE the specified rectangle
STATICEDGE
MODALFRAME
Note that the BITMAP control does not support transparency; i.e., the
bitmap will always have a solid background color. For a control that
displays a pseudo-transparent bitmap, use the IMAGE control below.
1.1.2 IMAGE Control Class
The IMAGE control class is similar to the BITMAP control, but is based
on the Win32 owner-drawn static class. The principal difference is
that the IMAGE control supports a form of pseudo-transparency: The
color of the first pixel in the bitmap (i.e., the pixel in the upper
left corner) is taken to be the "transparency" color for the bitmap.
All pixels of this color in the bitmap will be replaced with the
underlying background pixels in the dialog box, thus giving the appearance
of transparency. The format for the IMAGE control is:
ctl[n]:IMAGE(<image_properties>),image="filename",<general_properties>
where '(<image_properties>)' is an optional comma-separated list of
image-specific properties, including:
NOTIFY - enables the control to send messages when it is
clicked. You must specify this if the control is
to process tooltips, cause an action, or invoke a
handler; otherwise, this control is purely passive.
SUNKEN - draws a sunken-looking frame around the rectangle
BORDER - these properties draw other various frames around
CLIENTEDGE the specified rectangle
STATICEDGE
MODALFRAME
1.1.3 METAFILE Control Class
The METAFILE control class is similar to the BITMAP control, but is based
on the Win32 ENHMETAFILE static control. The METAFILE control is used to
display a metafile-based image (rather than a bitmap image) in the specified
rectangle. The image to be displayed may be either a 16-bit Windows Metafile
(.wmf), with or without an Aldus placeable header, or a 32-bit Enhanced
Metafile (.emf). The format for the METAFILE control is:
ctl[n]:METAFILE(<metafile_properties>),image="filename",<general_properties>
where '(<metafile_properties>)' is an optional comma-separated list of
metafile-specific properties, including:
NOTIFY - enables the control to send messages when it is
clicked. You must specify this if the control is
to process tooltips, cause an action, or invoke a
handler; otherwise, this control is purely passive.
SUNKEN - draws a sunken-looking frame around the rectangle
BORDER - these properties draw other various frames around
CLIENTEDGE the specified rectangle
STATICEDGE
MODALFRAME
1.1.4 ICON Control Class
The ICON control class is similar to the BITMAP control, but is based
on the Win32 ICON static control. The ICON control is used to display
a standard Windows icon (a special form of bitmap image) in the specified
rectangle. The format for the ICON control is:
ctl[n]:ICON(<icon_properties>),image="filename",<general_properties>
where '(<icon_properties>)' is an optional comma-separated list of
icon-specific properties, including:
NOTIFY - enables the control to send messages when it is
clicked. You must specify this if the control is
to process tooltips, cause an action, or invoke a
handler; otherwise, this control is purely passive.
CENTERIMAGE - centers the icon within the rectangle instead of
scaling it to cover the entire rectangle
SUNKEN - draws a sunken-looking frame around the rectangle
BORDER - these properties draw other various frames around
CLIENTEDGE the specified rectangle
STATICEDGE
MODALFRAME
1.2 New Control Pseudo-classes
This release also introduces two new user control pseudo-classes:
NONE and MODIFY.
1.2.1 NONE Control Class
Specifying NONE for the class of a control simply deletes the control.
This is useful, for example, to delete one of the predefined user
controls, or to delete unused controls in a multi-filter. The format
for using the NONE class is:
ctl[n]:NONE
To delete control 'n' at run time, call the new built-in function
deleteCtl(n).
1.2.2 MODIFY Control Class
Specifying MODIFY as the control class does not create a new control,
but modifies the general properties of an already existing control.
This is useful, for example, to customize the general properties of
a predefined control. The format for using the MODIFY class is:
ctl[n]:MODIFY,<general_properties>
1.3 Tooltips
You can now define a pop-up tooltip for any user control by using the
tooltip="text" property specifier. For example:
ctl[0]:CHECKBOX,"Wrap",tooltip="Wrap effect at edge of image"
For static control classes (IMAGE, BITMAP, ICON, METAFILE, RECT,
FRAME, and STATICTEXT), you must specify the 'notify' class-specific
property so the control can process tooltip messages.
To change the tooltip for a control at run time, call the built-in
function setCtlToolTip(c,"new tooltip text",s), where 'c' is the
index of the control and 's' specifies any style bits (usually 0).
For example:
setCtlToolTip(0, "Replicate pixels at edge of image", 0x02);
where the style 0x02 (TTF_CENTERTIP) causes the tooltip to be centered
beneath the control rather than positioned to the right of the cursor.
To delete the tooltip for a control, specify tooltip="" or specify
NULL instead of a character string for the second argument in the
call to setCtlToolTip().
1.4 New Function setCtlImage()
Use the new built-in function setCtlImage(c,"filename",'X') to change
the image displayed by an IMAGE, METAFILE, BITMAP, or ICON control at run
time. 'X' is a char constant that specifies the type of image file, as
follows:
'B' - bitmap file (.bmp)
'W' - Windows (old-style) metafile (.wmf)
'E' - enhanced metafile (.emf)
'I' - icon file (.ico)
'C' - cursor file (.cur)
'J' - JPEG file (.jpg)
'G' - GIF file (.gif)
'M' - MIG (mouse-ivo graphics) file (.mig)
0 - unspecified file type
Note: Only the 'B', 'W', 'E', and 'I' file types are recognized in the
current release. The remaining types are reserved for future use.
1.5 New Function ErrorOk()
A new built-in function, ErrorOk(fmt,...), has been added. This is similar
to the Error() built-in function, but displays only one pushbutton (OK),
and always returns IDOK.
1.6 Action=ABOUT
A new default control action ('action=about') has been added. Specifying
this action for a control causes the FM 'About' dialog box to be displayed
when the control is activated. (For static control classes, you must
include the 'notify' class-specific property if this action is to have
any effect.) To set this action for a control at run time, call the
setCtlAction(n,a) function with CA_ABOUT as the second argument.
1.7 TRACKBAR Tick Marks
You can now set the frequency of tick marks in a TRACKBAR control with
the 'ticfreq=n' control property, or by calling the setCtlTicFreq(c,n)
built-in function. The control will draw a tick mark at an interval of
every 'n' units; the default is n=1. (You must specify the 'autoticks'
property for the TRACKBAR control if this to have any visible effect.)
2. Changes
2.1 New Registration Scheme (Full version only)
In the full versions of FM, authorization to generate a standalone filter
is now based on a 'registration code' rather than a password. You will be
asked for your user name, organization, and registration code the first time
you try to Make a standalone filter. Thereafter, the registration information
is stored in a secure manner in the Windows registry, and you will normally
never be required to reenter your registration information.
2.2 Configurable Predefined Controls
The OK, Cancel, Edit, and FM Logo predefined controls are now fully configurable
by the Filter Designer. They are defined the same as an ordinary user control,
using special dedicated control indexes at the high end of the index range.
Since these special control indexes may be assigned different values in future
releases, always refer to them by their symbolic names: CTL_OK, CTL_CANCEL,
CTL_EDIT, and CTL_LOGO. The default definitions for these controls are:
ctl[CTL_OK]:PUSHBUTTON(default),"OK",pos=(306,126),size=(34,14),
action=apply,tooltip="Apply filter to main image"
ctl[CTL_CANCEL]:PUSHBUTTON,"Cancel",pos=(269,126),size=(34,14),
action=cancel,tooltip="Exit without applying filter"
ctl[CTL_EDIT]:PUSHBUTTON,"&Edit >>>",pos=(231,126),size=(34,14),
action=edit,tooltip="Edit filter source code"
ctl[CTL_LOGO]:IMAGE(notify),image="logo2.bmp",pos=(352,97),size=(32,43),
action=about,tooltip="About this filter"
If you want to customize these predefined controls in your filter,
you can completely redefine or delete them. If you want to change
only the general properties of a predefined control, you can simply
use the MODIFY pseudo-class specifier. For example, to change the
logo 'image' and 'size' general properties:
ctl[CTL_LOGO]:MODIFY,image="MyLogo.bmp",size=(34,40)
To delete a predefined control altogether, use the NONE pseudo-class
specifier. For example, if you want to delete the OK control from
your demo filter, specify:
ctl[CTL_OK]:NONE
Note that the CTL_EDIT control is handled specially. You cannot change
the predefined text labels and tooltips for this control, since they are
assigned dynamically by FM. If you really want to change the label and/or
tooltip for an EDIT control, delete the predefined control and define
your own edit control using some other available control index. For
example:
//delete the predefined edit control
ctl[CTL_EDIT]:NONE
//now define my own custom version
ctl[49]:PUSHBUTTON,"Edit",action=edit,tooltip="Open/Close edit window"
Finally, note that the CTL_EDIT control is *never* defined in a standalone
filter; any references to the CTL_EDIT control index will be ignored in a
standalone filter.
In future releases, the predefined proxy preview, progress bar, and Host
Application static text controls will also be fully configurable.
In the current release, the range of valid control indexes is 0 - 63,
inclusive. The predefined controls are assigned indexes in the range
50 - 63. To avoid conflict with the predefined controls, use indexes
in the range 0 - 49 for your own control definitions.
2.3 New Default FM Logo
The default FM Logo in the filter dialog box now uses the IMAGE control to
display a transparent scaleable bitmap of Wern's Gartenzwerg logo. You are
free to redefine the logo in any way you like. To revert to the metafile-
based "butterfly" logo used in release 0.4.11, use the following control
and Embed specifications:
ctl[CTL_LOGO]:METAFILE(notify),image="buttrfly.wmf",
pos=(329,90),size=(56,47),action=about
Embed:metafile="buttrfly.wmf"
Note: "buttrfly.wmf" is supplied as an external file in the FM installation
package.
2.4 Host Application Trademark Symbols
To be legally correct, appropriate trademark (tm) and registered trademark (®)
symbols have been inserted into the names of various host applications as
displayed by the Host Application static text control in the FM dialog box.
2.5 Use CMOV and Use MMX
The 'Use CMOV' checkbox in Advanced Edit mode is now turned off by default,
even if the CMOV instructions are available on the host processor. If
either the 'Use CMOV' or 'Use MMX' checkbox is checked when you try to MAKE
a standalone filter, FM warns that the resulting filter may not execute
correctly on all systems.
2.6 Warning to Embed Resources
FM now warns you when making a standalone filter if you have specified a
background image for the dialog box, or you have specified an image for
any of the static image controls (IMAGE, BITMAP, ICON, METAFILE), but
no files have been embedded with the Embed: specifier. This is not
necessarily an error, but a reminder to the FD to embed any resources
as desired.
2.7 Reminder to use Return Statement
FM now warns you if your ForEveryTile handler does not contain a return
statement. The previous "kludge" of specifying a bare 'true' or 'false'
expression as the return value is now obsolescent, and will be phased out
altogether in a future release. This warning will serve as a reminder
to you to replace all such bare 'true' or 'false' return values with the
proper return statement (i.e., 'return true' or 'return false').
This warning also applies to other handlers which expect a return value,
such as OnZeroDivide.
2.8 New Control Default Values
The default size, position, and action for certain user controls has
changed. This may affect your dialog layout if you depended on these
defaults.
2.9 New Embeddable File Types
In addition to bitmaps, you can now embed metafiles, icons, and wave files
in your standalone filter with the Embed: key. To embed a metafile,
specify:
Embed:metafile="filename"
To embed an icon, specify:
Embed:icon="filename"
To embed a wave file, specify:
Embed:wave="filename"
Note: Wave files are reserved for future use.
2.10 New End-of-file Token
The optional FF+ end-of-file token has been changed from %EOF to %%EOF to
avoid a syntactic ambiguity. You can think of %%EOF as marking the start
of a "super" comment that extends to the physical end of the source file.
This is useful, for example, to comment out large sections of source code
when tracking down the location of a compilation error.
3. Bug Fixes
3.1 A scrollbar with an inverted range (min > max) did not display the
initial value correctly. This has been fixed.
3.2 Vertical scrollbars and trackbars (e.g., STANDARD(vert), SCROLLBAR(vert),
or TRACKBAR(vert)) now function correctly.
3.3 The 'bottomtip' and 'righttip' properties for a horizontal or vertical
TRACKBAR control (respectively) now operate correctly. (Previously,
'bottomtip' functioned the same as 'toptip' and 'righttip' functioned
the same as 'lefttip'.)
3.4 The background of a STATICTEXT control is now updated properly when
changing the text for the control.
3.5 A TRACKBAR control is now updated correctly whenever its background color
is changed.
3.6 The default action for a scrollbar or trackbar was ignored in previous
releases, and the 'apply' action was always performed. This has been fixed.
3.7 Referencing a user-declared array no longer causes a GP fault. (However,
note that arrays are still not implemented, and should *not* be declared
in your current FF+ code.)
3.8 A few resource leaks have been fixed.
4. Known Problems
4.1 A TRACKBAR control with an inverted range (min > max) does not function
correctly.
4.2 The TTF_CENTERTIP style is not always applied correctly when specified in
a call to setCtlToolTip().