home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************/
- /* */
- /* SCROLL3.c */
- /* */
- /* (C) 1990 J. Heid & toolbox */
- /* */
- /* 3. Version zur Demonstration des Scrollbars */
- /* */
- /* - Demonstriert, wie man mit Scrollbars einen */
- /* Text beliebiger Groesse anzeigen kann. */
- /* - Der Text wird mit DosGetResource geladen. */
- /* In unserem Fall enthaelt die Text-Resource- */
- /* Datei "PANTHER.asc" das Gedicht "Der Panther" */
- /* von Rainer Maria Rilke. */
- /* - Das Fenster wird mit WinScrollWindow gescrollt.*/
- /* - Unter OS/2 1.2 sind die Scrollbars variabel */
- /* lang - trotzdem kann der Quellcode unveraendert*/
- /* auch unter 1.1 compiliert werden. */
- /* - Die Scrollbars sind nicht permanent vorhanden, */
- /* sondern werden nur dann erzeugt, wenn der Text */
- /* nicht ganz in das Fenster passt. */
- /* - Der Actionbar bietet den Eintrag */
- /* "Exit und Info". */
- /* - Als Akzeleratortasten sind wirksam: */
- /* F3 : beendet das Programm */
- /* Ctrl-I : zeigt Informationen zum Programm */
- /* - Die Windowprozedur ClientWndProc behandelt */
- /* explizit die folgenden 7 Events: */
- /* WM_CREATE, WM_SIZE, WM_PAINT, */
- /* WM_COMMAND, WM_VSCROLL, WM_HSCROLL, */
- /* WM_CHAR. */
- /* */
- /* */
- /* Funktionen: */
- /* ----------- */
- /* SCROLL3.c besteht aus 8 Funktionen, die sich */
- /* in ff. Weise aufrufen: */
- /* */
- /* 1 main */
- /* 2 | WndCreate */
- /* */
- /* 3 ClientWindowProc */
- /* 4 | AusgabeBox */
- /* 5 | SaveLineInfo */
- /* 6 | | AusgabeBox { 4 } */
- /* 7 | | FrageBox */
- /* 8 | SaveLineInfo { 5 } */
- /* 9 | GetOS2Version */
- /* 10 | PaintWin */
- /* 11 | AusgabeBox { 4 } */
- /* */
- /* */
- /* */
- /* Benoetigte Dateien: */
- /* ------------------- */
- /* SCROLL3.c - Quellcode-Datei */
- /* SCROLL3.h - Header-Datei */
- /* SCROLL3.def - Modul-Definitions-Datei */
- /* SCROLL3.mak - Make-Datei */
- /* SCROLL3.rc - Resource-Datei */
- /* PANTHER.asc - Text-Resource-Datei */
- /* */
- /* */
- /*****************************************************/
-
- #define INCL_WIN
- #define INCL_GPI
- #define INCL_DOS // sonst wird DosGetResource beim
- // Linken nicht gefunden
- #include <os2.h> // PM-Include-Datei
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- #include "scroll3.h" // Symbol. Konstanten fuer
- // scroll3.c und scroll3.rc
-
- #define BEGIN_V_RANGE 0 // Standardwerte fuer
- #define BEGIN_H_RANGE 0 // den Scrollbereich
- #define EINRUECKUNG 3 // linker Rand
-
-
- /*****************************************************/
- /* Funktions-Prototypen */
- /*****************************************************/
- int cdecl main( VOID );
- BOOL WndCreate( VOID );
- MRESULT EXPENTRY ClientWindowProc( HWND hwnd,
- USHORT msg,
- MPARAM mp1,
- MPARAM mp2 );
- VOID PaintWin( HWND hwnd);
- VOID AusgabeBox( VOID );
- BOOL FrageBox( VOID );
- int SaveLineInfo( HWND hwnd,
- SHORT sLineNo,
- SHORT sLineLength,
- PCHAR pText );
- BOOL GetOS2Version( VOID );
-
-
-
- /*****************************************************/
- /* globale Variablen */
- /*****************************************************/
- HAB hab; // Programmanker
- CHAR szClientClass[] = "KlasseScroll3"; // Name der
- // Fensterklasse
- HWND hwndFrame; // Handle fuer das Frame-Fenster
- HWND hwndClient; // Handle fuer den Client-Bereich
-
- SHORT sVStart = BEGIN_V_RANGE, // Scrollbereichsgrenzen
- sVEnd, // und Sliderpositionen
- sVPos ; // fuer den vertikalen
- SHORT sHStart = BEGIN_H_RANGE, // und horizontalen
- sHEnd , // Scrollbar
- sHPos ;
- BOOL bVScroll = FALSE; // TRUE, wenn der senkr.
- // Scroll existiert.
- BOOL bHScroll = FALSE; // TRUE, wenn der waagr.
- // Scroll existiert.
-
- SHORT cxChar, // Groessen des aktuellen Fonts
- cxCaps, // ( benoetigte Teile der
- cyChar, // FONTMETRICS-Struktur )
- cyDesc;
-
- CHAR szQuelldatei[255]; // Name der Resource-Datei
- // fuer den Text
- CHAR szBoxText[255]; // enthalten Text und Titel fuer
- PSZ szBoxTitel; // die Ausgabe in der Messagebox
-
- BOOL bPixelweise = FALSE; // TRUE, wenn horizontal
- // pixelweise zu scrollen
- SHORT cxClient, // Ausdehnung des Clientbereichs
- cyClient ;
-
- SHORT sLongestRow = 0; // Nummer der laengsten Zeile
- SHORT sTextCols = 0; // Anzahl der Spalten im Text
- SHORT sTextRows = 0; // Anzahl der Zeilen im Text
- PCHAR pResource ; // Zeiger auf Textresource
- ULONG ulSegSize ; // Laenge der Textresource
-
- // ist TRUE, wenn die aktuelle OS/2-Version
- // groessenveraenderbare Slider unterstuetzt
- BOOL bSliderResizable = FALSE;
-
- USHORT usMajorVersion; // 10: OS/2 1.1 und OS/2 1.2
- USHORT usMinorVersion; // 10: OS/2 1.1 ,
- // 20: OS/2 1.2
-
-
- int rc; // Hilfsvariablen zum Pruefen
- BOOL brc; // der Rueckgabewerte der
- SHORT src; // API-Funktionen
- USHORT usrc;
-
-
- typedef struct TEXTPOINTER // Zeilenweise Informationen
- { // zu dem Text aus der
- SHORT sLineNumber; // Textresourcedatei:
- SHORT sLineLength; // Zeilennummer, -laenge
- PCHAR pTextplace; // und Zeiger auf Zeilen-
- } TEXTPOINTER; // anfang
- TEXTPOINTER *apstructText;
-
-
-
- // Formatstrings fuer die Meldungen per szBoxText
- static CHAR * apchFormatTable [] =
- {
- /* 0 */
- "Abbruch in WM_CREATE. \
- \n\nDie Textresource konnte nicht geladen werden. \
- \n\nRueckgabewert von DosGetResource: %d.",
-
- /* 1 */ // horizontal pixelweise scrollen..........
- "Das Programm gibt den Text aus, der in der \
- \nResource-Datei \"%s\" steht. \
- \n\nDer Text besteht aus %d Zeilen. \
- \nDie laengste Zeile (Index %d) hat %d Pixel. \
- \n\nInnerhalb dieses Textes kann per Maus und \
- \nTastatur gescrollt werden." ,
-
- /* 2 */ // horizontal zeichenweise scrollen........
- "Das Programm gibt den Text aus, der in der \
- \nResource-Datei \"%s\" steht. \
- \n\nDer Text besteht aus %d Zeilen. \
- \nDie laengste Zeile (Index %d) hat %d Zeichen. \
- \n\nInnerhalb dieses Textes kann per Maus und \
- \nTastatur gescrollt werden." ,
-
- /* 3 */
- "Man konnte mit malloc nicht genug Speicher \
- \nfuer die Struktur apstructText besorgen. \
- \n\nDas Programm terminiert deshalb. \
- \n\nDer Text hatte eine Laenge von %d Zeichen."
- };
-
-
-
- /*------- Start der main-Funktion -----------------*/
- /* */
- /* - initialisiert und terminiert */
- /* - enthaelt Message-Loop */
- /* */
- /* - globale Variable: */
- /* definiert: hab. */
- /* referiert: hwndFrame. */
- /* - ruft: WndCreate() */
- /* */
- /*---------------------------------------------------*/
- int cdecl main ( VOID )
- {
- HMQ hmq; // Handle fuer die Message-Queue
- QMSG qmsg; // Message in der Message-Queue
-
- hab = WinInitialize( 0 ); // 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. */
- /* */
- /* - globale Variable: */
- /* definiert: hwndClient, hwndFrame. */
- /* referiert: hab, szClientClass, hwndFrame. */
- /* - aufgerufen von: main() */
- /* - Return: - TRUE, wenn alles klappt */
- /* - FALSE, wenn etwas schiefging. */
- /* Dann bricht main() ab. */
- /*---------------------------------------------------*/
- BOOL WndCreate( VOID )
- {
- static CHAR szTitleBar [40] ;
- ULONG flCreateFrame; // Flaggen fuer die Erzeugung
- // der Frame-Controls
-
- // usrc = Stringlaenge ohne ASCII-Null..............
- // = 0, wenn Fehler auftaucht !
- usrc = WinLoadString ( hab,
- (HMODULE)NULL,
- IDS_TITLE,
- sizeof (szTitleBar),
- (PSZ)szTitleBar) ;
- if ( usrc == 0 ) return FALSE;
-
- // usrc = Stringlaenge ohne ASCII-Null..............
- // = 0, wenn Fehler auftaucht !
- usrc = WinLoadString ( hab,
- (HMODULE)NULL,
- IDS_FILE,
- sizeof (szQuelldatei),
- (PSZ)szQuelldatei ) ;
- if ( usrc == 0 ) return FALSE;
-
-
- // 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;
-
- // Standardfenster erzeugen: mit Actionbar und mit
- // Akzeleratortabelle, aber ohne Scrollbars wie in
- // SCROLL2.c (dort existieren die Scrollbars immer)
- 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
- szTitleBar, // Titel-Erweiterung
- 0L, // Style des Client-Fensters
- (HMODULE)NULL,// Resourcen sind in EXE-Datei
- ID_RESOURCE, // Bezeichner fuer Resourcen
- (PHWND)&hwndClient // Zeiger auf den Handle
- // des Client-Fensters
- );
-
- // wenn 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 */
- /* - 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_CREATE: SaveLineInfo, AusgabeBox, */
- /* GetOS2Version */
- /* 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 aktuellen Fonts
- static HWND hwndVScroll; // Handle fuer den
- // vertikalen Scrollbar
- static HWND hwndHScroll; // Handle fuer den
- // horizontalen Scrollbar
- SHORT sVDelta, // durch WM_VSCROLL und
- sHDelta; // WM_HSCROLL vorgesehene
- // Aenderung von sVPos
- // und sHPos
-
- SEL selResource ; // static, wenn man die
- // Resource in WM_DESTROY
- // explizit zerstoert.
- PCHAR pText ;
- PCHAR pTextLauf, pTextAnfang ;
- SHORT sLineLength;
- static SHORT sNumLines = 0;
- static SHORT sLineNo = 0;
- static int firstWM_SIZE = 1;
-
- USHORT usVKey; // Komponente der WM_CHAR-Message
- USHORT command; // Command-Wert bei WM_COMMAND =
- // ID des gewaehlten Menueeintrags
-
-
- switch( msg )
- {
-
- case WM_CREATE:
- /***********************************************/
- /* - laedt die Textresourcen: */
- /* ist das nicht moeglich, wird das */
- /* Programm abgebrochen! */
- /* - speichert die Textwerte: */
- /* Gesamtgroesse und Anfangsadresse in */
- /* ulSegSize und pResource, */
- /* Zeilennummer, Zeilenlaenge und den Zeiger */
- /* auf den Zeilenanfang in apstructText. */
- /* - bestimmt die Attribute des aktuellen */
- /* Fonts: die davon benoetigten Teile werden */
- /* in den globalen Variablen cxChar, */
- /* cxCaps, cyChar und cyDesc abgelegt. */
- /***********************************************/
-
- // Laden der Textresource .......................
- // usrc ist 0, wenn successful !
- usrc = DosGetResource ( (HMODULE)NULL,
- IDT_TEXT,
- IDT_GEDICHT,
- &selResource );
- if ( usrc != 0 )
- {
- sprintf( szBoxText, apchFormatTable[0], usrc);
- szBoxTitel = "Programmabbruch";
- AusgabeBox();
-
- return (MRESULT)TRUE;
- }
-
-
- // Bestimme Groesse und Adresse der Resource ....
- usrc = DosSizeSeg (selResource, &ulSegSize) ;
- if ( usrc != 0 )
- return (MRESULT)TRUE;
-
- pResource = MAKEP (selResource, 0) ;
-
-
- // Bestimme die Anzahl der Zeilen in der
- // Textresource-Datei .........................
- // ( 1. Durchlauf ) .........................
- pText = pResource ;
-
- //while ( pText - pResource < (USHORT)ulSegSize )
- while ( pText - pResource < (int)ulSegSize )
- {
- if (*pText == '\r')
- sNumLines ++ ;
-
- pText++ ;
- }
- sTextRows = sNumLines + 1;
-
-
- // Bestimme Zeilennummer, Zeilenlaenge und den
- // Zeiger auf den Zeilenanfang .............
- // ( 2. Durchlauf ) ........................
-
- pTextLauf = pResource ;
- pTextAnfang = pResource ;
- sLineLength = 0 ;
-
- //while (pTextLauf - pResource < (USHORT)ulSegSize)
- while (pTextLauf - pResource < (int)ulSegSize)
- {
- if (*pTextLauf == '\r')
- {
- rc = SaveLineInfo( hwnd,
- sLineNo,
- max( 0, sLineLength-2 ),
- pTextAnfang );
- if ( rc == -1 )
- return (MRESULT)TRUE;
-
- sLineNo ++ ;
- pTextAnfang = pTextLauf + 2;
-
- sLineLength = 0 ;
- }
-
- pTextLauf++ ;
- sLineLength ++ ;
- }
-
- rc = SaveLineInfo( hwnd,
- sLineNo,
- max( 0, sLineLength-2 ),
- pTextAnfang );
- if ( rc == -1 )
- return (MRESULT)TRUE;
-
-
- // Bestimme Fontinformationen...................
- hps = WinGetPS( HWND_DESKTOP );
- brc = GpiQueryFontMetrics( hps,
- (LONG)sizeof( fm ),
- &fm );
- WinReleasePS( hps );
-
- cxChar = (SHORT) fm.lAveCharWidth;
- cxCaps = (SHORT) fm.lEmInc;
- cyChar = (SHORT) fm.lMaxBaselineExt;
- cyDesc = (SHORT) fm.lMaxDescender;
-
-
-
- // Bestimme die OS/2-Version....................
- brc = GetOS2Version ();
- if (!brc) return (MRESULT)TRUE;
-
- // Kann der Scrollbar-Slider in dieser Version
- // von OS/2 seine Groesse veraendern?
- bSliderResizable = ( usMajorVersion >= 10 &&
- usMinorVersion >= 20 )
- ||
- ( usMajorVersion >= 20 );
-
- return 0;
-
-
- case WM_SIZE:
- /***********************************************/
- /* - bestimmt die Ausdehnung des Client */
- /* - bestimmt fuer den vertikalen Scrollbar */
- /* sVEnd und sVPos in Abhaengigkeit von */
- /* der Client-Hoehe und der Font-Groesse. */
- /* - Analog wird beim horizontalen Scrollbar */
- /* vorgegangen. */
- /* - Damit werden die Slider-Position und */
- /* der Slider-Bereich festgelegt. */
- /* - Wenn der Text nicht in den Client passt, */
- /* wird ein Scrollbar erzeugt. */
- /* Ist ein Scrollbar vorhanden und der Text */
- /* passt nach der Groessenaenderung in das */
- /* Fenster, wird der Scrollbar zerstoert. */
- /* Dieses Vorgehen ersetzt das Dis/Enablen. */
- /***********************************************/
- cxClient = SHORT1FROMMP (mp2) ;
- cyClient = SHORT2FROMMP (mp2) ;
-
- // bestimme hwndFrame, wenn WM_SIZE das erstemal
- // vom Client verarbeitet wird ..................
- if ( firstWM_SIZE )
- {
- hwndFrame = WinQueryWindow( hwnd,
- QW_PARENT,
- FALSE );
- firstWM_SIZE = 0;
- }
-
-
- // Auswirkung auf den senkrechten Scrollbar:
- // bVScroll ist TRUE, wenn der Scroll existiert.
- // ..............................................
- {
- SHORT sStyleF = FCF_VERTSCROLL; // Style des
- // Frame
- ULONG lStyleScroll; // Style des zu erzeugenden
- // Scrollbars
-
- sVEnd = max ( sVStart,
- sTextRows - cyClient / cyChar
- + sVStart) ;
- sVPos = min ( sVPos, sVEnd );
-
- hwndVScroll = WinWindowFromID(hwndFrame,
- FID_VERTSCROLL);
- bVScroll = WinIsWindow( hab, hwndVScroll );
-
- // Erzeugen eines senkrechten Scrollbars,
- // falls dieser noch nicht existiert und
- // falls der Text laenger als das Fenster ist
- if ( sVEnd-sVStart > 0 && !bVScroll )
- {
- if (bSliderResizable)
- lStyleScroll = SBS_VERT | SBS_THUMBSIZE;
- else
- lStyleScroll = SBS_VERT;
-
- hwndVScroll = WinCreateWindow(
- hwndFrame,
- WC_SCROLLBAR,
- NULL,
- lStyleScroll,
- 0, 0, 0, 0,
- hwndFrame,
- HWND_TOP,
- FID_VERTSCROLL,
- NULL,
- NULL );
-
- bVScroll = WinIsWindow( hab, hwndVScroll );
-
- if ( bVScroll )
- brc = (BOOL) SHORT1FROMMR (
- WinSendMsg( hwndFrame,
- WM_UPDATEFRAME,
- MPFROMSHORT( sStyleF ),
- (MPARAM)0L )
- );
- }
-
- // Loeschen eines senkrechten Scrollbars,
- // falls dieser existiert und falls der Text
- // der Laenge nach ganz(!) in das Fenster
- // passt ....................................
- else if ( sVEnd-sVStart == 0 && bVScroll )
- {
- brc = WinDestroyWindow( hwndVScroll );
-
- bVScroll = WinIsWindow( hab, hwndVScroll );
-
- if ( !bVScroll )
- {
- hwndVScroll = 0L; // noetig, da als static
- // in WM_VSCROLL benutzt
-
- brc = (BOOL) SHORT1FROMMR (
- WinSendMsg( hwndFrame,
- WM_UPDATEFRAME,
- MPFROMSHORT( sStyleF ),
- (MPARAM)0L )
- );
- }
- }
-
- if ( bVScroll )
- {
- // Setze Scrollbereich und Position..........
- WinSendMsg( hwndVScroll,
- SBM_SETSCROLLBAR,
- MPFROMSHORT( sVPos ),
- MPFROM2SHORT( sVStart, sVEnd ) );
-
- // Setze Slidergroesse.......................
- if (bSliderResizable)
- WinSendMsg (hwndVScroll,
- SBM_SETTHUMBSIZE,
- MPFROM2SHORT( cyClient/cyChar,
- sTextRows ),
- 0L);
- }
-
- } // Ende senkrechter Scrollbar
-
-
- // Auswirkung auf den waagrechten Scrollbar:
- // bHScroll ist TRUE, wenn der Scroll existiert.
- // ..............................................
- {
- SHORT sStyleF = FCF_HORZSCROLL; // Style des
- // Frame
- ULONG lStyleScroll; // Style des zu erzeugenden
- // Scrollbars
-
- if ( bPixelweise )
- {
- sHEnd = max ( sHStart,
- sTextCols
- - cxClient
- + sHStart
- + EINRUECKUNG * cxCaps );
- }
- else
- {
- sHEnd = max ( sHStart,
- sTextCols - (cxClient/cxCaps)
- + sHStart
- + EINRUECKUNG );
- }
- sHPos = min ( sHPos, sHEnd );
-
- hwndHScroll = WinWindowFromID( hwndFrame,
- FID_HORZSCROLL );
- bHScroll = WinIsWindow( hab, hwndHScroll );
-
- // Erzeugen eines waagrechten Scrollbars, falls
- // dieser noch nicht existiert und falls der
- // Text breiter als das Fenster ist ........
- if ( sHEnd-sHStart > 0 && !bHScroll )
- {
- if (bSliderResizable)
- lStyleScroll = SBS_HORZ | SBS_THUMBSIZE;
- else
- lStyleScroll = SBS_HORZ;
-
- hwndHScroll = WinCreateWindow(
- hwndFrame,
- WC_SCROLLBAR,
- NULL,
- lStyleScroll,
- 0, 0, 0, 0,
- hwndFrame,
- HWND_TOP,
- FID_HORZSCROLL,
- NULL,
- NULL );
-
- bHScroll = WinIsWindow( hab, hwndHScroll );
-
- if ( bHScroll )
- brc = (BOOL) SHORT1FROMMR (
- WinSendMsg( hwndFrame,
- WM_UPDATEFRAME,
- MPFROMSHORT( sStyleF ),
- (MPARAM)0L )
- );
- }
-
- // Loeschen eines waagrechten Scrollbars, falls
- // dieser existiert und falls der Text der
- // Breite nach ganz(!) in das Fenster passt
- else if ( sHEnd-sHStart == 0 && bHScroll )
- {
- brc = WinDestroyWindow( hwndHScroll );
-
- bHScroll = WinIsWindow( hab, hwndHScroll );
-
- if ( !bHScroll )
- {
- hwndHScroll = 0L; // noetig, da als static
- // in WM_HSCROLL benutzt
-
- brc = (BOOL) SHORT1FROMMR (
- WinSendMsg( hwndFrame,
- WM_UPDATEFRAME,
- MPFROMSHORT( sStyleF ),
- (MPARAM)0L )
- );
- }
- }
-
- if ( bHScroll )
- {
- // Setze Scrollbereich und Position..........
- WinSendMsg( hwndHScroll,
- SBM_SETSCROLLBAR,
- MPFROMSHORT( sHPos ),
- MPFROM2SHORT( sHStart, sHEnd ) );
-
- // Setze Slidergroesse.......................
- if (bSliderResizable)
- {
- USHORT usFensterbreite;
-
- if ( bPixelweise )
- {
- usFensterbreite = cxClient;
- }
- else
- {
- usFensterbreite = cxClient/cxCaps;
- }
-
- WinSendMsg (hwndHScroll,
- SBM_SETTHUMBSIZE,
- MPFROM2SHORT (usFensterbreite,
- sTextCols),
- 0L);
- }
- }
-
- } // Ende waagrechter Scrollbar
-
- 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;
- switch ( usVKey )
- {
- case VK_UP:
- case VK_DOWN:
- case VK_PAGEUP:
- case VK_PAGEDOWN:
- if ( WinIsWindow( hab, hwndVScroll ) )
- {
- return WinSendMsg( hwndVScroll,
- msg,
- mp1,
- mp2 );
- }
- break;
- case VK_LEFT:
- case VK_RIGHT:
- if ( WinIsWindow( hab, hwndHScroll ) )
- {
- return WinSendMsg( hwndHScroll,
- msg,
- mp1,
- mp2 );
- }
- break;
- }
- 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 und der geladene Text kurz */
- /* beschrieben. */
- /***********************************************/
-
- command = COMMANDMSG(&msg)->cmd;
-
- switch( command )
- {
- case IDM_ABOUT:
- if ( bPixelweise )
- {
- sprintf( szBoxText, apchFormatTable[1],
- szQuelldatei, sTextRows,
- sLongestRow, sTextCols);
- }
- else
- {
- sprintf( szBoxText, apchFormatTable[2],
- szQuelldatei, sTextRows,
- sLongestRow, sTextCols);
- }
- szBoxTitel = "Programminformation";
- 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: dann wird der */
- /* Text entsprechend dem neuen sVPos im */
- /* Client neu gezeichnet. */
- /***********************************************/
- switch( SHORT2FROMMP(mp2) )
- {
- case SB_LINEUP:
- sVDelta = -1;
- break;
- case SB_PAGEUP:
- sVDelta = - cyClient / cyChar;
- break;
- case SB_LINEDOWN:
- sVDelta = 1;
- break;
- case SB_PAGEDOWN:
- sVDelta = cyClient / cyChar;
- break;
- case SB_SLIDERTRACK:
- sVDelta = SHORT1FROMMP(mp2) - sVPos;
- break;
- default:
- return (MRESULT)0;
- }
-
- // es gilt: sVStart <= sVPos+sVDelta <= sVEnd
- if ( sVPos+sVDelta < sVStart )
- sVDelta = sVStart - sVPos;
- else if ( sVPos+sVDelta > sVEnd )
- sVDelta = sVEnd - sVPos;
-
- if ( sVDelta != 0 )
- {
- sVPos += sVDelta;
- src = WinScrollWindow( hwnd,
- 0,
- cyChar * sVDelta,
- NULL, NULL, NULL, NULL,
- SW_INVALIDATERGN );
- WinSendMsg( hwndVScroll,
- SBM_SETPOS,
- MPFROMSHORT( sVPos ),
- MPFROMSHORT( 0 ) );
-
- brc = WinUpdateWindow( hwnd );
- }
-
- 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: dann wird der */
- /* Text entsprechend dem neuen sHPos im */
- /* Client neu gezeichnet. */
- /***********************************************/
- switch( SHORT2FROMMP(mp2) )
- {
- case SB_LINELEFT:
- sHDelta = -1;
- break;
- case SB_PAGELEFT:
- if ( bPixelweise )
- {
- sHDelta = -cxClient;
- }
- else
- {
- sHDelta = - cxClient / cxCaps;
- }
- break;
- case SB_LINERIGHT:
- sHDelta = 1;
- break;
- case SB_PAGERIGHT:
- if ( bPixelweise )
- {
- sHDelta = cxClient;
- }
- else
- {
- sHDelta = cxClient / cxCaps;
- }
- break;
- case SB_SLIDERPOSITION:
- sHDelta = SHORT1FROMMP(mp2) - sHPos;
- break;
- default:
- return (MRESULT)0;
- }
-
- // es gilt: sHStart <= sHPos+sHDelta <= sHEnd
- if ( sHPos+sHDelta < sHStart )
- sHDelta = sHStart - sHPos;
- else if ( sHPos+sHDelta > sHEnd )
- sHDelta = sHEnd - sHPos;
-
- if ( sHDelta != 0 )
- {
- sHPos += sHDelta;
-
- if ( bPixelweise )
- {
- src = WinScrollWindow( hwnd,
- - sHDelta,
- 0,
- NULL, NULL,
- NULL, NULL,
- SW_INVALIDATERGN );
- }
- else
- {
- src = WinScrollWindow( hwnd,
- - sHDelta * cxCaps,
- 0,
- NULL, NULL,
- NULL, NULL,
- SW_INVALIDATERGN );
- }
-
- WinSendMsg( hwndHScroll,
- SBM_SETPOS,
- MPFROMSHORT( sHPos ),
- MPFROMSHORT( 0 ) );
-
- brc = WinUpdateWindow( hwnd );
- }
-
- 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 den Text aus der */
- /* Textresource-Datei in den Client-Bereich. */
- /* */
- /* - 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;
-
- // Erzeuge einen Presentation Space..................
- hps = WinBeginPaint( hwnd, NULL, &rectl );
-
- brc = GpiErase( hps );
-
- sVPaintBeg = sVPos +
- (cyClient-(SHORT)rectl.yTop) / cyChar;
- sVPaintEnd = min ( sTextRows - 1,
- sVPos +
- (cyClient-(SHORT)rectl.yBottom)
- / cyChar
- );
-
- for ( i = sVPaintBeg; i <= sVPaintEnd; i++ )
- {
- if ( bPixelweise )
- {
- ptl.x = EINRUECKUNG * cxCaps - sHPos;
- }
- else
- {
- ptl.x = ( EINRUECKUNG - sHPos ) * cxCaps;
- }
- ptl.y = cyClient - (i + 1 - sVPos) * cyChar
- + cyDesc;
-
- GpiCharStringAt( hps,
- &ptl,
- (LONG)(apstructText+i)->sLineLength,
- (apstructText+i)->pTextplace
- );
- }
-
- brc = WinEndPaint( hps ); // Paint ist erledigt
-
- }
- /*---------- Ende der PaintWin-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: */
- /* ClientWindowProc ( Programm-Information ), */
- /* SaveLineInfo */
- /*---------------------------------------------------*/
- VOID AusgabeBox ( VOID )
- {
- WinMessageBox ( HWND_DESKTOP,
- hwndClient,
- (PSZ) szBoxText,
- (PSZ) szBoxTitel, // Titel
- (USHORT)NULL,
- MB_MOVEABLE
- );
- }
- /*------- Ende der AusgabeBox-Funktion -------------*/
-
-
-
-
-
-
-
-
- /*-------- Start der FrageBox-Funktion -------------*/
- /* */
- /* - Stellt in einer beweglichen, applikationsmodalen*/
- /* Messagebox die Frage, ob in horizontaler */
- /* Richtung pixelweise gescrollt werden soll. */
- /* Die Antwort "YES" ist der Standardfall, weil */
- /* dann alles sauber ohne Rundungsfehler laeuft! */
- /* */
- /* - globale Variable: */
- /* definiert: szBoxTitel, szBoxText */
- /* referiert: szBoxTitel, szBoxText */
- /* */
- /* - aufgerufen von: */
- /* SaveLineInfo */
- /*---------------------------------------------------*/
- BOOL FrageBox ( VOID )
- {
- szBoxTitel = "Wie soll horizontal gescrollt werden?";
- strcpy( szBoxText, "Wenn Sie horizontal pixelweise \
- \nscrollen moechten, \
- \nwaehlen Sie bitte \"YES\" :");
-
- usrc = WinMessageBox ( HWND_DESKTOP,
- hwndClient,
- (PSZ) szBoxText,
- (PSZ) szBoxTitel,
- (USHORT)NULL,
- MB_MOVEABLE | MB_YESNO
- );
- if ( usrc == MBID_YES ) return TRUE;
- else return FALSE;
- }
- /*--------- Ende der FrageBox-Funktion -------------*/
-
-
-
-
-
- /*-------- Start der SaveLineInfo-Funktion --------*/
- /* */
- /* - fuellt die apstructText-Struktur mit den */
- /* Informationen zu jeder Zeile, die beim Lesen */
- /* der Textresource gefunden wird. */
- /* - die globale Variable sTextRows wird nur initial */
- /* zum Beschaffen von Speicherplatz benoetigt. */
- /* */
- /* - Formalparameter: */
- /* hwnd Handle des Clientfensters */
- /* sLineNo Zeilennummer */
- /* sLineLength Zeilenlaenge */
- /* pText Zeiger auf Zeilenanfang */
- /* */
- /* - globale Variable: */
- /* definiert: sTextCols, apstructText, szBoxText, */
- /* szBoxTitel, */
- /* referiert: sTextCols, sTextRows, apstructText, */
- /* apchFormatTable */
- /* */
- /* - aufgerufen von: ClientWindowProc in WM_CREATE */
- /* - ruft: AusgabeBox, */
- /* FrageBox */
- /*---------------------------------------------------*/
- int SaveLineInfo( HWND hwnd,
- SHORT sLineNo,
- SHORT sLineLength,
- PCHAR pText )
- {
- static int initial = 1;
- HPS hps;
- CHAR szTmp[255]; // max. Zeilenlaenge!
- SHORT scx; // Breite der Textbox
- POINTL aptlTextBox[TXTBOX_COUNT];
- // Array von Punkten, die die
- // Eckkoordinaten der TextBox
- // enthalten
-
- if ( initial )
- {
- // erzeuge Speicher fuer ein Array mit sTextRows
- // Elementen der TEXTPOINTER-Struktur............
- apstructText = (TEXTPOINTER *) malloc (
- sTextRows * sizeof(TEXTPOINTER) );
- if ( apstructText == NULL )
- {
- sprintf( szBoxText,
- apchFormatTable[3],
- sTextRows );
- szBoxTitel = "Programmabsturz";
- AusgabeBox();
- return -1;
- }
-
- bPixelweise = FrageBox();
-
- initial = 0;
- }
-
- if ( !bPixelweise )
- {
- if ( sLineLength > sTextCols )
- {
- sTextCols = sLineLength;
- sLongestRow = sLineNo;
- }
- }
- else
- {
- // Casting nur fuer Small-Model noetig, da sonst
- // warnings kommen! ( im Large-Model nicht
- // noetig, aber auch nicht schaedlich)
- memcpy(szTmp, (void *)pText, sLineLength );
- szTmp[sLineLength] = '\0';
-
- hps = WinGetPS( hwnd );
- brc = GpiQueryTextBox ( hps,
- (LONG)sLineLength,
- szTmp,
- TXTBOX_COUNT,
- aptlTextBox );
- WinReleasePS( hps );
-
- scx = (SHORT) (aptlTextBox[TXTBOX_BOTTOMRIGHT].x
- - aptlTextBox[TXTBOX_BOTTOMLEFT].x);
-
- if ( scx > sTextCols )
- {
- sTextCols = scx;
- sLongestRow = sLineNo;
- }
- }
-
-
- // Fuelle das Array anhand der aktuellen Argumente
- (apstructText + sLineNo)->sLineNumber = sLineNo;
- (apstructText + sLineNo)->sLineLength = sLineLength;
- (apstructText + sLineNo)->pTextplace = pText;
-
- return 0;
- }
- /*-------- Ende der SaveLineInfo-Funktion ---------*/
-
-
-
-
-
- /*-------- Start der GetOS2Version-Funktion -------*/
- /* */
- /* - speichert die Haupt- und Unternummer */
- /* der OS/2-Version in die entsprechenden */
- /* globalen Variablen usMinorVersion und */
- /* usMajorVersion. */
- /* - usMajorVersion: = 10: OS/2 1.x */
- /* = 20: OS/2 2.x */
- /* - usMinorVersion: = 10: OS/2 1.1, 2.1, ... */
- /* = 20: OS/2 1.2, 2.1, ... */
- /* */
- /* */
- /* - globale Variable: */
- /* definiert: usMajorVersion, usMinorVersion */
- /* referiert: - */
- /* */
- /* - aufgerufen von: ClientWindowProc in WM_CREATE */
- /* - ruft: - */
- /*---------------------------------------------------*/
- BOOL GetOS2Version ( VOID )
- {
- USHORT usVersion;
-
- usrc = DosGetVersion (&usVersion);
- if (usrc) return FALSE;
-
- usMajorVersion = (USHORT) HIBYTE(usVersion);
- usMinorVersion = (USHORT) LOBYTE(usVersion);
-
- return TRUE;
- }
- /*-------- Ende der GetOS2Version-Funktion --------*/
-
-
- /*----------- Ende SCROLL3-Programm -------------*/
- /*---------------------------------------------------*/