home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
03
/
multi
/
hello2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-23
|
11KB
|
228 lines
/**********************************************************/
/* 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 ----------*/