home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************/
- /* HELLO2.c */
- /* */
- /* (C) 1990 Heid & toolbox */
- /* */
- /* Minimalversion von Hello World: */
- /* - Ausgabe von "toolbox, das Fenster zum Durchblicken" */
- /* in Standardfenster, ohne Actionbar, ohne Ressourcen */
- /* Erweiterung von hello1.c ! */
- /* - die Windowprozedur ClientWndProc behandelt */
- /* explizit die folgenden 3 Events: */
- /* WM_PAINT, WM_BUTTON1DOWN, WM_CHAR */
- /* - F3 beendet das Programm. */
- /* - jeder Klick der li. Maustaste alterniert Farbe */
- /* Unterschied zu hello1.c: */
- /* - ohne WM_CREATE und ohne WM_DESTROY */
- /* - statt WinDrawText nun mit GpiCharStringAt */
- /* Benötigte Dateien: HELLO2.c, HELLO2.def, OS2.h */
- /* Benötigte Libraries: OS2.lib */
- /**********************************************************/
-
- #include <string.h> // fuer strlen
- #define INCL_WIN
- #include <os2.h> // PM-Include-Datei
-
- /**********************************************************/
- /* 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[] = "KlasseHello2";
- // Name der Fensterklasse
- HWND hwndClient; // Handle fuer den Client-Bereich
- // des Fensters
- HWND hwndFrame; // Handle fuer das Frame-Fenster
-
- /*------- Start der main-Funktion ----------------------*/
- /* */
- /* - initialisiert und terminiert */
- /* - Message-Loop */
- /* */
- /* - 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": */
- /* Empfange und verteile 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 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 );
- // welche Controls sollen eingefuegt werden
- flCreateFrame = FCF_STANDARD & ~FCF_ICON
- & ~FCF_ACCELTABLE
- & ~FCF_MENU;
- // 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, // Ressourcen sind in EXE-Datei
- 0, // keine Identity für Ressourcen
- (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 */
- /* - erzeugt das Standardfenster */
- /* - benutzte globale Variable: / */
- /* - 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
-
- static CHAR szText[] = "das toolbox-Fenster";
- // Hintergrundfarbe des Clients
- static COLOR colorClient = CLR_RED;
- switch( msg )
- {
- 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 = 190L; // die Ausgabe des Textes
- // Setze Text-Farbe
- GpiSetColor( hps, CLR_WHITE );
- // Zeichne den Textstring szText
- GpiCharStringAt( hps, &pt, (LONG)strlen(szText),
- (PCH)szText );
- // Setze y-Koordinate fuer weitere
- pt.y = 170L; // Textausgaben
- GpiCharStringAt( hps, &pt, 23L,
- (PCH)"Maus-Taste 1 alterniert");
- pt.y = 155L;
- GpiCharStringAt( hps, &pt, 26L,
- (PCH)"die Farbe dieses Fensters!xxx" );
- pt.y = 130L;
- lCount = (LONG)strlen("F3 beendet das Programm!");
- GpiCharStringAt( hps, &pt, lCount,
- (PCH)"F3 beendet das Programm!");
- 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 */
- /* - 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: */
- /* - Die ersten 2 Byte des Message-Parameters */
- /* mp2 enthalten den Zeichen-Code, die höheren */
- /* 2 Byte enthalten den "virtuellen" Tasten-Code */
- /* - Wenn F3 gedrueckt wurde, wird eine */
- /* WM_QUIT-Message an die Message-Queue */
- /* gepostet, um das Programm zu beenden. */
- /****************************************************/
- if( CHARMSG( &msg ) -> vkey == VK_F3 )
- // oder: if ( SHORT2FROMMP( mp2 ) == VK_F3 )
- WinPostMsg( hwnd, WM_QUIT, 0L, 0L );
- return 0;
- default:
- /****************************************************/
- /* Hierher gelangen alle anderen Events, die */
- /* von der Window-Prozedur des Client-Bereiches */
- /* nicht explizit behandelt werden. */
- /* Dieser Fall muß(!) behandelt werden! */
- /****************************************************/
-
- return WinDefWindowProc( hwnd, msg, mp1, mp2 );
- }
- return FALSE;
- }
- /*------- Ende der Window-Prozedur des Client ----------*/
-