home *** CD-ROM | disk | FTP | other *** search
- /*** Windows Application 4 ***/
- /*** ***/
- /*** WINAPP-4 includes ***/
- /*** (1) WINAPP-4.CPP ***/
- /*** (2) WINAPP-4.DEF ***/
-
- #pragma hdrfile "windows.sym"
- #include <windows.h>
- #pragma hdrstop
-
- #include"winapp-2.h"
-
- #ifndef min
- #define min(a,b) (((a) < (b)) ? (a) : (b))
- #endif
-
- #ifndef max
- #define max(a,b) (((a) > (b)) ? (a) : (b))
- #endif
-
- // Declaration
-
- long FAR PASCAL _export AppWndProc (HWND, WORD, WORD, LONG) ;
-
-
- class Main
- { public:
- static HANDLE hInstance ;
- static HANDLE hPrevInstance ;
- static int nCmdShow ;
-
- static int MessageLoop(void) ;
- } ;
-
- HANDLE Main::hInstance = 0 ;
- HANDLE Main::hPrevInstance = 0 ;
- int Main::nCmdShow = 0 ;
-
- int Main::MessageLoop(void)
- { MSG msg ;
-
- while ( GetMessage(&msg, NULL, 0, 0) )
- { TranslateMessage(&msg) ;
- DispatchMessage(&msg) ;
- }
- return msg.wParam ;
- }
-
-
- ////////// Base Class -> Window
- //////////
- class Window
- { protected:
- HWND hwnd ;
-
- public:
- HWND GetHandle(void) // get the window handle in the class
- { return hwnd ; }
-
- BOOL Show(int nCmdShow)
- { return ShowWindow(hwnd,nCmdShow) ; }
-
- void Update(void)
- { UpdateWindow(hwnd) ; }
-
- virtual long CreateProc(HWND hwnd,
- WORD wParam, LONG lParam) = 0 ;
-
- virtual long AppWndProc(WORD message,
- WORD wParam, LONG lParam) = 0 ;
- } ;
-
-
- ////////// Derived Class -> MainWindow
- //////////
- class MainWindow : public Window
- { private:
- static char szAppName[8] ;
- struct { short int cxChar, cyChar, cxCaps, nMaxX ; } FontSize ;
-
- public :
- static void Register(void) ;
- MainWindow(void) ;
-
- virtual long CreateProc(HWND hwnd,
- WORD wParam, LONG lParam) ;
-
- virtual long AppWndProc(WORD message,
- WORD wParam, LONG lParam) ;
- } ;
-
- char MainWindow::szAppName[] = "WinApp4" ;
-
- void MainWindow::Register(void)
- { WNDCLASS wndclass ;
-
- wndclass.style = CS_HREDRAW | CS_VREDRAW ;
- wndclass.lpfnWndProc = ::AppWndProc ;
- wndclass.cbClsExtra = 0 ;
- wndclass.cbWndExtra = sizeof(MainWindow *) ;
- wndclass.hInstance = Main::hInstance ;
- wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION) ;
- wndclass.hCursor = LoadCursor(NULL,IDC_ARROW) ;
- wndclass.hbrBackground = GetStockObject(WHITE_BRUSH) ;
- wndclass.lpszMenuName = NULL ;
- wndclass.lpszClassName = szAppName ;
-
- RegisterClass(&wndclass) ;
- }
-
- MainWindow::MainWindow(void)
- {
- hwnd = CreateWindow(szAppName, // window class name
- "Windows Application 2", // window caption
- WS_OVERLAPPEDWINDOW |
- WS_VSCROLL |
- WS_HSCROLL , // window style
- CW_USEDEFAULT, // initial x position
- 0, // initial y position
- CW_USEDEFAULT, // initial x length
- 0, // initial y length
- NULL, // parent window handle
- NULL, // window menu handle
- Main::hInstance, // program instance handle
- (LPSTR) this) ; // parameters , different
- // from WINAPP-2
- Show(Main::nCmdShow) ;
- Update() ;
- }
-
-
- // special case
-
- #pragma argsused
- long MainWindow::CreateProc(HWND hwnd,
- WORD wParam, LONG lParam)
- { HDC hdc ;
- TEXTMETRIC tm ;
-
- hdc = GetDC(hwnd) ;
-
- GetTextMetrics(hdc,&tm) ;
- FontSize.cxChar = tm.tmAveCharWidth ;
- FontSize.cyChar = tm.tmHeight + tm.tmExternalLeading ;
- FontSize.cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) *
- FontSize.cxChar / 2 ;
-
- ReleaseDC(hwnd,hdc) ;
-
- FontSize.nMaxX = 20 * FontSize.cxCaps + 45 * FontSize.cxChar ;
-
- return 0L ;
- }
-
-
- long MainWindow::AppWndProc(WORD message,
- WORD wParam, LONG lParam)
- { HDC hdc ;
- PAINTSTRUCT ps ;
-
- static short int cxClient, cyClient ;
- static short int nVScrollMax, nVScrollPos ;
- static short int nHScrollMax, nHScrollPos ;
-
- short int nVScrollInc, nHScrollInc ;
- short int nBeginLine, nEndLine ;
- short int i,x,y ;
-
- switch (message)
- { case WM_SIZE :
- cxClient = LOWORD(lParam) ;
- cyClient = HIWORD(lParam) ;
-
- nVScrollMax = max(0, NUMLINE+2-cyClient/FontSize.cyChar) ;
- nVScrollPos = min(nVScrollMax,nVScrollPos) ;
- SetScrollRange(hwnd, SB_VERT, 0, nVScrollMax, FALSE) ;
- SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE) ;
-
- nHScrollMax = max( 0,(FontSize.nMaxX-cxClient)/
- FontSize.cxChar+2) ;
- nHScrollPos = min(nHScrollMax,nHScrollPos) ;
- SetScrollRange(hwnd, SB_HORZ, 0, nHScrollMax, FALSE) ;
- SetScrollPos(hwnd, SB_HORZ, nHScrollPos, TRUE) ;
-
- break ;
-
-
- case WM_VSCROLL :
- switch (wParam)
- { case SB_TOP :
- nVScrollInc = -nVScrollPos ;
- break ;
-
- case SB_BOTTOM :
- nVScrollInc = nVScrollMax-nVScrollPos ;
- break ;
-
- case SB_LINEUP :
- nVScrollInc = -1 ;
- break ;
-
- case SB_LINEDOWN :
- nVScrollInc = 1 ;
- break ;
-
- case SB_PAGEUP :
- nVScrollInc = min(-1,-cyClient/FontSize.cyChar) ;
- break ;
-
- case SB_PAGEDOWN :
- nVScrollInc = max(1,cyClient/FontSize.cyChar) ;
- break ;
-
- case SB_THUMBTRACK :
- nVScrollInc = LOWORD(lParam)-nVScrollPos ;
- break ;
-
- default :
- nVScrollInc = 0 ;
- break ;
- }
-
- nVScrollInc = min(nVScrollInc ,nVScrollMax-nVScrollPos) ;
- nVScrollInc = max(nVScrollInc ,-nVScrollPos) ;
-
- if (nVScrollInc)
- { nVScrollPos += nVScrollInc ;
- ScrollWindow(hwnd, 0, -FontSize.cyChar*nVScrollInc,
- NULL, NULL) ;
- SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE) ;
- UpdateWindow(hwnd) ;
- }
- break ;
-
-
- case WM_HSCROLL :
- switch (wParam)
- { case SB_TOP :
- nHScrollInc = -nHScrollPos ;
- break ;
-
- case SB_BOTTOM :
- nHScrollInc = nHScrollMax-nHScrollPos ;
- break ;
-
- case SB_LINEUP :
- nHScrollInc = -1 ;
- break ;
-
- case SB_LINEDOWN :
- nHScrollInc = 1 ;
- break ;
-
- case SB_PAGEUP :
- nHScrollInc = min(-1,-cxClient/FontSize.cxChar) ;
- break ;
-
- case SB_PAGEDOWN :
- nHScrollInc = max(1,cxClient/FontSize.cxChar) ;
- break ;
-
- case SB_THUMBTRACK :
- nHScrollInc = LOWORD(lParam)-nHScrollPos ;
- break ;
-
- default :
- nHScrollInc = 0 ;
- break ;
- }
-
- nHScrollInc = min(nHScrollInc ,nHScrollMax-nHScrollPos) ;
- nHScrollInc = max(nHScrollInc ,-nHScrollPos) ;
-
- if (nHScrollInc)
- { nHScrollPos += nHScrollInc ;
- ScrollWindow(hwnd, -FontSize.cxChar*nHScrollInc, 0,
- NULL, NULL) ;
- SetScrollPos(hwnd, SB_HORZ, nHScrollPos, TRUE) ;
- UpdateWindow(hwnd) ;
- }
- break ;
-
-
- case WM_PAINT :
- hdc = BeginPaint(hwnd, &ps) ;
-
- nBeginLine = max(0, nVScrollPos +
- ps.rcPaint.top/FontSize.cyChar - 1) ;
- nEndLine = min(NUMLINE, nVScrollPos + ps.rcPaint.bottom /
- FontSize.cyChar) ;
-
- for (i=nBeginLine ; i<nEndLine ; i++)
- { x = FontSize.cxChar * (1-nHScrollPos) ;
- y = FontSize.cyChar * (1-nVScrollPos+i) ;
-
- TextOut(hdc, x, y,
- WinStruct[i].szStruct,
- lstrlen(WinStruct[i].szStruct)) ;
-
- TextOut(hdc, x+20*FontSize.cxCaps, y,
- WinStruct[i].szDescriptor,
- lstrlen(WinStruct[i].szDescriptor)) ;
- }
-
- EndPaint(hwnd, &ps) ;
- break ;
-
-
- case WM_DESTROY :
- PostQuitMessage(0) ;
- break ;
-
-
- default :
- return DefWindowProc(hwnd, message, wParam, lParam) ;
- }
-
- return 0L ;
- }
-
-
- #if defined(__SMALL__) || defined(__MEDIUM__)
- inline Window *GetPointer( HWND hWnd )
- {
- return (Window *) GetWindowWord( hWnd, 0 );
- }
- inline void SetPointer( HWND hWnd, Window *pWindow )
- {
- SetWindowWord( hWnd, 0, (WORD) pWindow );
- }
-
- // else pointers are far
- #elif defined(__LARGE__) || defined(__COMPACT__)
- inline Window *GetPointer( HWND hWnd )
- {
- return (Window *) GetWindowLong( hWnd, 0 );
- }
- inline void SetPointer( HWND hWnd, Window *pWindow )
- {
- SetWindowLong( hWnd, 0, (LONG) pWindow );
- }
-
- #else
- #error Choose another memory model!
- #endif
-
-
- long FAR PASCAL _export AppWndProc (HWND hwnd, WORD message,
- WORD wParam, LONG lParam)
- { Window *pWindow = GetPointer( hwnd );
-
- if ( pWindow == 0 )
- { if ( message == WM_CREATE )
- { LPCREATESTRUCT lpcs;
-
- lpcs = (LPCREATESTRUCT) lParam;
- pWindow = (Window *) lpcs->lpCreateParams;
-
- SetPointer(hwnd,pWindow);
-
- return pWindow->CreateProc(hwnd, wParam, lParam);
- }
- else return DefWindowProc(hwnd, message, wParam, lParam);
- }
- else return pWindow->AppWndProc(message, wParam, lParam);
- }
-
-
-
- // Turn off warning: Parameter 'lpszCmdLine' is never used ...
- #pragma argsused
-
- // Turn off warning: 'mainwindow' is assigned a value that is never ...
- #pragma option -w-aus
-
-
- int PASCAL WinMain(HANDLE hInstance,
- HANDLE hPrevInstance,
- LPSTR lpszCmdLine,
- int nCmdShow)
- { Main::hInstance = hInstance ;
- Main::hPrevInstance = hPrevInstance ;
- Main::nCmdShow = nCmdShow ;
-
- if (! Main::hPrevInstance) MainWindow::Register() ;
-
- MainWindow mainwindow ;
-
- return Main::MessageLoop() ;
- }
-