File: INCLUDE\UTILS\U_WINDOW.H

    1 //#############################################################################
    2 //                                                                           //
    3 // U_WINDOW.H                                                                //
    4 //                                                                           //
    5 // Subsystem : Fenster-Templates: modale und modeless Dialog; MDI-Fenster    //
    6 // Benutzung durch andere Subsysteme erforderlich: JA                        //
    7 // Implementation: U_WINDOW.CPP                                              //
    8 //---------------------------------------------------------------------------//
    9 // Autor(en): Thomas Kullmann, Günther Reinecker                             //
   10 // Quelle:    verschoben aus SWINTRAC.H                                      //
   11 // Stand:     10.04.2002                                                     //
   12 //                                                                           //
   13 //#############################################################################
   14 
   15 #ifndef __WINDOW_H
   16 #define __WINDOW_H
   17 
   18 #include "utils\u_values.h"
   19 #include "utils\u_lists.h"
   20 #include <winuser.h> // für die unten definierten Konstanten, RegisterHotKey und UnregisterHotKey
   21 #include <vector> // für std::vector
   22 
   23 // die defines entstammen der WINUSER.H
   24 
   25 // modifier-Keycodes für WM_SETHOTKEY
   26 #define  HOTKEYF_SHIFT    0x01
   27 #define  HOTKEYF_CONTROL  0x02
   28 #define  HOTKEYF_ALT      0x04
   29 #define  HOTKEYF_EXT      0x08
   30 
   31 // die folgenden Konstanten entsprechen dem Parameter <aCode> wenn Dlg_OnCommand eintritt
   32 const UINT ONENTER= 256; // Steuerelement hat den Eingabefokus bekommt
   33 const UINT ONEXIT= 512;  //                                    verloren
   34 
   35 const DWORD MainWindow_Style= WS_CLIPCHILDREN | WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
   36 const DWORD ClientWindow_Style= WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL;
   37 
   38 #define    MBINFO              (MB_OK | MB_ICONINFORMATION)
   39 #define    MBASK               (MB_YESNO | MB_ICONQUESTION)
   40 #define    MBFAILURE           (MB_OK | MB_ICONERROR)
   41 #define    MBSTOP              (MB_OK | MB_ICONSTOP)
   42 
   43 //#############################################################################
   44 // globale Konstanten
   45 //#############################################################################
   46 
   47 // VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
   48 const char VK_0= '0';
   49 const char VK_1= '1';
   50 const char VK_2= '2';
   51 const char VK_3= '3';
   52 const char VK_4= '4';
   53 const char VK_5= '5';
   54 const char VK_6= '6';
   55 const char VK_7= '7';
   56 const char VK_8= '8';
   57 const char VK_9= '9';
   58 
   59 // VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
   60 const char VK_A= 'A';
   61 const char VK_B= 'B';
   62 const char VK_C= 'C';
   63 const char VK_D= 'D';
   64 const char VK_E= 'E';
   65 const char VK_F= 'F';
   66 const char VK_G= 'G';
   67 const char VK_H= 'H';
   68 const char VK_I= 'I';
   69 const char VK_J= 'J';
   70 const char VK_K= 'K';
   71 const char VK_L= 'L';
   72 const char VK_M= 'M';
   73 const char VK_N= 'N';
   74 const char VK_O= 'O';
   75 const char VK_P= 'P';
   76 const char VK_Q= 'Q';
   77 const char VK_R= 'R';
   78 const char VK_S= 'S';
   79 const char VK_T= 'T';
   80 const char VK_U= 'U';
   81 const char VK_V= 'V';
   82 const char VK_W= 'W';
   83 const char VK_X= 'X';
   84 const char VK_Y= 'Y';
   85 const char VK_Z= 'Z';
   86 
   87 //#############################################################################
   88 // global
   89 //#############################################################################
   90 
   91 // ACHTUNG: So kann NUR MAX. EINE Tastenkombination registriert werden!
   92 //          Diese Art Tastenkombination funktioniert auch unter Win16.
   93 // FUNKTION
   94 //   registiert die angegeben Tastenkombination; Wenn bereits eine solche Tastenkombination registriert ist, wird diese überschrieben.
   95 //   Was passiert, wenn die so registrierte Tastenkombination gedrückt wird?
   96 //   - ist das Fenster inaktiv, wird es aktiviert
   97 //   - SONST wird Botschaft WM_SYSCOMMAND mit wParam==SC_HOTKEY ans Fenster gesendet
   98 // Signatur: SetHotKey ( in aWnd, in aKey, in aShift, in aCtrl, in aAlt, in aExtended )
   99 //   - der erste Parameter ist das Handle des Fensters, das die Tastenkombinationen empfangen möchte
  100 //   - der zweite Parameter entspricht einer "normalen" Taste (dafür sollten die VK_-Konstanten verwendet werden!)
  101 //   - Parameter drei bis sechs bezeichnen, welche Systemtasten für die Tastenkombination zu drücken sind
  102 // ==> TRUE <--> Tastenkombination erfolgreich registriert
  103 // Bsp.: SetActivateHotKey ( wndHandle, VK_P, FALSE, TRUE, TRUE, FALSE ); // registriert Ctrl+Alt+'P' für das Fenster <wndHandle>
  104 BOOL _CURVECLASS WINAPI SetActivateHotKey ( HWND, const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE );
  105 
  106 //#############################################################################
  107 // THotKey
  108 //#############################################################################
  109 
  110 // ACHTUNG: Diese Art Tastenkombination sind erst ab Win32 verfügbar - in Win16 deshalb leer implementiert.
  111 //          Dafür können hiervon "nahezu" beliebig viele Tastenkombinationen registriert werden.
  112 // FUNKTION
  113 //   registriert die angegebene Tastenkombination
  114 //   Wenn die Tastenkombination gedrückt wird (AUCH WENN DAS FENSTER INAKTIV IST !!!), wird eine WM_HOTKEY-Botschaft ausgelöst, die den Keycode in lParam trägt;
  115 //   Beim verarbeiten der Botschaft, kann man mit IsEqual( lParam ) ermittelt, ob es sich um diese Tastenkombination handelt.
  116 //   Wenn man <m_Cmd> auf von -1 verschiedene Werte setzt und das Fensterhandle von einem (von TBasicWindow abgeleiteten) Objekt
  117 //   besteht, wird (NUR wenn das Fenster aktiviert ist) anstatt der WM_HOTKEY-Botschaft ein Kommando (mit <m_Cmd> als Id) ausgelöst.
  118 // Signatur: THotKey ( in aWindow, in aKey, in aShift, in aCtrl, in aAlt, in aWin )
  119 //   - der erste Parameter ist das Handle des Fensters, das die Tastenkombinationen empfangen möchte
  120 //   - der zweite Parameter entspricht einer "normalen" Taste (dafür sollten die VK_-Konstanten verwendet werden!)
  121 //   - Parameter drei bis sechs bezeichnen, welche Systemtasten für die Tastenkombination zu drücken sind - der letzte Parameter entspricht der Windows-Taste
  122 // ==> TRUE <--> Tastenkombination erfolgreich registriert
  123 // Bsp. THotKey ( wndHandle, VK_P, FALSE, TRUE, TRUE, FALSE ); // registriert Ctrl+Alt+'P' für das Fenster <wndHandle>
  124 class THotKey
  125 {
  126         //-----------------------------------------------------------------------------
  127         // Konstruktor-Destruktor
  128 private:
  129         THotKey( THotKey& ) {} // kein Copy-Konstruktor
  130         THotKey &operator= ( const THotKey& )
  131         {
  132                 return *this;
  133         } // und auch kein Zuweisungsoperator
  134 
  135 public:
  136         THotKey ( HWND, const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE );
  137         virtual ~THotKey ( void );
  138 
  139         //-----------------------------------------------------------------------------
  140         // Accessormethode(n)
  141 public:
  142         BOOL IsEqual ( LPARAM ) const;
  143         BOOL IsRegistered ( void ) const;
  144 
  145         //-----------------------------------------------------------------------------
  146         // STATIC
  147 public:
  148         static UINT CalcModifier ( const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE ); // berechnet den Modifer-Code
  149         static LPARAM CalcKeyCode ( const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE ); // berechnet den Key-Code
  150 
  151         //-----------------------------------------------------------------------------
  152         // ATTRIBUTE
  153 public:
  154         int m_Cmd;         // wenn die Tastenkombination gedrückt wird, löst TBasicWindow ein Kommando mit <m_Cmd> aus; bei <m_Cmd>==-1 wird eine WM_HOTKEY-Botschaft ausgelöst (siehe Beschreibung von THotKey)
  155 
  156 private:
  157         HWND m_Window;     // Fenster, das die WM_HOTKEY-Botschaft erhalten soll, wenn die Tastenkombination gedrückt wurde
  158         ATOM m_Atom;       // eindeutiger Bezeichner; 0 wenn keiner mehr verfügbar
  159         BOOL m_Registered; // Tastenkombination registriert?
  160 
  161         LPARAM m_KeyCode;  // KeyCode der (im Konstruktor übergebenen) Tastenkombination
  162 };
  163 
  164 //#############################################################################
  165 // TBasicWindow
  166 //#############################################################################
  167 
  168 class _CURVECLASS TBasicWindow
  169 {
  170         //-----------------------------------------------------------------------------
  171         // Konstruktor-Destruktor
  172 private:
  173         TBasicWindow ( TBasicWindow& ) {} // kein Copy-Konstruktor
  174         TBasicWindow &operator= ( const TBasicWindow& )
  175         {
  176                 return *this;
  177         } // und auch kein Zuweisungsoperator
  178 
  179 public:
  180         TBasicWindow ( HINSTANCE );
  181         virtual ~TBasicWindow ( void );
  182 
  183         //-----------------------------------------------------------------------------
  184         // Accessormethode(n)
  185 public:
  186         HWND GetHandle ( void ) const
  187         {
  188                 return m_Window;
  189         };
  190 
  191         HINSTANCE GetInstance() const 
  192         {
  193                 return m_Instance;
  194         };
  195 
  196         //-----------------------------------------------------------------------------
  197         // StringTable-Einträge laden
  198 public:
  199         // Signatur: LoadString( in aResId )
  200         // sucht den StringTable-Eintrag <aStrTbleId>, ermittelt die Größe, reserviert entsprechend dynamischen Speicher 
  201         // und gibt den String zurück - der Aufrufer muss den Speicher freigeben!!!
  202         // wird der Eintrag nicht gefunden, wird "" zurückgegeben***
  203         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  204         char *LoadString(const int) const;
  205 
  206         // Signatur: LoadString( in aResId, out aValid )
  207         // WIEVOR, <aValid> gibt zusätzlich an, ob der Eintrag gefunden wurde
  208         char *LoadString ( const int, BOOL & ) const;
  209 
  210         //-----------------------------------------------------------------------------
  211         // Fenster-Titel ermitteln
  212 private:
  213         // Signatur: GetWindowText( in aWindow )
  214         // ermittelt den Titel des Fensters mit Handle <aWindow>, ermittelt die Größe, reserviert entsprechend dynamischen Speicher 
  215         // und gibt den String zurück - der Aufrufer muss den Speicher freigeben!!!
  216         // wird der Eintrag nicht gefunden, wird "ohne Titel" zurückgegeben***
  217         static char *GetWindowTxt ( HWND );
  218 
  219         // WIEVOR, für <m_Window>
  220         char *GetWindowTxt();
  221 
  222         //-----------------------------------------------------------------------------
  223         // Meldungsfenster anzeigen
  224 public:
  225         // zeigt eine MessageBox
  226         // der erste Parameter ist der Text, der zweite der Titel des Fensters, der dritte Parameter die Art der Meldung
  227         // die Parameter können entweder direkt als Zeichenkette (LPCSTR) oder 
  228         // als Ressourcen-ID auf einen StringTable-Eintrag angegeben werden. 
  229         //   Wird der Text-Eintrag nicht gefunden, eine Fehlermeldung ohne Text.***
  230         //   Fehlt der Titel, wird <_MSGTITLE> verwendet.***
  231         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  232         int MessageBox(LPCSTR,    LPCSTR= "", UINT= 0) const;
  233         int MessageBox(const int, LPCSTR= "", UINT= 0) const;
  234         int MessageBox(LPCSTR,    const int,  UINT= 0) const;
  235         int MessageBox(const int, const int,  UINT= 0) const;
  236 
  237 
  238 public:
  239         // lädt den angegebenen System-Mauscursor und setzt ihn;
  240         // Rückgabewert ist der zuvor gesetzte Cursor, entweder zum Freigeben des Ressource oder zum späteren Wiederherstellen
  241         HCURSOR SetDefaultCursor(LPCTSTR);
  242 
  243         // wievor, jedoch für nutzerdefiniert geladene Mauscursor
  244         // HCURSOR SetCursor(HCURSOR);
  245 
  246         //-----------------------------------------------------------------------------
  247         // EREIGNISSE
  248 protected:
  249         // wenn OnEvent in einer abgeleiteten Klasse überschrieben wird und die Botschaft
  250         // nicht verarbeitet werden konnte, sollte diese Methode aufgerufen werden, um die restlichen Windows-Botschaften zu verarbeiten
  251         // Rückgabewert bestimmt, ob Botschaft verarbeitet wurde
  252         virtual LRESULT OnEvent ( HWND, UINT, WPARAM, LPARAM )
  253         {
  254                 return FALSE;
  255         };
  256 
  257         //-----------------------------------------------------------------------------
  258         // Liste der registrierten Fenster; Zuordnung HWND <--> Fensterobjekt
  259 protected:
  260         // registriert dieses Objekt, indem es in eine Liste eingetragen wird
  261         void RegisterWindow ( HWND ); // muss nicht durch das Objekt selbst aufgerufen werden, siehe s_WaitingWindow
  262 
  263         // löscht die Registrierung dieses Objekts; Botschaften werden dann nicht mehr an dieses Objekt weitergeleitet
  264         void UnregisterWindow ( void ); // sollte NUR aufgerufen werden wenn das Fenster nicht mehr angezeigt wird
  265 
  266         // ==> Fensterhandle in registriertes Objekt "umwandeln"
  267         static TBasicWindow *Handle2Object ( HWND );
  268 
  269         // STATIC
  270 protected:
  271         // hier kommen die Botschaften ALLER Fenster an, die dann ans jeweilige Fensterobjekt weitergeleitet wird
  272         static LRESULT CALLBACK EventHandler ( HWND, UINT, WPARAM, LPARAM );
  273         //WIEVOR, zuletzlich gibt der letzte Parameter an, ob die Botschaft korrekt weitergeleitet werden konnte
  274         static LRESULT CALLBACK EventHandlerEx ( HWND, UINT, WPARAM, LPARAM, BOOL& );
  275 
  276         //-----------------------------------------------------------------------------
  277         // ATTRIBUTE
  278 protected:
  279         HWND m_Window;  // Handle des registierten Fensters ODER 0
  280         HINSTANCE m_Instance;
  281 
  282         // STATIC
  283 protected:
  284         // kurz bevor man ein Fenster zum ersten Mal angezeigt - z.B. mit Methode DialogBoxParam() - muss man s_WaitingWindow= this setzen
  285         // sobald die nächste Botschaft für ein nicht registriertes Fenster empfangen wird, wird das Fenster in s_WaitingWindow automatisch registriert und aus dem Wartezustand genommen, s_WaitingWindow= 0
  286         static TBasicWindow *s_WaitingWindow; // Verknüpfung zum angemeldeten Fenster
  287 
  288 private:
  289         static TIndList s_WindowList; // Liste der geöffneten Fenster
  290 
  291         //-----------------------------------------------------------------------------
  292         // Tastenkombinationen
  293 public:   // Diese Funktionen dürfen erst aufgerufen werden, wenn das Fenster bereits ein Handle besitzt !!!
  294         // siehe ::SetHotKey
  295         BOOL SetActivateHotKey ( const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE );
  296 
  297         //nur ab Win32 verfügbar, sonst leer implementiert
  298         // siehe THotKey
  299         // Wenn man <m_Cmd> JEDOCH auf einen von -1 verschiedenen Wert setzt, löst TBasicWindow ein Kommando mit <m_Cmd> aus (NUR wenn das Fenster aktiviert ist);
  300         // SONST wird eine WM_HOTKEY-Botschaft ausgelöst und man kann mit IsHotKey( lParam, const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE ) ermittelt werden, welche Tastenkombination eingetreten ist
  301         // ==> TRUE <--> Tastenkombination wurde registriert
  302         BOOL AddHotKey ( const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE );
  303 
  304         // liest die Tastenkombinationen aus der Accelerator-Ressource (die mit LoadAccelerators() geladen und im Parameter angegeben wird)
  305         // Wenn eine der geladenen Tastenkombinationen gedrückt wird, wird das (in den Ressourcen für diese Tastenkombination angegebene) Kommando ausgelöst; bei <m_Cmd> == -1 wird eine WM_HOTKEY-Botschaft
  306         // ausgelöst und man kann mit IsHotKey( lParam, const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE ) ermittelt werden, welche Tastenkombination eingetreten ist.
  307         // ==> Anzahl der geladenen Tastenkombinationen (d.h. nicht, dass die Tastenkombinationen registriert werden konnten)
  308         UINT LoadHotKeys ( HACCEL );
  309 
  310         // prüft, ob die angegebene Tastenkombinationen gedrückt wurde
  311         // ==> TRUE <--> der KeyCode in lParam entspricht der (in den rechtlichen Parametern übergebenen) Tastenkombination
  312         BOOL IsHotKey ( LPARAM, const char, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE, const BOOL= FALSE );
  313 
  314 //hp std::vector müsste als __declspec(dllexport) definiert sein - nicht möglich, da vorkompilierte Bibliothek
  315 #pragma warning( push )
  316 #pragma warning( disable : 4251 )
  317         // Liste der Win32-Tastenkombinationen für dieses Fenster
  318         std::vector<THotKey*> m_HotKeys;
  319 #pragma warning( pop )
  320 };
  321 
  322 //#############################################################################
  323 // TBasicDialog
  324 //#############################################################################
  325 
  326 enum ECheckState { csUnknown= 0, csChecked, csUnchecked, csIndeterminate };
  327 
  328 class _CURVECLASS TBasicDialog : public TBasicWindow
  329 {
  330         //-----------------------------------------------------------------------------
  331         // Konstruktor-Destruktor
  332 public:
  333         // der erste Parameter ist die Ressourcenbezeichnung zu anzuzeigenden Dialogfensters
  334         // der letzte Parameter gibt die Instanz an, aus welcher die Ressource zu laden ist
  335         TBasicDialog ( const char* , HINSTANCE );
  336         virtual ~TBasicDialog ( void );
  337 
  338         //-----------------------------------------------------------------------------
  339         // Accessormethode(n)
  340 public:
  341         const char *GetResName ( void ) const
  342         {
  343                 return m_ResName;
  344         };
  345 
  346         //-----------------------------------------------------------------------------
  347         // Verwaltung des Inhalts von Steuerelementen
  348 public:
  349         // Signatur: CtrlGetText( in aResId, out aReturn, in aMaxChars )
  350         // liest den Inhalt eines Steuerelements mit RessourcenId <aResId> in <aReturn> (bei mehr als <aMaxChars> wird der Rest abgeschnitten)
  351         // ==> wieviele Zeichen wurden in <aReturn> gespeichert; 0 bei Fehlern
  352         UINT CtrlGetText ( const int, char*, const int ) const;
  353 
  354         // Signatur: CtrlSetText( in aResId, in aString )
  355         // trägt <aString> in das Steuerelement (mit RessourcenId <aResId>) ein
  356         // ==> TRUE <--> Wert erfolgreich eingetragen
  357         BOOL CtrlSetText ( const int, LPCSTR ) const;
  358 
  359         // Signatur: CtrlSetText( in aResId, in aStrTbleId )
  360         // sucht den StringTable-Eintrag <aStrTbleId> und trägt ihn in das Steuerelement (mit RessourcenId <aResId>) ein
  361         // ist der Eintrag nicht vorhanden, wird kein Text ("") eingetragen***
  362         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  363         // ==> TRUE <--> Wert erfolgreich eingetragen
  364         BOOL CtrlSetText ( const int, const int ) const;
  365 
  366         // Signatur CtrlSetFormat( in aResId, in aFormat[, in aVariableList]* ) 
  367         // wie CtrlSetText, der Text wird via sprintf aus aFormat und der 'beliebig langen' Parameterliste (<aVariableList>) formatiert
  368         // ==> TRUE <--> Wert erfolgreich eingetragen
  369         BOOL CtrlSetFormat ( const int, LPCSTR, ... ) const; 
  370         BOOL CtrlSetFormat ( const int, LPCSTR, va_list& ) const; 
  371 
  372         // Signatur CtrlSetFormat( in aResId, in aStrTbleIdFormat[, in aVariableList]* ) 
  373         // wie CtrlSetFormat, als <aFormat> wird jedoch der StringTable-Eintrag <aStrTbleIdFormat> benutzt
  374         // ist der Eintrag nicht vorhanden, wird kein Text ("") eingetragen***
  375         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  376         // ==> TRUE <--> Wert erfolgreich eingetragen
  377         BOOL CtrlSetFormat ( const int, const int, ... ) const; 
  378         BOOL CtrlSetFormat ( const int, const int, va_list& ) const;
  379 
  380 public:
  381         // Signatur: CtrlGetLong( in aResId, out aValid )
  382         // ==> der Long-Wert aus dem Steuerelement (mit RessourcenId <aResId>)
  383         // Hat der gelesene Wert Nachkommastellen, werden diese verworfen.(ABRUNDEN).
  384         // Gibt es kein solches Steuerelement oder steht dort kein Long-Wert, wird eine Fehlermeldung ausgegeben; im letzen Parameter wird FALSE zurückgeben - der Rückgabewert ist 0.
  385         // ACHTUNG: Im Gegensatz zur Konvertierung mittels atof(...) wird "1a234" nicht als
  386         //          Long-Wert akzeptiert! Dies ist demnach ein Fehlerfall.
  387         LONG CtrlGetLong ( const int, BOOL& ) const;
  388 
  389         // Signatur: CtrlGetLong( in aResId, in aMin, in aMax, out aValid )
  390         // ==> WIEVOR, der zurückzugebene Wert wird jedoch zusätzlich ins Intervall [<aMin>..<aMax>] eingepasst.
  391         LONG CtrlGetLong ( const int, const LONG, const LONG, BOOL& ) const;
  392 
  393         // Signatur: CtrlSetLong( in aResId, in aLong )
  394         // trägt <aLong> in das Steuerelement (mit RessourcenId <aResId>) ein
  395         // ==> TRUE <--> Wert erfolgreich eingetragen
  396         BOOL CtrlSetLong ( const int, const LONG ) const;
  397 
  398 public:
  399         // Signatur: CtrlGetDouble( in aResId, in aDigits, in aDecimal, out aValid )
  400         // ==> der Double-Wert aus dem Steuerelement (mit RessourcenId <aResId>)
  401         // Hat der gelesene Wert mehr als <aDigits> Nachkommastellen, werden nachfolgendene verworfen.(ABRUNDEN); Kommazeichen ist <aDecimal>.
  402         // Gibt es kein solches Steuerelement oder steht dort kein Double-Wert, wird eine Fehlermeldung ausgegeben; im letzen Parameter wird FALSE zurückgeben - der Rückgabewert ist 0.0.
  403         // ACHTUNG: Im Gegensatz zur Konvertierung mittels atof(...) wird "1a234" nicht als
  404         //          Double-Wert akzeptiert! Dies ist demnach ein Fehlerfall.
  405         double CtrlGetDouble ( const int, const UINT, const char, BOOL& ) const;
  406 
  407         // Signatur: CtrlGetDouble( in aResId, in aMin, in aMax, in aDigits, in aDecimal, out aValid )
  408         // ==> WIEVOR, der zurückzugebene Wert wird jedoch zusätzlich ins Intervall [<aMin>..<aMax>] eingepasst.
  409         double CtrlGetDouble ( const int, const double, const double, const UINT, const char, BOOL& ) const;
  410 
  411         //### Statt der Nachkommastellengenauigkeit kann auch NKAUTO+<x> angegeben werden. Dann wird die Genauigkeit anhand des Zahlenwertes berechnet, per <x> kann man die Genauigkeit weiter vergrößern.
  412         // Signatur: CtrlSetDouble( in aResId, in aDouble, in aDigits###, in aDecimal )
  413         // trägt <aDouble> in das Steuerelement (mit RessourcenId <aResId>) ein
  414         // Nach der zu schreibende Wert mehr als <aDigits> Nachkommastellen, werden nachfolgende verworfen.(ABRUNDEN); Kommazeichen ist <aDecimal>.
  415         // ==> TRUE <--> Wert erfolgreich eingetragen
  416         BOOL CtrlSetDouble ( const int, const double, const UINT, const char ) const;
  417 
  418 public:
  419         // Signatur: CtrlGetFloat( in aResId, in aDigits, in aDecimal, out aValid )
  420         // ==> der Float-Wert aus dem Steuerelement (mit RessourcenId <aResId>)
  421         // Hat der gelesene Wert mehr als <aDigits> Nachkommastellen, werden nachfolgendene verworfen.(ABRUNDEN); Kommazeichen ist <aDecimal>.
  422         // Gibt es kein solches Steuerelement oder steht dort kein Float-Wert, wird eine Fehlermeldung ausgegeben; im letzen Parameter wird FALSE zurückgeben - der Rückgabewert ist 0.0.
  423         // ACHTUNG: Im Gegensatz zur Konvertierung mittels atof(...) wird "1a234" nicht als
  424         //          Float-Wert akzeptiert! Dies ist demnach ein Fehlerfall.
  425         float CtrlGetFloat ( const int, const UINT, const char, BOOL& ) const;
  426 
  427         // Signatur: CtrlGetFloat( in aResId, in aMin, in aMax, in aDigits, in aDecimal, out aValid )
  428         // ==> WIEVOR, der zurückzugebene Wert wird jedoch zusätzlich ins Intervall [<aMin>..<aMax>] eingepasst.
  429         float CtrlGetFloat ( const int, const float, const float, const UINT, const char, BOOL& ) const;
  430 
  431         // Signatur: CtrlSetFloat( in aResId, in aFloat, in aDigits, in aDecimal )
  432         // trägt <aFloat> in das Steuerelement (mit RessourcenId <aResId>) ein
  433         // Nach der zu schreibende Wert mehr als <aDigits> Nachkommastellen, werden nachfolgende verworfen.(ABRUNDEN); Kommazeichen ist <aDecimal>.
  434         // ==> TRUE <--> Wert erfolgreich eingetragen
  435         BOOL CtrlSetFloat ( const int, const float, const UINT, const char ) const;
  436 
  437 // Kombinationsfenster (ComboBox)
  438 public:
  439         // Signatur: CtrlAddString( in aResId, in aString )
  440         // fügt <aString> als neues, letztes Element in das Kombinationsfenster (mit RessourcenId <aResId>) ein
  441         // ==> Index des eingefügten Eintrags oder CB_ERR (==-1) 
  442         int CtrlAddString( const int, LPCSTR ) const;
  443         
  444         // Signatur: CtrlAddString( in aResId, in aStrTbleId )
  445         // sucht den StringTable-Eintrag <aStrTbleId> und trägt ihn in das Steuerelement (mit RessourcenId <aResId>) ein
  446         // ist der Eintrag nicht vorhanden, wird nichts eingetragen***
  447         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  448         // ==> Index des eingefügten Eintrags oder CB_ERR (==-1) 
  449         int CtrlAddString( const int, const int ) const;
  450 
  451         // Signatur: CtrlDelString( in aResId, in aString )
  452         // versucht <aString> im Kombinationsfenster (mit RessourcenId <aResId>) zu löschen
  453         // ==> Anzahl der verbleibenden Einträge; ggf. CB_ERR (==-1) 
  454         int CtrlDelString( const int, LPCSTR ) const;
  455 
  456         // Signatur: CtrlDelString( in aResId, in aStrTbleId )
  457         // versucht den StringTable-Eintrag <aStrTbleId> im Kombinationsfenster (mit RessourcenId <aResId>) zu löschen
  458         // ist der Eintrag nicht vorhanden, wird nichts gelöscht***
  459         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  460         // ==> Anzahl der verbleibenden Einträge; ggf. CB_ERR (==-1) 
  461         int CtrlDelString( const int, const int ) const;
  462 
  463         // Signatur: CtrlGetCount( in aResId )
  464         // ==> Anzahl der Einträge im Kombinationsfenster (mit RessourcenId <aResId>); ggf. CB_ERR (==-1) 
  465         int CtrlGetCount( const int ) const;
  466 
  467         // Signatur: CtrlFindString( in aResId, in aText, in aStartIdx )
  468         // sucht <aText> im Kombinationsfenster (mit RessourcenId <aResId>)**** und gibt den Index des Eintrages zurück; ggf. CB_ERR (==-1)
  469         // ****Die Suche wird nach dem Index <aStartIdx> begonnen. Am Ende der Liste wird von vorn beginnen, bis als letztes <aStartIdx> erreicht wird. -1 durchsucht die gesamte Liste.
  470         // ==> Index des gefundenen Eintrags; ggf. CB_ERR (==-1) 
  471         int CtrlFindString( const int, LPCSTR, const int= -1 ) const;
  472 
  473         // Signatur: CtrlFindString( in aResId, in aStrTbleId, in aStartIdx )
  474         // sucht den StringTable-Eintrag <aStrTbleId> im Kombinationsfenster (mit RessourcenId <aResId>)**** und gibt den Index des Eintrages zurück; ggf. CB_ERR (==-1)
  475         // wird der Eintrag nicht in der StringTable gefunden, wird CB_ERR (==-1) zurückgegeben***
  476         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  477         // ****Die Suche wird nach dem Index <aStartIdx> begonnen. Am Ende der Liste wird von vorn beginnen, bis als letztes <aStartIdx> erreicht wird. -1 durchsucht die gesamte Liste.
  478         // ==> Index des gefundenen Eintrags; ggf. CB_ERR (==-1) 
  479         int CtrlFindString( const int, const int, const int= -1 ) const;
  480 
  481         // Signatur: CtrlGetSel( in aResId )
  482         // ==> Index des aktuell ausgewählten Eintrags des Kombinationsfensters (mit RessourcenId <aResId>); ggf. CB_ERR (==-1) 
  483         int CtrlGetSel( const int ) const;
  484 
  485         // Signatur: CtrlGetSelString( in aResId )
  486         // ermittelt die Größe, reserviert entsprechend dynamischen Speicher und gibt den aktuell ausgewählten Eintrags des Kombinationsfensters (mit RessourcenId <aResId>) zurück - der Aufrufer muss der Speicher freigeben!!!
  487         // wird der Eintrag nicht gefunden, wird "" zurückgegeben
  488         // ==> aktuell ausgewählter Eintrag
  489         char *CtrlGetSelString( const int ) const;
  490 
  491         // Signatur: CtrlSetSel( in aResId, in aIdx )
  492         // wählt den Eintrag an Index <aIdx> im Kombinationsfensters (mit RessourcenId <aResId>) aus
  493         // ==> Index des ausgewählten Eintrags; CB_ERR (==-1) wenn das Kombinationsfenster <aResId> nicht gefunden wurde
  494         int CtrlSetSel( const int, const int ) const;
  495 
  496         // Signatur: CtrlSetSelString( in aResId, in aString )
  497         // versucht <aString> im Kombinationsfenster (mit RessourcenId <aResId>)**** auszuwählen
  498         // ****Die Suche wird nach dem Index <aStartIdx> begonnen. Am Ende der Liste wird von vorn beginnen, bis als letztes <aStartIdx> erreicht wird. -1 durchsucht die gesamte Liste.
  499         // ==> Index des aktuell ausgewählten Eintrags; CB_ERR (==-1) wenn das Kombinationsfenster <aResId> nicht gefunden wurde
  500         int CtrlSetSelString( const int, LPCSTR, const int= -1 ) const;
  501 
  502         // Signatur: CtrlSelString( in aResId, in aStrTbleId )
  503         // sucht den StringTable-Eintrag <aStrTbleId>**** und versucht ihn im Kombinationsfenster (mit RessourcenId <aResId>) auszuwählen
  504         // ist der Eintrag nicht vorhanden, bleibt die aktuelle Auswahl erhalten***
  505         // ***In der DEBUG-Version wird zusätzlich eine TraceErr-Fehlermeldung ausgegeben!
  506         // ****Die Suche wird nach dem Index <aStartIdx> begonnen. Am Ende der Liste wird von vorn beginnen, bis als letztes <aStartIdx> erreicht wird. -1 durchsucht die gesamte Liste.
  507         // ==> Index des aktuell ausgewählten Eintrags; CB_ERR (==-1) wenn das Kombinationsfenster <aResId> nicht gefunden wurde
  508         int CtrlSetSelString( const int, const int, const int= -1 ) const;
  509 
  510 // Allgemein
  511 public:
  512         // Signatur: Ctrl( in aResId )
  513         // ==> Handle des Steuerelements (mit RessourcenId <aResId>); 0 im Fehlerfall
  514         HWND Ctrl ( const int ) const;
  515 
  516         // Signatur: CtrlHasFocus( in aResId )
  517         // ==> TRUE <--> das angegebene Steuerelement ist fokussiert
  518         BOOL CtrlHasFocus ( const int ) const;
  519 
  520         // Signatur: CtrlSetFocus( in aResId )
  521         // fokussiert das Steuerelement (mit RessourcenId <aResId>)
  522         // ==> TRUE <--> Steuerelement erfolgreich fokussiert
  523         BOOL CtrlSetFocus ( const int ) const;
  524 
  525         // Signatur: CtrlIsEnabled( in aResId )
  526         // ==> TRUE <--> das angegebene Steuerelemet ist freigegeben
  527         BOOL CtrlIsEnabled ( const int ) const;
  528 
  529         // Signatur: CtrlSetEnabled( in aResId, in aEnable )
  530         // gibt das Steuerelement (mit RessourcenId <aResId>) frei oder sperrt es (ausgrauen funktioniert unter VC)
  531         // ==> TRUE <--> Steuerelement war vor dieser Aktion gesperrt
  532         BOOL CtrlSetEnabled ( const int, const BOOL ) const;
  533 
  534 // Kontrollkästchen (CheckBox), Optionsfeld (RadioButton)
  535 public:
  536         // Signatur: CtrlIsChecked( in aResId )
  537         // ==> TRUE <--> das Steuerelement ist ausgewählt (BST_CHECKED)
  538         BOOL CtrlIsChecked ( const int ) const;
  539 
  540         // Signatur: CtrlSetChecked( in aResId, in aChecked )
  541         // wählt das Steuerelement (mit RessourceId <aResId>) aus (<aChecked>==TRUE) oder hebt die Auswahl auf (SONST)
  542         // ==>
  543         BOOL CtrlSetChecked ( const int, const BOOL ) const;
  544 
  545         // Signatur: CtrlGetState( in aResId )
  546         // ermittelt den Zustand des Steuerelements
  547         // ==> csChecked / BST_CHECKED             <--> Steuerelement ist ausgewählt
  548         //     csUnchecked / BST_UNCHECKED         <-->                   nicht ausgewählt
  549         //     csIndeterminate / BST_INDETERMINATE <-->                   weder ausgewählt noch nicht ausgewählt (grayed)
  550         //     csUnknown / 0                       <-->                   nicht vorhanden
  551         UINT CtrlGetState ( const int ) const;
  552         ECheckState CtrlGetCheckState ( const int ) const;
  553 
  554         // Signatur: CtrlSetState( in aResId, in aCheckState )
  555         // ändert den Zustand des Steuerelements (mit RessourcenId <aResId>); für mögliche Optionen siehe CtrGetState
  556         // ==> neuer Zustand des Steuerelements; siehe CtrlGetState
  557         UINT CtrlSetState ( const int, const UINT ) const;
  558         ECheckState CtrlSetCheckState ( const int, const ECheckState ) const;
  559 
  560         //-----------------------------------------------------------------------------
  561         // EREIGNISSE
  562 protected:
  563         virtual LRESULT OnEvent ( HWND, UINT, WPARAM, LPARAM );
  564 
  565         // Standardereignisse
  566         virtual void Dlg_OnCommand ( HWND, int, HWND, UINT )
  567         {};
  568 
  569         virtual BOOL Dlg_OnInit ( HWND, HWND, LPARAM )
  570         {
  571                 return TRUE;
  572         };
  573 
  574         virtual void Dlg_OnHScrollBar ( HWND, HWND, UINT, int )
  575         {};
  576 
  577         virtual void Dlg_OnVScrollBar ( HWND, HWND, UINT, int )
  578         {};
  579 
  580         virtual void Dlg_OnTimer ( HWND, UINT )
  581         {};
  582 
  583         // klier 24.08.02
  584         virtual BOOL Dlg_OnSysCommand ( HWND, int, LPARAM )
  585         {
  586                 return FALSE;
  587         };
  588 
  589         // Mausereignisse (Klier)
  590         virtual void Dlg_OnLButtonUp ( HWND, int, int, UINT )
  591         {};
  592 
  593         virtual void Dlg_OnLButtonDown ( HWND, UINT, int, int, UINT )
  594         {};
  595 
  596         virtual void Dlg_OnRButtonDown ( HWND, UINT, int, int, UINT )
  597         {};
  598 
  599         virtual void Dlg_OnMouseMove ( HWND, int, int, UINT )
  600         {};
  601 
  602         //Datum: 27.07.2002 virtual void  Dlg_OnMouseActivate ( HWND, int, HWND, UINT ) {};
  603         virtual int Dlg_OnMouseActivate ( HWND, HWND, UINT, UINT )
  604         {
  605                 return 1;
  606         };
  607 
  608         // Rest (Klier)
  609 
  610         //10.07.2003 klier
  611         // Auf Änderungen an TabCtrl und ListView kann reagiert werden!
  612         virtual void Dlg_OnNotify ( HWND, int, UINT, UINT )
  613         {};
  614 
  615         virtual void Dlg_OnDestroy ( HWND )
  616         {};
  617 
  618         virtual void Dlg_OnSetFocus ( HWND, HWND )
  619         {};
  620 
  621         //Datum: 27.07.2002 virtual void  Dlg_OnKillFocus ( HWND, HWND ) {};
  622 
  623         // Tastatur
  624         virtual BOOL Dlg_OnChar ( HWND, WPARAM, LPARAM );
  625 
  626         //Datum: 27.07.2002 virtual void  DoPaint           ( void ) {};
  627 
  628         //-----------------------------------------------------------------------------
  629         // EREIGNISSE zum Schließen des Fensters
  630 protected:
  631         virtual BOOL CanClose ( void )
  632         {
  633                 return TRUE;
  634         };
  635 
  636         virtual void Interrupt ( void )
  637         {};
  638 
  639         virtual void LeaveDialog ( void )
  640         {};
  641 
  642         //-----------------------------------------------------------------------------
  643         // ATTRIBUTE
  644 private:
  645         char *m_ResName;  // Name der anzuzeigenden Ressource
  646 };
  647 
  648 //#############################################################################
  649 // TModalDlg
  650 //#############################################################################
  651 
  652 class _CURVECLASS TModalDlg : public TBasicDialog
  653 {
  654         //-----------------------------------------------------------------------------
  655         // Konstruktor-Destruktor
  656 public:
  657         TModalDlg ( const char*, HINSTANCE hInstance);
  658         virtual ~TModalDlg ( void );
  659 
  660         //-----------------------------------------------------------------------------
  661         // Dialog anzeigen
  662 public:
  663         int ExecuteDialog ( HWND );
  664 
  665         //-----------------------------------------------------------------------------
  666         // EREIGNISSE
  667 protected:
  668         // wenn Dlg_OnCommand in einer abgeleitete Klasse überschrieben wird und die Botschaft
  669         // nicht verarbeitet werden konnte, sollte diese Methode aufgerufen werden; sonst kann der Dialog nicht beendet werden
  670         virtual void Dlg_OnCommand ( HWND, int, HWND, UINT );
  671 
  672         //-----------------------------------------------------------------------------
  673         // ATTRIBUTE
  674 protected:
  675         FARPROC m_Handler;
  676 };
  677 
  678 //#############################################################################
  679 // TModelessDlg
  680 //#############################################################################
  681 
  682 class _CURVECLASS TModelessDlg : public TBasicDialog
  683 {
  684         //-----------------------------------------------------------------------------
  685         // Konstruktor-Destruktor
  686 public:
  687         // Neben dem Namen der Ressource des anzuzeigenden Dialogfensters muss auch die Adresse auf die Variable übergeben werden, wo dieses Dialogfenster gespeichert ist.
  688         // Wenn das Fenster geschlossen wird, wird diese Variable 0 gesetzt. Sonst müsste das Hauptprogramm beim Beenden auch alle modeless Dialogobjekte freigeben.
  689         TModelessDlg ( const char*, TModelessDlg** , HINSTANCE);
  690         virtual ~TModelessDlg ( void );
  691 
  692         //-----------------------------------------------------------------------------
  693         // Dialog anzeigen
  694 public:
  695         virtual BOOL Initialize ( HINSTANCE, HWND );
  696 
  697         //-----------------------------------------------------------------------------
  698         // EREIGNISSE
  699 protected:
  700         // wenn Dlg_OnCommand in einer abgeleitete Klasse überschrieben wird und die Botschaft
  701         // nicht verarbeitet werden konnte, sollte diese Methode aufgerufen werden, um das Beendigungsverhalten zu impl.
  702         virtual void Dlg_OnCommand ( HWND, int, HWND, UINT );
  703 
  704         //-----------------------------------------------------------------------------
  705         // ATTRIBUTE
  706 protected:
  707         DLGPROC m_Handler;
  708         TModelessDlg **m_Reference;
  709 };
  710 
  711 //#############################################################################
  712 // TBasicMDIWindow
  713 //#############################################################################
  714 
  715 class _CURVECLASS TBasicMDIWindow : public TBasicWindow
  716 {
  717         //-----------------------------------------------------------------------------
  718         // Konstruktor-Destruktor
  719 public:
  720         TBasicMDIWindow ( HINSTANCE );
  721         virtual ~TBasicMDIWindow ( void );
  722 
  723         //-----------------------------------------------------------------------------
  724         // Dialog anzeigen
  725 public:
  726         // Fenster erzeugen und anzeigen
  727         LRESULT Show ( HWND, const int= -1, const int= -1, const int= -1, const int= -1 );
  728 
  729         //-----------------------------------------------------------------------------
  730         // Start-/ Beendigungsverhalten und Aussehen des Fensters
  731 protected:
  732         // Fenster öffnen/ schließen erlaubt?
  733         virtual BOOL CanOpen ( void )
  734         {
  735                 return TRUE;
  736         }
  737         virtual BOOL CanClose ( void )
  738         {
  739                 return TRUE;
  740         }
  741 
  742         // Hintergrundfarbe für den Clientbereich
  743         virtual HBRUSH GetBkColor ( void ) const
  744         {
  745                 return HBRUSH(COLOR_WINDOW + 1);
  746         }
  747 
  748         // Icon für die Titelleiste
  749         virtual HICON GetIcon ( void ) const
  750         {
  751                 return 0;
  752         }
  753 
  754         // welchen Mauszeiger?
  755         virtual HCURSOR GetCursor( void ) const
  756         {
  757                 return LoadCursor( NULL, IDC_ARROW );
  758         };
  759 
  760         // Kontextmenü
  761         virtual HMENU GetMenu ( HWND ) const
  762         {
  763                 return 0;
  764         }
  765 
  766         virtual LPCSTR ClassName ( void )
  767         {
  768                 return "GR+JF";
  769         };
  770 
  771         // m_Title anzeigen
  772         virtual BOOL SetTitle ( void );
  773 
  774         //-----------------------------------------------------------------------------
  775         // EREIGNISSE
  776 protected:
  777         // wenn OnEvent in einer abgeleitete Klasse überschrieben wird und die Botschaft
  778         // nicht verarbeitet werden konnte, sollte diese Methode aufgerufen werden, um das Beendigungsverhalten zu impl.
  779         virtual LRESULT OnEvent ( HWND, UINT, WPARAM, LPARAM );
  780 
  781         // Tastatur
  782         virtual void OnHotKey ( LPARAM );
  783         virtual void OnKeyDown ( WPARAM, LPARAM ) {};
  784         virtual void OnKeyUp ( WPARAM, LPARAM ) {};
  785 
  786         // Maus
  787         virtual void OnLButtonDown ( WPARAM, LPARAM ) {}
  788         virtual void OnLButtonUp ( WPARAM, LPARAM )     {}
  789         virtual void OnRButtonDown ( WPARAM, LPARAM ) {}
  790         virtual void OnMouseMove ( WPARAM, LPARAM )     {}
  791 
  792         // Kommandos
  793         virtual LRESULT OnCommand( WPARAM, LPARAM )
  794         {
  795                 return 0;
  796         }
  797         virtual void OnCreate( void ) {}
  798         virtual void OnNotCreated( void ) {}
  799 
  800         // Zeichnen
  801         virtual void OnPaint ( void ); // WM_PAINT
  802         virtual void DoPaint( HDC, PAINTSTRUCT* ) {} // auf HDC zeichnen
  803 
  804         // (Kontext-)Menü
  805         virtual void OnPopupMenuInit ( WPARAM, LPARAM ) {}
  806         virtual void OnMenuSelect ( WPARAM, LPARAM ) {}
  807 
  808         // Sonstiges
  809         virtual void OnFocus ( void ) {}
  810         virtual void OnSize ( WPARAM, LPARAM ) {}
  811         virtual void OnTimer ( WPARAM, LPARAM ) {}
  812         virtual void OnRenderFormat ( WPARAM, LPARAM ) {}
  813         virtual void OnRenderAllFormats ( WPARAM, LPARAM ) {}   
  814 
  815         //-----------------------------------------------------------------------------
  816         //ATTRIBUT(E)
  817 protected:
  818         char m_Title[256]; // Beschriftung der Titelleiste
  819 
  820 private:
  821         bool m_Showing;    // Show bereits aufgerufen
  822 
  823         //-----------------------------------------------------------------------------
  824         //STATIC
  825 private:
  826         static LRESULT CALLBACK EventHandler ( HWND, UINT, WPARAM, LPARAM );
  827 };
  828 
  829 #endif //#ifndef __WINDOW_H
  830 
  831 //#############################################################################
  832 // LASTLINE
  833 //#############################################################################
  834