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