home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************/
- /* */
- /* HELLO3A.c */
- /* */
- /* (C) 1989 Heid */
- /* */
- /* 5. Version von Hello World: */
- /* - Ausgabe von "Hello World by PM" */
- /* in einem Standardfenster mit Resourcen fuer */
- /* - Actionbar */
- /* - Akzeleratortasten */
- /* - Textzeilen. */
- /* - Der Actionbar bietet die Eintraege "Commands" */
- /* und "Exit" an. */
- /* Das Pull-down-Menu von "Commands" hat 5 */
- /* Eintraege, mit denen man jeweils einen */
- /* anderen String im Client ausgibt. */
- /* - F3 beendet das Programm. */
- /* - Jeder Klick der li. Maustaste alterniert die */
- /* Hintergrundfarbe zwischen rot und gruen. */
- /* */
- /* Erweiterung von hello2.c ! */
- /* - die Windowprozedur ClientWndProc behandelt */
- /* explizit die folgenden 5 Events: */
- /* WMCREATE, WM_PAINT, WM_BUTTON1DOWN, */
- /* WM_COMMAND, WM_CHAR. */
- /* - Benutzung von Resourcen! */
- /* */
- /* Unterschied zu hello2.c: */
- /* - Da F3 nun als Akzeleratortaste definiert ist, */
- /* wird die Reaktion auf F3 nach WM_COMMAND */
- /* abgehandelt. */
- /* - verschiedene Hintergrund- und Vordergrund- */
- /* farben fuer GpiCharStringAt(...,szString) */
- /* */
- /* */
- /* */
- /* */
- /* Benoetigte Dateien: */
- /* ------------------- */
- /* HELLO3A.c - Quellcode-Datei */
- /* HELLO3A.def - Modul-Definitions-Datei */
- /* HELLO3A.rc - Resource-Datei */
- /* HELLO3A.h - Header-Datei */
- /* OS2.h - PM-Include-File */
- /* */
- /* Benoetigte Libraries: */
- /* ------------------- */
- /* OS2.lib - PM/OS2 Library */
- /* */
- /*****************************************************/
-
- #include <string.h> // fuer strlen
- #include "hello3a.h" // Symbol. Konstanten fuer die
- // Resourcen
-
- #define INCL_WIN
- #define INCL_GPI
- #include <os2.h> // PM-Include-Datei
-
-
- /*****************************************************/
- /* Konstanten-Bezeichner */
- /*****************************************************/
- #define STRING_LAENGE 20 // Laenge von szString
-
-
- /*****************************************************/
- /* Funktions-Prototypen */
- /*****************************************************/
- MRESULT EXPENTRY ClientWindowProc( HWND hwnd,
- USHORT msg,
- MPARAM mp1,
- MPARAM mp2 );
- int cdecl main( VOID );
- BOOL WndCreate( VOID );
-
-
- /*****************************************************/
- /* globale Variablen */
- /*****************************************************/
- HAB hab; // Programmanker
- CHAR szClientClass[] = "KlasseHello3";
- // Name der Fensterklasse
- HWND hwndClient; // Handle fuer den Client-Bereich
- // des Fensters
- HWND hwndFrame; // Handle fuer das Frame-Fenster
-
- CHAR szText[] = "Hello World by PM";
- CHAR szString[STRING_LAENGE];
-
- // Strings, die in der Fensterprozedur bei WM_CREATE
- // gesetzt und bei WM_COMMAND fuer die Zuweisung
- // an die Variable szString benutzt werden.
- CHAR szHallo[STRING_LAENGE];
- CHAR sz1[STRING_LAENGE];
- CHAR sz2[STRING_LAENGE];
- CHAR sz3[STRING_LAENGE];
-
-
-
-
- /*------- Start der main-Funktion -----------------*/
- /* */
- /* - initialisiert und terminiert */
- /* - Message-Loop */
- /* */
- /* - benutzte globale Variable: hab, hwndFrame. */
- /* - ruft: WndCreate() */
- /* */
- /*---------------------------------------------------*/
- int cdecl main( )
- {
- HMQ hmq; // Handle fuer die Message-Queue
- QMSG qmsg; // Message in der Message-Queue
-
- hab = WinInitialize( NULL ); // Initialisiere PM
- hmq = WinCreateMsgQueue( hab, 0 ); // Erzeuge Message-Queue
-
- if ( hmq != (HMQ)NULL )
- {
- if ( WndCreate() == TRUE )
- {
- /************************************************/
- /* "Message-processing-Loop": */
- /* Empfaengt und verteilt Messages aus der */
- /* Message-Queue der Anwendung, bis WinGetMsg */
- /* FALSE zurueckgibt: dies geschieht dann, wenn */
- /* WinGetMsg eine WM_QUIT-Message erhielt. */
- /************************************************/
- while( WinGetMsg( hab, (PQMSG)&qmsg,
- (HWND)NULL, 0, 0 )
- )
- WinDispatchMsg( hab, (PQMSG)&qmsg );
-
- WinDestroyWindow( hwndFrame );
- }
- WinDestroyMsgQueue( hmq );
- }
- WinTerminate( hab );
-
- return 0;
- }
- /*------- Ende der main-Funktion ------------------*/
-
-
-
-
- /*------- Start der WndCreate-Funktion -------------*/
- /* */
- /* - registriert die Fensterklasse des Client */
- /* - erzeugt das Standardfenster */
- /* */
- /* - benutzte globale Variable: */
- /* hab, szClientClass, hwndClient, hwndFrame. */
- /* - aufgerufen von: main() */
- /* - Return: - TRUE, wenn alles klappt */
- /* - FALSE, wenn etwas schiefging */
- /*---------------------------------------------------*/
- BOOL WndCreate( VOID )
- {
- ULONG flCreateFrame; // Flaggen fuer die Erzeugung
- // der Controls
- BOOL brc; // Hilfsvariable zum Abpruefen
- // des Rueckgabewertes von
- // API-Funktionen
-
- brc = WinRegisterClass( // Ordne die ClientWndProc
- // einer Klasse zu
- hab,
- szClientClass, // Name der Fensterklasse
- ClientWindowProc, // Adr. der Fensterprozedur
- CS_SIZEREDRAW, // Klassen-Style
- 0 // keine Extra-Bytes reservieren
- );
-
- // WinRegisterClass nicht erfolgreich
- if ( brc == FALSE ) return ( FALSE );
-
- // nun Standardfenster auch mit Actionbar
- // und Akzeleratortabelle als Resource
- flCreateFrame = FCF_STANDARD & ~FCF_ICON;
-
- // Erzeugen eines Standardfensters
- hwndFrame = WinCreateStdWindow(
-
- HWND_DESKTOP, // Handle des Vaterfensters
- WS_VISIBLE, // Style des Frame-Fensters
- (PULONG)&flCreateFrame,
- szClientClass, // Client-Fenster-Klasse
- "", // Kein expliziter Titel
- 0L, // Style des Client-Fensters
- NULL, // Resourcen sind in EXE-Datei
- ID_RESOURCE, // Bezeichner fuer Resourcen
- (PHWND)&hwndClient // Zeiger auf den Handle des
- // Client-Fensters
- );
-
- // WinCreateStdWindow nicht erfolgreich
- if ( hwndFrame == (HWND)NULL ) return ( FALSE );
-
- return ( TRUE );
-
- }
- /*------- Ende der WndCreate-Funktion --------------*/
-
-
-
- /*------- Start der Window-Prozedur des Client -----*/
- /* */
- /* - behandelt die Reaktionen des Clientfensters */
- /* */
- /* - benutzte globale Variable: hab, szText, */
- /* szHallo, sz1, sz2, sz3, szString. */
- /* */
- /* - aufgerufen von: Presentation Manager */
- /*---------------------------------------------------*/
- MRESULT EXPENTRY ClientWindowProc( HWND hwnd,
- USHORT msg,
- MPARAM mp1,
- MPARAM mp2 )
- {
- HPS hps; // Presentation-Space-Handle
- RECTL rectl; // Struktur Rechteck-Koordinaten
- POINTL pt; // Koordinaten fuer den Textanfang
- LONG lCount; // Stringlaenge ohne ASCII-Null
- USHORT command; // Command-Wert bei WM_COMMAND
- // Hintergrundfarbe des Clients
- static COLOR colorClient = CLR_RED;
- // wird eraseLastLine auf TRUE
- // gesetzt, wird die letzte Zeile
- // nicht mehr angezeigt.
- static BOOL eraseLastLine = FALSE;
-
-
- switch( msg )
- {
-
- case WM_CREATE:
- /***********************************************/
- /* hier werden Initialisierungen vorgenommen: */
- /* WinLoadString laedt die Strings aus der */
- /* Resource-Datei */
- /***********************************************/
- WinLoadString( hab, NULL, IDS_HALLO,
- STRING_LAENGE, szHallo );
- WinLoadString( hab, NULL, IDS_1,
- STRING_LAENGE, sz1 );
- WinLoadString( hab, NULL, IDS_2,
- STRING_LAENGE, sz2 );
- WinLoadString( hab, NULL, IDS_3,
- STRING_LAENGE, sz3 );
- // Kopiert "Hallo !" in szString
- strcpy( szString, szHallo );
- break;
-
-
- case WM_PAINT:
- /***********************************************/
- /* hier wird der Inhalt des Clients gezeichnet */
- /***********************************************/
- // Erzeuge einen Presentation Space
- hps = WinBeginPaint( hwnd, NULL, NULL );
-
- // rect erhaelt Koordinaten des Client
- WinQueryWindowRect( hwnd, &rectl );
-
- // Hintergrundfarbe des Client schreiben
- WinFillRect( hps, &rectl, colorClient );
-
- pt.x = 10L; // Setze die Anfangskoordinaten fuer
- pt.y = 240L; // die Ausgabe des Textes
-
- // Setze Text-Farbe
- GpiSetColor( hps, CLR_WHITE );
-
- // Zeichne den Textstring szText
- GpiCharStringAt( hps, &pt, (LONG)strlen(szText),
- (PCH)szText );
-
- pt.x = 30L; // Setze Koordinaten fuer
- pt.y = 190L; // weitere Textausgaben
- GpiCharStringAt( hps, &pt, 23L,
- (PCH)"Maus-Taste 1 alterniert");
- pt.y = 175L;
- GpiCharStringAt( hps, &pt, 26L,
- (PCH)"die Farbe dieses Fensters!");
- pt.y = 150L;
- lCount = (LONG)strlen("F3 beendet das Programm!");
- GpiCharStringAt( hps, &pt, lCount,
- (PCH)"F3 beendet das Programm!");
- pt.x = 10L; pt.y = 110L;
- GpiCharStringAt( hps, &pt, 30L,
- (PCH)"Die folgende Zeile laesst sich");
- pt.y = 90L;
- GpiCharStringAt( hps, &pt, 29L,
- (PCH)"mit dem Menue \"Commands\" oder");
- pt.y = 70L;
- GpiCharStringAt( hps, &pt, 53L,
- (PCH)"mit Akzeleratortasten aendern \
- bzw. unsichtbar machen:");
-
- if ( eraseLastLine == FALSE )
- {
- // ab hier Fuellen der 3 variablen Ausgabefelder
- // weiss auf dem jeweiligen
- // Fensterhintergrund
- pt.x = 50; pt.y = 40;
- GpiCharStringAt( hps, &pt,
- (LONG)strlen(szString), szString );
-
- // Rechteckhintergrund auf weiss
- pt.x = 150; pt.y = 40;
- // Setze Text-Farbe
- GpiSetColor( hps, colorClient );
- // Setze Hintergrund-Farbe
- GpiSetBackColor( hps, CLR_WHITE );
- // Mischung der Hintergrundfarben
- GpiSetBackMix( hps, BM_OVERPAINT );
- GpiCharStringAt( hps, &pt,
- (LONG)strlen(szString), szString );
-
- // hier schwarz auf weiss
- pt.x = 250; pt.y = 40;
- GpiSetColor( hps, CLR_BLACK );
- GpiSetBackColor( hps, CLR_WHITE );
- GpiSetBackMix( hps, BM_OVERPAINT );
- GpiCharStringAt( hps, &pt,
- (LONG)strlen(szString), szString );
- }
-
- WinEndPaint( hps ); // Paint ist erledigt
- return 0;
-
-
- case WM_BUTTON1DOWN:
- /***********************************************/
- /* Maus-Taste 1 wurde geklickt: */
- /* - Sicherstellen, dass Client den Focus hat */
- /* - Alternieren der Farbvariable colorClient */
- /* zwischen rot und gruen. */
- /* - Abschicken einer PAINT-Message, damit */
- /* das Fenster neu gezeichnet wird. */
- /***********************************************/
- WinSetFocus( HWND_DESKTOP, hwnd );
-
- colorClient = ( colorClient == CLR_RED ) ?
- ( CLR_GREEN ) : (CLR_RED );
-
- WinInvalidateRect( hwnd, NULL, TRUE );
- return 0;
-
-
- case WM_CHAR:
- /***********************************************/
- /* Bearbeiten von Tastatur-Eingaben: */
- /* - Tastatur-Eingaben erzeugen nur dann */
- /* eine WM_CHAR-Message, wenn sie nicht */
- /* in der Akzelerator-Tabelle definiert */
- /* sind. */
- /***********************************************/
- if( CHARMSG( &msg ) -> vkey == VK_F3 )
- // diese Abfrage wird nie erfüllt wegen hot keys
- DosBeep( 260, 100 );
-
- if( CHARMSG( &msg ) -> vkey == VK_F2 )
- DosBeep( 260, 100 );
-
- return 0;
-
-
- case WM_COMMAND:
- /***********************************************/
- /* Bearbeiten der Menue-Selektion: */
- /* - Die ersten 2 Byte des Message-Parameters */
- /* mp1 enthalten den Command-Wert, also */
- /* den Wert des Bezeichners fuer den */
- /* ausgewaehlten Menueeintrag. */
- /* - Wenn im "Commands"-Submenue eine der */
- /* Optionen 1-4 selektiert wird, erhaelt */
- /* szString den entsprechenden Wert und */
- /* WinInvalidateRegion schickt ein WM_PAINT.*/
- /* Die Auswahl der 5. Option dagegen */
- /* bewirkt, dass die letzte Zeile gar */
- /* nicht erst geschrieben wird. */
- /* - Wenn im "Exit"-Submenue der Eintrag */
- /* "Exit" gewaehlt wird, schickt sich die */
- /* Anwendung eine WM_CLOSE-Message. */
- /* Bei "Resume" tut sie gar nichts. */
- /***********************************************/
-
- command = COMMANDMSG(&msg)->cmd;
- switch (command)
- {
- case IDM_OPTION1:
- eraseLastLine = FALSE;
- strcpy( szString, sz1 );
- WinInvalidateRegion( hwnd, NULL, FALSE );
- break;
- case IDM_OPTION2:
- eraseLastLine = FALSE;
- strcpy( szString, sz2 );
- WinInvalidateRegion( hwnd, NULL, FALSE );
- break;
- case IDM_OPTION3:
- eraseLastLine = FALSE;
- strcpy( szString, sz3 );
- WinInvalidateRegion( hwnd, NULL, FALSE );
- break;
- case IDM_HALLO:
- eraseLastLine = FALSE;
- strcpy( szString, szHallo );
- WinInvalidateRegion( hwnd, NULL, FALSE );
- break;
- case IDM_ERASE:
- eraseLastLine = TRUE;
- WinInvalidateRegion( hwnd, NULL, FALSE );
- break;
- case IDM_EXITPROG:
- WinPostMsg( hwnd, WM_CLOSE, 0L, 0L );
- break;
- case IDM_RESUME:
- break;
- default:
- return WinDefWindowProc( hwnd, msg, mp1, mp2 );
- }
- break;
-
-
- default:
- /***********************************************/
- /* Hierher gelangen alle anderen Events, die */
- /* von der Window-Prozedur des Client-Bereiches*/
- /* nicht explizit behandelt werden. */
- /* Dieser Fall ("case") muss vorhanden sein! */
- /***********************************************/
-
- return WinDefWindowProc( hwnd, msg, mp1, mp2 );
- }
-
- return FALSE;
- }
- /*------- Ende der Window-Prozedur des Client -----*/
-