Advanced Java Services | FLTK und Visualstudio |
Damit sind die Projekteinstellungen beendet und wir können uns jetzt dem Programm zuwenden.
Von dem von Visualstudio erzeugten Dateien und Code brauchen wir so gut wie nichts! Zunächst löschen wir alle Dateien mit Ausnahme der eigentlichen cpp-Datei, die in unserem Fall projekt-01.cpp heißt. Das Verzeichnis Resourcendateien löschen wir komplett, das Headerverzeichnis kann man stehen lassen.
Den Code der verbleibenden Datei brauchen wir auch nicht. Er wird komplett gelöscht und durch ein elementares FLTK-Programm ersetzt.
Unser erstes FLTK-Programm besteht nur aus sechs Zeilen...
...und erzeugt ein Fenster fester Größe, das man auf die Taskleiste legen kann und wieder schließen kann.
c/c++ -> allgemein -> zusätzliche includeverzeichnisse hier müssen die pfade zu den include-verzeichnissen von FLTK eingegeben werden c/c++ -> präprozessor -> präprozessordefinitionen wert: WIN32;NDEBUG;_WINDOWS der eintrag _WINDOWS kann weggelassen werden c/c++ -> Vorkompilierte Header -> Vorkompilierte Header erstellen wert: Vorkompilierte Header nicht verwenden
linker -> allgemein -> ausgabedatei (optionale einstellung) wert: hier kann man den defaultnamen der exe-datei ändern z.b. auf "C:\fltk\projects\widgets\button-choice\Release\button-choice.exe" linker -> eingabe -> zusätzliche abhängigkeiten wert: C:\fltk\1.1.9\lib\fltkd.lib wsock32.lib comctl32.lib hier muß auf die bibliothek fltkd.lib verwiesen werden und auf die beiden weiteren windowsbibliotheken diese angabe kann man alternativ auch unter befahlszeile machen linker -> system -> subsystem wert: Windows (/SUBSYSTEM:WINDOWS) oder: Konsole (/SUBSYSTEM:CONSOLE) solange man mit main() arbeitet sind beide einstellungen möglich falls man int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) verwendet braucht man natürlich (/SUBSYSTEM:WINDOWS) linker -> befehlszeile falls man die biböiotheken bereits unter linker -> eingabe -> zusätzliche abhängigkeiten angegeben hat ist hier kein eintrag mehr notwendig, ansonsten: wert: C:\fltk\1.1.9\lib\fltkd.lib wsock32.lib comctl32.lib falls man mit winmain arbeitet: es erscheint das folgende warning Standardbibliothek "MSVCRTD" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden. dieses warning kann folgendermaßen beseitigt werden, unter linker -> befehlszeile den folgenden eintrag machen: /NODEFAULTLIB:MSVCRTD (man kann das warning aber auch ignorieren...)
Nimmt man die klassische main()-Funktion als Startpunkt einer FLTK-Anwendung, so wird immer ein Konsolfenster erzeugt
und zusätzlich ein graphisches Fenster über FLTK. Das läßt sich nicht verhindern, denn main() ist für Konsolanwendungen
zuständig. Für die Entwicklung einer Anwendung ist das Konsolfenster zur Fehlersuche und Kontrolle des Programmablaufs
unerläßlich. Für eine "fertige" Anwendung dagegen wirkt ein Konsolfenster eher unprofessionell.
Bei der Analyse der Projekteinstellungen wurde bereits die Funktion WinMain() erwähnt. Sie ist der Startpunkt für
Windowsanwendungen, die die plattformabhängigen Windowserweiterungen von C++ verwenden um eine graphische Oberfläche
zu erhalten. Man kann diese Funktion aber auch an Stelle von main() verwenden um eine FLTK-Anwendung zu starten. In
diesem Fall erzeugt Visualstudio kein Konsolfenster.Das folgende kleine Programm zeigt wie man WinMain() mit FLTK
verwendet.
#include <windows.h> #include <Fl.H> #include <Fl_Window.H> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { Fl_Window window(600,450); window.resizable(window); window.show(); return Fl::run(); }
In diesem Fall braucht man (natürlich) die Headerdatei "windows.h".
Es wäre sehr praktisch, wenn man über eine Art Schalter die Verwendung von WinMain steuern könnte. Dieses kleine Problem
kann eine Headerdatei lösen. Man kann dann durch Aus- oder Einkommentieren einer einzigen Zeile steuern, on man eine
Konsole haben will oder nicht. Hier eine Headerdatei und eine cpp-Datei, die das Gewünschte leisten.
Die Headerdatei
#ifndef _SWITCH_H_ #define _SWITCH_H_ #ifndef __WIN__ #define main() int main(int argc, char **argv) #else #include <windows.h> #define main() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) #endif // __WIN__ #endif // _SWITCH_H_
Und die cpp-datei
//#define __WIN__ // muss an erster stelle stehen // durch ein- und auskommentieren steuert man, welche mainfunktion verwendet wird #include "switch.h" #include <Fl.H> #include <Fl_Window.H> main() { Fl_Window window(600,450); window.resizable(window); window.show(); return Fl::run(); }