home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************/
- /* */
- /* SCROLL1.c */
- /* */
- /* (C) 1990 J. Heid & toolbox */
- /* */
- /* 1. Version zur Demonstration des Scrollbars */
- /* */
- /* - Demonstriert, wie man Scrollbars in ein */
- /* PM-Programm einbaut. */
- /* - Zeigt die Messages, die beim Klicken im */
- /* Scrollbar entstehen: */
- /* Ausgabe im Client oder, falls dieser zu */
- /* klein ist, innerhalb einer applikations- */
- /* modalen Messagebox. */
- /* - Zusaetzlich werden von dem fiktiven Text die */
- /* berechneten Zeilennummern ausgegeben: damit */
- /* hat man eine Kontrolle, dass das Scrollen */
- /* richtig funktioniert. */
- /* - Als Kommandoargumente kann man eingeben: */
- /* - die Zeilen- und Spaltenzahl eines fiktiven */
- /* Textes und */
- /* - die Startindizes des horizontalen und */
- /* vertikalen Scrollbars. */
- /* - Der Actionbar bietet den Eintrag */
- /* "Exit und Info". */
- /* - Als Akzeleratortaste ist wirksam: */
- /* F3 : beendet das Programm */
- /* - Die Windowprozedur ClientWndProc behandelt */
- /* explizit die folgenden 7 Events: */
- /* WM_CREATE, WM_SIZE, WM_PAINT, */
- /* WM_COMMAND, WM_VSCROLL, WM_HSCROLL, */
- /* WM_CHAR. */
- /* */
- /* */
- /* Aufruf: scroll1 [ 50 100 [ 10 10 ] ] */
- /* - die 4 Argumente sind optional */
- /* - Argument 1 und 2: Zahl der Textzeilen und */
- /* Textspalten */
- /* - Argument 3 und 4: Index der ersten Textzeile */
- /* und Textspalte zum */
- /* Ausdruck des Beginns */
- /* des Scrollbereiches */
- /* */
- /* */
- /* Funktionen: */
- /* ----------- */
- /* SCROLL1.c besteht aus 7 Funktionen, die sich */
- /* in ff. Weise aufrufen: */
- /* main */
- /* | LiesKommandoArg */
- /* | WndCreate */
- /* | | AusgabeBox */
- /* */
- /* ClientWindowProc */
- /* | PaintWin */
- /* | | DisplayScroll */
- /* | | | AusgabeBox */
- /* | AusgabeBox */
- /* */
- /* */
- /* Benoetigte Dateien: */
- /* ------------------- */
- /* SCROLL1.c - Quellcode-Datei */
- /* SCROLL1.rc - Resource-Datei */
- /* SCROLL1.h - Header-Datei */
- /* SCROLL1.def - Modul-Definitions-Datei */
- /* SCROLL1.mak - Make-Datei */
- /* */
- /*****************************************************/
-
-
- #define INCL_WIN
- #define INCL_GPI
- #include <os2.h> // PM-Include-Datei
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- #include "scroll1.h" // Symbol. Konstanten fuer
- // scroll1.c und scroll1.rc
-
-
- #define STANDARD_COLS 200 // Text mit 200 Spalten
- #define STANDARD_ROWS 100 // Text mit 100 Zeilen
- #define BEGIN_V_RANGE 0 // Standardwerte fuer
- #define BEGIN_H_RANGE 0 // den Scrollbereich
-
-
- /*****************************************************/
- /* Funktions-Prototypen */
- /*****************************************************/
- int cdecl main( int, char ** );
- BOOL WndCreate( VOID );
- MRESULT EXPENTRY ClientWindowProc( HWND hwnd,
- USHORT msg,
- MPARAM mp1,
- MPARAM mp2 );
- void PaintWin( HWND hwnd);
- void DisplayScroll( HPS hps,
- PRECTL pRectl );
- void AusgabeBox ( VOID );
- void LiesKommandoArg( int argc,
- char *argv[] );
-
-
-
-
- /*****************************************************/
- /* globale Variablen */
- /*****************************************************/
- HAB hab; // Programmanker
- CHAR szClientClass[] = "KlasseScroll1";
- // Name der Fensterklasse
- HWND hwndFrame; // Handle fuer das Frame-Fenster
- HWND hwndClient; // Handle fuer den Client-Bereich
- // des Fensters
-
- SHORT sVStart, // - sVStart und sVEnd bestimmen
- sVEnd , // den Scrollbereich.
- sVPos ; // (analog sHStart und sHEnd).
- SHORT sHStart, // - Dieser ist ebenso wie PAGEUP
- sHEnd , // abhaengig von der
- sHPos ; // Fenstergroesse!
- // - sVStart und sHStart haben als
- // Standardwerte BEGIN_V_RANGE
- // und BEGIN_H_RANGE (aenderbar
- // durch Kommandoarg. 3 + 4 )
-
- SHORT cxChar, // Groessen des akt. Fonts
- cxCaps, // ( benoetigte Teile der
- cyChar, // FONTMETRICS-Struktur )
- cyDesc;
-
- CHAR szBoxText[255]; // enthalten Text und Titel fuer
- PSZ szBoxTitel; // die Ausgabe in der Messagebox
- // oder im Client
- BOOL bVertScroll = FALSE; // Flagge, welcher
- BOOL bHorzScroll = FALSE; // Scrollbar geklickt wurde
- SHORT cxClient, // Ausdehnung des Clientbereichs
- cyClient ;
-
- SHORT sTextCols; // Anzahl der Spalten im Text
- SHORT sTextRows; // Anzahl der Zeilen im Text
- // Standardwerte sind
- // STANDARD_COLS und
- // STANDARD_COLS (aenderbar
- // durch Kommandoarg. 1 + 2 )
-
-
- // Formatstrings fuer die Meldungen per szBoxText
- static CHAR * apchFormatTable [] =
- {
- // --- 0 ---
- "Das Programm zeigt die Messages fuer die \
- Scrollbars an! \
- \nEs nimmt anhand der Kommandoargumente an:\
- \n - der Text, in dem man scrollt, hat\
- \n %d Zeilen und %d Spalten und \
- \n - die Scrollbereichs-Startwerte sind\
- \n %d (V) und %d (H).",
- // --- 1 ---
- "Vertikale Ausdehnung=(%d,%d) Position=%d",
- // --- 2 ---
- "Horizontale Ausdehnung=(%d,%d) Position=%d",
- // --- 3 ---
- "Vertikale Ausdehnung=(%d,%d) Position=%d \
- \nText: Zeilen/Spaltenzahl %d / %d",
- // --- 4 ---
- "Horizontale Ausdehnung=(%d,%d) Position=%d \
- \nText: Zeilen/Spaltenzahl %d / %d",
- // --- 5 ---
- "Das Programm simuliert das Scrollen in einem \
- \nText mit %d Zeilen und %d Spalten.",
- // --- 6 ---
- "Scrollen in einem Text\
- mit %d Zeilen und %d Spalten und\
- mit den Startwerten %d (V) und %d (H).\
- \nStartwerte duerfen nicht negativ sein!",
- // --- 7 ---
- "Das Programm simuliert das Scrollen in einem Text\
- mit %d Zeilen und %d Spalten und\
- \n mit den Startwerten %d (V) und %d (H).",
- // --- 8 ---
- "Es wurden nicht genau 2 bzw. 4 Argumente uebergeben.\
- Deshalb wird die Zeilenzahl auf %d und \
- die Spaltenzahl auf %d gesetzt.",
- };
-
-
-
- /*------- Start der main-Funktion -----------------*/
- /* */
- /* - initialisiert und terminiert */
- /* - liest evtl. vorhandene Kommandoargumente */
- /* - enthaelt Message-Loop */
- /* */
- /* - globale Variable: */
- /* definiert: hab. */
- /* referiert: hwndFrame. */
- /* - ruft: WndCreate(), LiesKommandoArg() */
- /* */
- /*---------------------------------------------------*/
- int cdecl main (argc, argv)
- int argc;
- char *argv[];
- {
- HMQ hmq; // Handle fuer die Message-Queue
- QMSG qmsg; // Message in der Message-Queue
-
- LiesKommandoArg(argc, argv);
-
- 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. */
- /* - gibt ganz am Anfang in einer Messagebox die */
- /* Groesse des fiktiven Textes und die Untergrenzen*/
- /* der Scrollbereiche aus. */
- /* */
- /* - globale Variable: */
- /* definiert: hwndClient, hwndFrame. */
- /* referiert: hab, szClientClass, hwndFrame. */
- /* - aufgerufen von: main() */
- /* - Return: - TRUE, wenn alles klappt */
- /* - FALSE, wenn etwas schiefging. Dann */
- /* bricht main() Verarbeitung ab. */
- /*---------------------------------------------------*/
- BOOL WndCreate( VOID )
- {
- ULONG flCreateFrame; // Flaggen fuer die Erzeugung
- // der Controls
- BOOL brc; // Hilfsvariable zum Abpruefen
- // des Rueckgabewertes von
- // API-Funktionen
-
- // Ordne die ClientWndProc einer Klasse zu
- brc = WinRegisterClass(
- hab, // Programmanker
- szClientClass, // Name der Fensterklasse
- ClientWindowProc, // Adr. der Fensterprozedur
- CS_SIZEREDRAW, // Klassen-Style
- 0 // keine Extra-Bytes
- // reservieren
- );
-
- // wenn WinRegisterClass nicht erfolgreich
- if ( brc == FALSE ) return ( FALSE );
-
- // nun Standardfenster auch mit Actionbar
- // und Akzeleratortabelle als Resource
- flCreateFrame = FCF_STANDARD & ~FCF_ICON |
- FCF_VERTSCROLL | FCF_HORZSCROLL;
-
- // Erzeugen eines Standardfensters
- hwndFrame = WinCreateStdWindow(
-
- HWND_DESKTOP, // Handle des Vaterfensters
- WS_VISIBLE, // Style des Frame-Fensters
- (PULONG)&flCreateFrame,
- szClientClass, // Client-Fenster-Klasse
- " - Scrollbar-Demo", // Titel-Erweiterung
- 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 );
-
-
- AusgabeBox();
-
- return ( TRUE );
-
- }
- /*------- Ende der WndCreate-Funktion --------------*/
-
-
-
- /*------- Start der Window-Prozedur des Client -----*/
- /* */
- /* - behandelt die Reaktionen des Clientfensters */
- /* - explizit behandelte Events: */
- /* WM_CREATE, WM_SIZE, WM_PAINT, WM_COMMAND, */
- /* WM_VSCROLL, WM_HSCROLL, WM_CHAR. */
- /* */
- /* - globale Variable: */
- /* definiert: ... */
- /* referiert: ... */
- /* */
- /* - aufgerufen von: Presentation Manager */
- /* - ruft: in WM_PAINT: PaintWin */
- /* in WM_COMMAND: AusgabeBox */
- /*---------------------------------------------------*/
- MRESULT EXPENTRY ClientWindowProc( HWND hwnd,
- USHORT msg,
- MPARAM mp1,
- MPARAM mp2 )
- {
- HPS hps; // Presentation-Space-Handle
- FONTMETRICS fm; // Struktur mit Attributen
- // des akt. Fonts
- static HWND hwndVScroll; // Handle fuer den
- // vertikalen Scrollbar
- static HWND hwndHScroll; // Handle fuer den
- // horizontalen Scrollbar
- SHORT sVPosOld,
- sHPosOld;
-
- USHORT usVKey; // Komponente der WM_CHAR-Message
- USHORT command; // Command-Wert bei WM_COMMAND
- // ID des gewaehlten Menueeintrags
-
-
- switch( msg )
- {
-
- case WM_CREATE:
- /***********************************************/
- /* - bestimmt die Handles der beiden Scrolls: */
- /* ist das nicht moeglich, wird die */
- /* Verarbeitung abgebrochen! */
- /* - bestimmt die Attribute des aktuellen */
- /* Fonts: die davon benoetigten Teile werden */
- /* in den globalen Variablen cxChar, */
- /* cxCaps, cyChar und cyDesc abgelegt. */
- /***********************************************/
-
- hwndVScroll =
- WinWindowFromID( WinQueryWindow( hwnd,
- QW_PARENT,
- FALSE ),
- FID_VERTSCROLL );
-
- hwndHScroll =
- WinWindowFromID( WinQueryWindow( hwnd,
- QW_PARENT,
- FALSE ),
- FID_HORZSCROLL );
-
-
- if ( hwndVScroll == (HWND)NULL ||
- hwndHScroll == (HWND)NULL )
- return ( (MRESULT)TRUE );
-
- hps = WinGetPS( HWND_DESKTOP );
- GpiQueryFontMetrics( hps,
- (LONG)sizeof( fm ),
- &fm );
- WinReleasePS( hps );
-
-
- cxChar = (SHORT) fm.lAveCharWidth;
- cxCaps = (SHORT) fm.lEmInc;
- cyChar = (SHORT) fm.lMaxBaselineExt;
- cyDesc = (SHORT) fm.lMaxDescender;
-
- return 0;
-
-
- case WM_SIZE:
- /***********************************************/
- /* - bestimmt die Ausdehnung des Client */
- /* - bestimmt fuer den vertikalen Scrollbar */
- /* sVEnd und sVPos in Abhaengigkeit von */
- /* Client-Hoehe und Font-Groesse. */
- /* - Damit werden die Slider-Position und */
- /* der Slider-Bereich festgelegt. */
- /* - Ist der Text kleiner als der Client, wird */
- /* der Scrollbar disabled und unmgekehrt. */
- /* - Analog wird beim horizontalen Scrollbar */
- /* vorgegangen. */
- /***********************************************/
- cxClient = SHORT1FROMMP (mp2) ;
- cyClient = SHORT2FROMMP (mp2) ;
-
- sVEnd = max ( sVStart,
- sTextRows - cyClient / cyChar
- + sVStart) ;
- sVPos = min ( sVPos, sVEnd );
-
- WinSendMsg( hwndVScroll,
- SBM_SETSCROLLBAR,
- MPFROMSHORT( sVPos ),
- MPFROM2SHORT( sVStart, sVEnd ) );
- WinEnableWindow( hwndVScroll,
- ( sVEnd - sVStart ) ?
- TRUE : FALSE
- );
-
-
- sHEnd = max ( sHStart,
- sTextCols - (cxClient / cxCaps)
- + sHStart );
- sHPos = min ( sHPos, sHEnd );
-
- WinSendMsg( hwndHScroll,
- SBM_SETSCROLLBAR,
- MPFROMSHORT( sHPos ),
- MPFROM2SHORT( sHStart, sHEnd ) );
- WinEnableWindow( hwndHScroll,
- ( sHEnd - sHStart ) ?
- TRUE : FALSE
- );
- return 0 ;
-
-
- case WM_PAINT:
- /***********************************************/
- /* hier wird der Inhalt des Clients gezeichnet */
- /***********************************************/
- PaintWin ( hwnd );
- return 0;
-
-
- case WM_CHAR:
- /***********************************************/
- /* damit reagiert der Scrollbar auch auf */
- /* Eingaben von der Tastatur */
- /***********************************************/
- // die VK-Werte sind definiert in PMWIN.h !
- usVKey = (USHORT) CHARMSG(&msg)->vkey;
- if ( usVKey == VK_UP ||
- usVKey == VK_DOWN ||
- usVKey == VK_PAGEUP ||
- usVKey == VK_PAGEDOWN )
- return( WinSendMsg( hwndVScroll,
- msg,
- mp1,
- mp2) );
- else if ( usVKey == VK_LEFT ||
- usVKey == VK_RIGHT )
- return( WinSendMsg( hwndHScroll,
- msg,
- mp1,
- mp2) );
- else
- break;
-
-
- 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 "Exit und Info"-Submenue der */
- /* Eintrag "Exit" gewaehlt wird, schickt */
- /* sich die Anwendung eine WM_QUIT-Message. */
- /* - Bei "Resume" tut sie gar nichts. */
- /* - Bei "Programm-Information" wird in einer */
- /* Messagebox der Zweck des Programms */
- /* erklaert. */
- /***********************************************/
-
- command = COMMANDMSG(&msg)->cmd;
-
- switch( command )
- {
- case IDM_ABOUT:
- sprintf( szBoxText, apchFormatTable[0],
- sTextRows, sTextCols,
- sVStart, sHStart );
- szBoxTitel = "Programmzweck"; // Titel !
-
- AusgabeBox();
- break;
-
- case IDM_EXITPROG:
- WinPostMsg( hwnd,
- WM_QUIT,
- (MPARAM)0,
- (MPARAM)0 );
- break;
- }
- break;
-
-
- case WM_VSCROLL:
- /***********************************************/
- /* - hier werden alle Faelle einer Message des */
- /* vertikalen Scrollbars behandelt. */
- /* - je nachdem, was der Benutzer mit der Maus */
- /* im Scrollbar macht, nehmen die hoeheren */
- /* beiden Bytes des 2. Messageparameters */
- /* verschiedene Werte an. */
- /* - Das Programm muss entsprechend auf diese */
- /* Informationen reagieren, indem es evtl. */
- /* sVPos veraendert, den Slider neu setzt */
- /* und ein WM_PAINT generiert: dort wird der */
- /* Text entsprechend dem neuen sVPos neu */
- /* ausgegeben. */
- /***********************************************/
- sVPosOld = sVPos;
- switch( SHORT2FROMMP(mp2) )
- {
- case SB_LINEUP:
- szBoxTitel = "SB_LINEUP";
- sVPos--;
- break;
- case SB_PAGEUP:
- szBoxTitel = "SB_PAGEUP";
- sVPos -= cyClient / cyChar;
- break;
- case SB_LINEDOWN:
- szBoxTitel = "SB_LINEDOWN";
- sVPos++;
- break;
- case SB_PAGEDOWN:
- szBoxTitel = "SB_PAGEDOWN";
- sVPos += cyClient / cyChar;
- break;
- case SB_SLIDERTRACK:
- szBoxTitel = "SB_SLIDERTRACK";
- sVPos = SHORT1FROMMP(mp2);
- break;
- case SB_SLIDERPOSITION:
- szBoxTitel = "SB_SLIDERPOSITION";
- sVPos = SHORT1FROMMP(mp2);
- break;
- case SB_ENDSCROLL:
- return (MRESULT)0;
- default:
- szBoxTitel = "default";
- return (MRESULT)0;
- }
-
- // es gilt: sVStart <= sVPos <= sVEnd
- // Identisch mit:
- // sVPos = max(sVStart, min(sVPos,sVEnd));
- // ist:
- if ( sVPos < sVStart )
- sVPos = sVStart;
- else if ( sVPos > sVEnd )
- sVPos = sVEnd;
-
- if ( sVPosOld != sVPos )
- {
- WinSendMsg( hwndVScroll,
- SBM_SETPOS,
- MPFROMSHORT( sVPos ),
- MPFROMSHORT( 0 ) );
- bVertScroll = TRUE;
- WinInvalidateRect( hwnd, NULL, FALSE );
- }
-
- break;
-
-
- case WM_HSCROLL:
- /***********************************************/
- /* - hier werden alle Faelle einer Message des */
- /* horizontalen Scrollbars behandelt. */
- /* - je nachdem, was der Benutzer mit der Maus */
- /* im Scrollbar macht, nehmen die hoeheren */
- /* beiden Bytes des 2. Messageparameters */
- /* verschiedene Werte an. */
- /* - Das Programm muss entsprechend auf diese */
- /* Informationen reagieren, indem es evtl. */
- /* sHPos veraendert, den Slider neu setzt */
- /* und ein WM_PAINT generiert: dort wird der */
- /* Text entsprechend dem neuen sHPos neu */
- /* ausgegeben. */
- /***********************************************/
- sHPosOld = sHPos;
- switch( SHORT2FROMMP(mp2) )
- {
- case SB_LINELEFT:
- szBoxTitel = "SB_LINELEFT";
- sHPos--;
- break;
- case SB_PAGELEFT:
- szBoxTitel = "SB_PAGELEFT";
- sHPos -= cxClient / cxCaps;
- break;
- case SB_LINERIGHT:
- szBoxTitel = "SB_LINERIGHT";
- sHPos++;
- break;
- case SB_PAGERIGHT:
- szBoxTitel = "SB_PAGERIGHT";
- sHPos += cxClient / cxCaps;
- break;
- case SB_SLIDERPOSITION:
- szBoxTitel = "SB_SLIDERPOSITION";
- sHPos = SHORT1FROMMP(mp2);
- break;
- case SB_ENDSCROLL:
- return (MRESULT)0;
- default:
- szBoxTitel = "default";
- return (MRESULT)0;
- }
-
- // es gilt: sHStart <= sHPos <= sHEnd
- // Identisch mit:
- // sHPos = max(sHStart, min(sHPos,sHEnd));
- // ist:
- if ( sHPos < sHStart )
- sHPos = sHStart;
- else if ( sHPos > sHEnd )
- sHPos = sHEnd;
-
- if ( sHPosOld != sHPos )
- {
- WinSendMsg( hwndHScroll,
- SBM_SETPOS,
- MPFROMSHORT( sHPos ),
- MPFROMSHORT( 0 ) );
- bHorzScroll = TRUE;
- WinInvalidateRect( hwnd, NULL, FALSE );
- }
-
- break;
-
-
- default: // default fuer switch( msg )
- return WinDefWindowProc( hwnd, msg, mp1, mp2 );
- }
-
- return FALSE;
- }
- /*------- Ende der Window-Prozedur des Client -----*/
-
-
-
-
-
-
- /*--------- Start der PaintWin-Funktion ------------*/
- /* */
- /* - schreibt mit GpiCharStringAt die Zeilennummern */
- /* des fiktiven Textes. Die Nummernwerte sind */
- /* u.a. abhaengig von sVPos und sHPos. */
- /* - wenn das WM_PAINT durch ein Scroll-Event */
- /* erzeugt wurde, sitzt eine der beiden Flaggen */
- /* bVertScroll oder bHorzScroll, was zum Aufruf */
- /* von DisplayScroll fuehrt. */
- /* */
- /* - Formalparameter: */
- /* hwnd Clientbereich, in den geschrieben wird */
- /* */
- /* - globale Variable: */
- /* referiert: sVPos, sTextRows, cyClient, cyChar, */
- /* sHPos, cxCaps, cyDesc. */
- /* */
- /* - aufgerufen von: ClientWindowProc, WM_PAINT */
- /*---------------------------------------------------*/
- void PaintWin( HWND hwnd )
- {
- HPS hps; // Handle cache-PS
- RECTL rectl; // Struktur Rechteck-Koordinaten:
- // erhaelt Koordinaten des Client
- POINTL ptl;
- int i,
- sVPaintBeg,
- sVPaintEnd;
- char szTmp[10];
- BOOL brc;
-
- // macht den ganzen(!) Client zur Update-Region
- brc = WinInvalidateRect( hwnd, NULL, FALSE );
-
- // Erzeuge einen Presentation Space
- hps = WinBeginPaint( hwnd, NULL, &rectl );
-
- brc = WinFillRect( hps, &rectl, CLR_RED );
-
- brc = GpiSetColor( hps, SYSCLR_WINDOWTEXT );
- brc = GpiSetBackMix( hps, BM_OVERPAINT );
-
-
- sVPaintBeg = sVPos;
- sVPaintEnd = min ( sTextRows - 1 + sVPos,
- cyClient/cyChar - 1 + sVPos
- );
-
- for ( i = sVPaintBeg; i <= sVPaintEnd; i++ )
- {
- ptl.x = 8 * cxCaps - sHPos * cxCaps;
- ptl.y = cyClient - (i + 1 - sVPos) * cyChar
- + cyDesc;
- itoa( i, szTmp, 10 );
-
- GpiCharStringAt( hps, &ptl,
- (LONG) strlen( szTmp ),
- szTmp
- );
- }
-
- if ( bVertScroll || bHorzScroll )
- DisplayScroll( hps, &rectl );
-
-
- WinEndPaint( hps ); // Paint ist erledigt
-
- }
- /*------ Ende der PaintWin-Funktion ------------*/
-
-
-
- /*------ Start der DisplayScroll-Funktion ----------*/
- /* */
- /* - Falls ein Scroll-Event ein WM_PAINT erzeugt, */
- /* wird hier die Art der Scroll-Message ausgegeben.*/
- /* - Die Ausgabe wird normalerweise in den Client */
- /* geschrieben; passt der Text nicht ganz in */
- /* den Client, erfolgt die Ausgabe in einer */
- /* Messagebox. */
- /* */
- /* - Formalparameter: */
- /* hps aktueller Presentation Space */
- /* pRectl Ausdehnung des ganzen Client-Bereiches */
- /* */
- /* - aufgerufen von: PaintWin */
- /*---------------------------------------------------*/
- void DisplayScroll( HPS hps, PRECTL pRectl )
- {
- RECTL R; // Ausdehnung des Fensters im Client
- // fuer Ausgabe per WinDrawText
- LONG lcx; // Breite der Textbox. Damit gecheckt,
- // ob der Text in den Client passt.
- POINTL aptlTextBox[TXTBOX_COUNT];
- // Array von Punkten, die die
- // Eckkoordinaten der TextBox
- // enthalten
- BOOL bMsgBox = FALSE; // ist TRUE, wenn die Ausgabe
- // in einer Messagebox
- // erfolgen muss, weil der
- // Client zu klein ist.
- LONG lLen = 0L;
- BOOL brc;
- SHORT src;
-
- // CHECKEN der Text-Dimension
- // Die Hoehe soll mindestens 4 Zeilen betragen
- if ( (cyChar * 4) + cyDesc > (SHORT) pRectl->yTop )
- {
- bMsgBox = TRUE;
- }
- else
- {
- // Bearbeitung von szBoxTitel:
- brc = GpiQueryTextBox ( hps,
- (LONG)strlen((char *)szBoxTitel),
- szBoxTitel,
- TXTBOX_COUNT,
- aptlTextBox );
- lcx = aptlTextBox[TXTBOX_BOTTOMRIGHT].x -
- aptlTextBox[TXTBOX_BOTTOMLEFT].x ;
-
- // Voraussetzung: pRectl->xLeft des Client ist 0 !
- if ( lcx > pRectl->xRight )
- {
- bMsgBox = TRUE;
- }
- else
- {
- // Bearbeitung von szBoxText, das erst zu fuellen
- if ( bVertScroll )
- lLen = (LONG) sprintf( szBoxText,
- apchFormatTable[1],
- sVStart, sVEnd, sVPos );
- else if ( bHorzScroll )
- lLen = (LONG) sprintf( szBoxText,
- apchFormatTable[2],
- sHStart, sHEnd, sHPos );
-
- brc = GpiQueryTextBox ( hps,
- lLen,
- szBoxText,
- TXTBOX_COUNT,
- aptlTextBox );
- lcx = aptlTextBox[TXTBOX_BOTTOMRIGHT].x -
- aptlTextBox[TXTBOX_BOTTOMLEFT].x ;
-
- if ( lcx > pRectl->xRight )
- bMsgBox = TRUE;
- }
- }
-
- if ( bMsgBox )
- // hier passt Text nicht in den Client
- // --> Ausgabe in einer Messagebox
- // szBoxText ist bei Ausgabe in Messagebox
- // etwas ausfuehrlicher als im Client
- {
- bMsgBox = FALSE;
-
- if ( bVertScroll )
- {
- bVertScroll = FALSE;
- lLen = (LONG) sprintf( szBoxText,
- apchFormatTable[3],
- sVStart, sVEnd, sVPos,
- sTextRows, sTextCols );
- }
- else if ( bHorzScroll )
- {
- bHorzScroll = FALSE;
- lLen = (LONG) sprintf( szBoxText,
- apchFormatTable[4],
- sHStart, sHEnd, sHPos,
- sTextRows, sTextCols );
- }
-
- AusgabeBox();
- }
-
- else // hier passt der Text in den Client
- {
- R.xLeft = pRectl->xLeft;
- R.xRight = pRectl->xRight;
-
- // --> Ausgabe rechtsbuendig in den Client
- if ( bVertScroll )
- {
- bVertScroll = FALSE;
-
- R.yTop = (pRectl->yTop / 2) + ( cyChar * 2 );
- R.yBottom = (pRectl->yTop / 2);
-
- src = WinDrawText( hps, -1,
- szBoxText, &R,
- CLR_YELLOW, CLR_BROWN,
- DT_RIGHT | DT_VCENTER );
-
- R.yTop = (pRectl->yTop / 2);
- R.yBottom = (pRectl->yTop / 2) - ( cyChar * 2 );
-
- src = WinDrawText( hps, -1,
- szBoxTitel, &R,
- CLR_YELLOW, CLR_BROWN,
- DT_RIGHT | DT_VCENTER );
- }
-
- // --> Ausgabe horizontal zentriert in den Client
- else if ( bHorzScroll )
- {
- bHorzScroll = FALSE;
-
- R.yTop = pRectl->yBottom + ( cyChar * 4 )
- + cyDesc;
- R.yBottom = pRectl->yBottom + ( cyChar * 2 )
- + cyDesc;
-
- src = WinDrawText( hps, -1,
- szBoxText, &R,
- CLR_YELLOW, CLR_BROWN,
- DT_BOTTOM | DT_CENTER );
-
- R.yTop = pRectl->yBottom + ( cyChar * 2 )
- + cyDesc;
- R.yBottom = pRectl->yBottom + cyDesc;
-
- src = WinDrawText( hps, -1,
- szBoxTitel, &R,
- CLR_YELLOW, CLR_BROWN,
- DT_BOTTOM | DT_CENTER );
- }
- }
- }
- /*------- Ende der DisplayScroll-Funktion ----------*/
-
-
-
-
-
-
-
-
-
-
- /*------ Start der AusgabeBox-Funktion -------------*/
- /* */
- /* - Gibt in einer beweglichen, applikationsmodalen */
- /* Messagebox den Text und den Titel aus, der */
- /* zu diesem Zeitpunkt in den globalen Variablen */
- /* szBoxText und szBoxTitel steht. */
- /* */
- /* - globale Variable: */
- /* referiert: szBoxTitel, szBoxText */
- /* */
- /* - aufgerufen von: */
- /* WndCreate ( initial ), */
- /* ClientWindowProc ( Programm-Information ), */
- /* DisplayScroll ( falls Text nicht in den */
- /* Client passt ). */
- /*---------------------------------------------------*/
- void AusgabeBox ()
- {
- WinMessageBox ( HWND_DESKTOP,
- hwndClient,
- (PSZ) szBoxText,
- (PSZ) szBoxTitel, // Titel
- (USHORT)NULL,
- MB_MOVEABLE
- );
- }
- /*------- Ende der AusgabeBox-Funktion -------------*/
-
-
-
-
- /*---- Start der LiesKommandoArg-Funktion ---------*/
- /* */
- /* - liest Kommandoargumente fuer die globalen */
- /* Variablen sTextRows, sTextCols, */
- /* sVStart und sHStart */
- /* ein. */
- /* - Entsprechend der Eingabe werden die globalen */
- /* Variablen szBoxText und szBoxTitel fuer die */
- /* initiale Messagebox-Ausgabe gefuellt. */
- /* */
- /* - aufgerufen von: main */
- /* */
- /*---------------------------------------------------*/
- void LiesKommandoArg(int argc, char *argv[] )
- {
- // Aendern Textgroesse
- if (argc == 3)
- {
- sTextRows = (USHORT) atoi( argv[1] );
- sTextCols = (USHORT) atoi( argv[2] );
- sVStart = BEGIN_V_RANGE;
- sHStart = BEGIN_H_RANGE;
-
- sprintf( szBoxText, apchFormatTable[5],
- sTextRows, sTextCols );
- szBoxTitel = "EINGABE:";
- }
-
- // Aendern Textgroesse und Scrollbereich
- else if (argc == 5)
- {
- sTextRows = (USHORT) atoi( argv[1] );
- sTextCols = (USHORT) atoi( argv[2] );
- sVStart = (USHORT) atoi( argv[3] );
- sHStart = (USHORT) atoi( argv[4] );
-
- if ( sVStart < 0 || sHStart < 0 )
- {
- sVStart = BEGIN_V_RANGE;
- sHStart = BEGIN_H_RANGE;
-
- sprintf( szBoxText, apchFormatTable[6],
- sTextRows, sTextCols,
- sVStart, sHStart );
- szBoxTitel = "ACHTUNG !!!";
- }
- else
- {
- sprintf( szBoxText, apchFormatTable[7],
- sTextRows, sTextCols,
- sVStart, sHStart );
- szBoxTitel = "EINGABE:";
- }
- }
-
- // keine oder die falsche Zahl Kommandoarg. einggb.
- else
- {
- sTextRows = STANDARD_ROWS;
- sTextCols = STANDARD_COLS;
- sVStart = BEGIN_V_RANGE;
- sHStart = BEGIN_H_RANGE;
-
- sprintf( szBoxText, apchFormatTable[8],
- STANDARD_ROWS, STANDARD_COLS );
- szBoxTitel = "ACHTUNG !!!"; // Titel !
- }
-
- sVPos = sVStart;
- sHPos = sHStart;
- }
- /*----- Ende der LiesKommandoArg-Funktion ---------*/