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().