1999-01-13 22:28:54 +03:00
|
|
|
<HTML><BODY>
|
1999-01-13 20:48:12 +03:00
|
|
|
<H1 ALIGN=RIGHT><A NAME=basics>2 - FLTK Basics</A></H1>
|
1999-01-13 22:28:54 +03:00
|
|
|
This chapter will teach you the basics of compiling programs that use
|
|
|
|
FLTK.
|
1998-12-29 17:21:17 +03:00
|
|
|
<H2>Naming</H2>
|
1999-01-13 22:28:54 +03:00
|
|
|
All public symbols in FLTK start with the characters 'F' and 'L':
|
|
|
|
<UL>
|
|
|
|
<LI>Functions are either <TT>Fl::foo()</TT> or <TT>fl_foo()</TT>. </LI>
|
|
|
|
<LI>Class and type names are capitalized: <TT>Fl_Foo</TT>. </LI>
|
|
|
|
<LI><A href=enumerations.html#Enumerations>Constants and enumerations</A>
|
|
|
|
are uppercase: <TT>FL_FOO</TT>. </LI>
|
|
|
|
<LI>All header files start with <TT><FL/...></TT>. </LI>
|
|
|
|
</UL>
|
1998-12-29 17:21:17 +03:00
|
|
|
<H2>Header Files</H2>
|
1999-01-13 22:28:54 +03:00
|
|
|
The proper way to include FLTK header files is:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
|
|
|
#include <FL/Fl_xyz.H>
|
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
<B>Microsoft Windows developers please note:</B> case *is* significant
|
|
|
|
under other operating systems, and the C standard uses the forward
|
1999-01-31 10:43:16 +03:00
|
|
|
slash (/) to separate directories. <i>Do not do any of the following:</i>
|
1999-01-13 22:28:54 +03:00
|
|
|
<UL>
|
|
|
|
<PRE>
|
|
|
|
#include <FL\Fl_xyz.H>
|
1999-01-31 10:43:16 +03:00
|
|
|
#include <fl/fl_xyz.h>
|
|
|
|
#include <Fl/fl_xyz.h>
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
1998-12-29 17:21:17 +03:00
|
|
|
<H2>Compiling Programs with Standard Compilers</H2>
|
1999-01-13 22:28:54 +03:00
|
|
|
Under UNIX (and under Microsoft Windows when using the GNU development
|
|
|
|
tools) you will probably need to tell the compiler where to find the
|
|
|
|
header files. This is usually done using the <TT>-I</TT> option:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
1998-12-29 17:21:17 +03:00
|
|
|
CC -I/usr/local/include ...
|
|
|
|
gcc -I/usr/local/include ...
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
Similarly, when linking your application you will need to tell the
|
|
|
|
compiler to use the FLTK library:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
1998-12-29 17:21:17 +03:00
|
|
|
CC ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
|
|
|
|
gcc ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
1998-12-29 17:21:17 +03:00
|
|
|
<H2>Compiling Programs with Microsoft Visual C++</H2>
|
1999-01-13 22:28:54 +03:00
|
|
|
In Visual C++ you will need to tell the compiler where to find the
|
|
|
|
FLTK header files. This can be done by selecting "Settings" from the
|
|
|
|
"Project" menu and then changing the "Preprocessor" settings under the
|
2000-03-15 21:57:07 +03:00
|
|
|
"C/C++" tab. You will also need to add the FLTK and WinSock (WSOCK32.LIB)
|
|
|
|
libraries to the "Link" settings.
|
1999-01-13 22:28:54 +03:00
|
|
|
<P>You can build your Microsoft Windows applications as Console or
|
|
|
|
WIN32 applications. If you want to use the standard C <TT>main()</TT>
|
|
|
|
function as the entry point, FLTK includes a <TT>WinMain()</TT>
|
|
|
|
function that will call your <TT>main()</TT> function for you. </P>
|
1999-01-27 00:36:02 +03:00
|
|
|
<P><I>Note: The Visual C++ 5.0 optimizer is known to cause problems with
|
1999-01-13 22:28:54 +03:00
|
|
|
many programs. We only recommend using the "Favor Small Code"
|
1999-01-27 00:36:02 +03:00
|
|
|
optimization setting.</I> The Visual C++ 6.0 optimizer seems to be much
|
|
|
|
better and can be used with the "optimized for speed" setting.</P>
|
1998-12-29 17:21:17 +03:00
|
|
|
<H2>Writing Your First FLTK Program</H2>
|
1999-01-27 00:36:02 +03:00
|
|
|
All programs must include the file <TT><FL/Fl.H></TT>. In addition the
|
1999-01-13 22:28:54 +03:00
|
|
|
program must include a header file for each FLTK class it uses.
|
|
|
|
Listing 1 shows a simple "Hello, World!" program that uses FLTK to
|
|
|
|
display the window.
|
2000-04-28 22:15:26 +04:00
|
|
|
<UL>
|
|
|
|
<P><I>Listing 1 - "hello.cxx"</I>
|
1999-01-13 22:28:54 +03:00
|
|
|
<PRE>
|
|
|
|
#include <FL/Fl.H>
|
|
|
|
#include <FL/Fl_Window.H>
|
|
|
|
#include <FL/Fl_Box.H>
|
1998-12-29 17:21:17 +03:00
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
Fl_Window *window = new Fl_Window(300,180);
|
1999-01-31 10:43:16 +03:00
|
|
|
Fl_Box *box = new Fl_Box(20,40,260,100,"Hello, World!");
|
|
|
|
box->box(FL_UP_BOX);
|
1999-01-13 22:28:54 +03:00
|
|
|
box->labelsize(36);
|
|
|
|
box->labelfont(FL_BOLD+FL_ITALIC);
|
|
|
|
box->labeltype(FL_SHADOW_LABEL);
|
|
|
|
window->end();
|
|
|
|
window->show(argc, argv);
|
1998-12-29 17:21:17 +03:00
|
|
|
return Fl::run();
|
|
|
|
}
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
After including the required header files, the program then creates a
|
|
|
|
window:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
|
|
|
Fl_Window *window = new <A href=Fl_Window.html#Fl_Window>Fl_Window</A>(300,180);
|
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
and a box with the "Hello, World!" string in it:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
1999-01-31 10:43:16 +03:00
|
|
|
Fl_Box *box = new <A href=Fl_Box.html#Fl_Box>Fl_Box</A>(20,40,260,100,"Hello, World!");
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
1999-01-31 10:43:16 +03:00
|
|
|
Next, we set the type of box and the size, font, and style of the label:
|
1999-01-13 22:28:54 +03:00
|
|
|
<UL>
|
|
|
|
<PRE>
|
1999-01-31 10:43:16 +03:00
|
|
|
box->box(FL_UP_BOX);
|
1999-01-13 22:28:54 +03:00
|
|
|
box-><A href=Fl_Widget.html#Fl_Widget.labelsize>labelsize</A>(36);
|
|
|
|
box-><A href=Fl_Widget.html#Fl_Widget.labelfont>labelfont</A>(FL_BOLD+FL_ITALIC);
|
|
|
|
box-><A href=Fl_Widget.html#Fl_Widget.labeltype>labeltype</A>(FL_SHADOW_LABEL);
|
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
Finally, we show the window and enter the FLTK event loop:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
|
|
|
window-><A href=Fl_Group.html#Fl_Group.end>end</A>();
|
|
|
|
window-><A href=Fl_Window.html#Fl_Window.show>show</A>(argc, argv);
|
|
|
|
return <A href=functions.html#run>Fl::run</A>();
|
|
|
|
</PRE>
|
|
|
|
</UL>
|
1999-01-13 23:55:40 +03:00
|
|
|
The resulting program will display the window below. You can quit the
|
1999-01-13 22:28:54 +03:00
|
|
|
program by closing the window or pressing the ESCape key.
|
2001-05-06 20:25:05 +04:00
|
|
|
<P ALIGN=CENTER><IMG src="hello.C.gif" alt="Hello, World! Window"></P>
|
1998-12-29 17:21:17 +03:00
|
|
|
<H3>Creating the Widgets</H3>
|
1999-01-31 10:43:16 +03:00
|
|
|
The widgets are created using the C++ <TT>new</TT> operator. For
|
|
|
|
most widgets the arguments to the constructor are:
|
1999-01-13 22:28:54 +03:00
|
|
|
<UL>
|
|
|
|
<PRE>
|
2000-04-28 22:15:26 +04:00
|
|
|
Fl_Widget(x, y, width, height, label)
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
<P>The <TT>x</TT> and <TT>y</TT> parameters determine where the widget
|
|
|
|
or window is placed on the screen. In FLTK the top left corner of the
|
|
|
|
window or screen is the origin (i.e. x = 0, y = 0) and the units are in
|
|
|
|
pixels. </P>
|
|
|
|
<P>The <TT>width</TT> and <TT>height</TT> parameters determine the size
|
|
|
|
of the widget or window in pixels. The maximum widget size is
|
|
|
|
typically governed by the underlying window system or hardware. </P>
|
1999-01-19 23:53:39 +03:00
|
|
|
<p><tt>label</tt> is a pointer to a character string to label the
|
|
|
|
widget with or <tt>NULL</tt>. If not specified the label defaults to
|
2000-04-28 22:15:26 +04:00
|
|
|
<tt>NULL</tt>. The label string must be in static storage such as a
|
|
|
|
string constant because FLTK does not make a copy of it - it just uses
|
|
|
|
the pointer.
|
1999-01-31 10:43:16 +03:00
|
|
|
<H3>Get/Set Methods</H3>
|
|
|
|
<tt>box->box(FL_UP_BOX)</tt> sets the type of box the
|
|
|
|
Fl_Box draws, changing it from the default of <tt>FL_NO_BOX</tt>, which means
|
|
|
|
that no box is drawn. In our "Hello, World!" example we use <TT>
|
|
|
|
FL_UP_BOX</TT>, which means that a raised button border will be drawn
|
2001-10-01 00:25:36 +04:00
|
|
|
around the widget. You can learn more about boxtypes in <A href="common.html#boytypes">
|
1999-01-31 10:43:16 +03:00
|
|
|
Chapter 3</A>.
|
|
|
|
<p>You could examine the boxtype in by doing
|
|
|
|
<tt>box->box()</tt>. Fltk uses method name overloading to make
|
|
|
|
short names for get/set methods. A "set" method is always of the form
|
|
|
|
"void name(type)", and a "get" method is always of the form
|
|
|
|
"type name() const".
|
2000-04-28 22:15:26 +04:00
|
|
|
|
|
|
|
<H3>Redrawing After Changing Attributes</H3>
|
|
|
|
<p>Almost all of the set/get pairs are very fast, short inline
|
1999-01-31 10:43:16 +03:00
|
|
|
functions and thus very efficient. However, <i>the "set" methods do
|
2000-04-28 22:15:26 +04:00
|
|
|
not call <TT>redraw()</TT></i> - you have to call it yourself. This greatly
|
1999-01-31 10:43:16 +03:00
|
|
|
reduces code size and execution time. The only common exception is
|
2000-04-28 22:15:26 +04:00
|
|
|
<tt>value()</tt> which calls <TT>redraw()</TT> if necessary.
|
|
|
|
|
1998-12-29 17:21:17 +03:00
|
|
|
<H3>Labels</H3>
|
2000-04-28 22:15:26 +04:00
|
|
|
All widgets support labels. In the case of window widgets, the label
|
1999-01-13 22:28:54 +03:00
|
|
|
is used for the label in the title bar. Our example program calls the <A href=Fl_Widget.html#Fl_Widget.labelfont>
|
|
|
|
<TT>labelfont</TT></A>, <A href=Fl_Widget.html#Fl_Widget.labelsize><TT>
|
|
|
|
labelsize</TT></A>, and <A href=Fl_Widget.html#Fl_Widget.labeltype><TT>
|
|
|
|
labeltype</TT></A> methods.
|
|
|
|
<P>The <TT>labelfont</TT> method sets the typeface and style that is
|
|
|
|
used for the label, which for this example we are using <TT>FL_BOLD</TT>
|
|
|
|
and <TT>FL_ITALIC</TT>. You can also specify typefaces directly. </P>
|
|
|
|
<P>The <TT>labelsize</TT> method sets the height of the font in pixels. </P>
|
|
|
|
<P>The <TT>labeltype</TT> method sets the type of label. FLTK supports
|
2000-04-28 22:15:26 +04:00
|
|
|
normal, embossed, shadowed, symbol, and image labels internally, and
|
|
|
|
more types can be added as desired. </P>
|
1999-01-13 22:28:54 +03:00
|
|
|
<P>A complete list of all label options can be found in <A href=common.html#labels>
|
|
|
|
Chapter 3</A>. </P>
|
2000-04-28 22:15:26 +04:00
|
|
|
|
1998-12-29 17:21:17 +03:00
|
|
|
<H3>Showing the Window</H3>
|
1999-01-13 22:28:54 +03:00
|
|
|
The <TT>show()</TT> method shows the widget or window. For windows
|
|
|
|
you can also provide the command-line arguments to allow users to
|
|
|
|
customize the appearance, size, and position of your windows.
|
1998-12-29 17:21:17 +03:00
|
|
|
<H3>The Main Event Loop</H3>
|
1999-01-13 22:28:54 +03:00
|
|
|
FLTK provides the <A href=functions.html#run><TT>Fl:run()</TT></A>
|
|
|
|
method to enter a standard event processing loop. This is equivalent
|
|
|
|
to the following code:
|
|
|
|
<UL>
|
|
|
|
<PRE>
|
1998-12-29 17:21:17 +03:00
|
|
|
while (Fl::wait());
|
1999-01-13 22:28:54 +03:00
|
|
|
</PRE>
|
|
|
|
</UL>
|
|
|
|
<TT>Fl::run()</TT> does not return until all of the windows under FLTK
|
2000-04-28 22:15:26 +04:00
|
|
|
control are closed by the user or your program.
|
|
|
|
</BODY>
|
|
|
|
</HTML>
|