home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 December / PCWorld_1998-12_cd.iso / software / sybase / ASA / asa60.exe / data1.cab / cxmp_files / mainwin.c < prev    next >
C/C++ Source or Header  |  1998-07-27  |  9KB  |  366 lines

  1. /* MAINWIN.C    Windows specific routines for all example programs
  2. */
  3.         
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdarg.h>
  8. #ifdef __WATCOMC__
  9.     #include <malloc.h>
  10.     #include <conio.h>
  11. #else /* LATTICE */
  12.     #include <dos.h>
  13. #endif
  14. #include <windows.h>
  15. #include "example.h"
  16. #include "ntsvc.h"
  17.  
  18. long FAR _exportkwd PASCAL MainWndProc( HWND, unsigned, unsigned, long );
  19.  
  20. static HANDLE           hInst;
  21. static HWND             hWnd;
  22. static int              yText;
  23. static int              CharHeight;
  24. static int              CharWidth;
  25. static BOOL             WindowCreated = FALSE;
  26. extern int        StartedDB;
  27. static LPSTR        Prompt;
  28. static LPSTR            PromptString;
  29. static int              StringLen;
  30. int              PageSize = 2;
  31.  
  32. int PASCAL do_main( HANDLE hInstance, HANDLE hPrevInstance,
  33.             LPSTR lpCmdLine, int nCmdShow );
  34.  
  35. extern int Displaytext( int col, char *fmt, ... )
  36. /***********************************************/
  37. {
  38.     RECT                hWndRect;
  39.     int                 x;
  40.     int            len;
  41.     va_list             arg_ptr;
  42.     char                buffer[ 200 ];
  43.     HDC                 hDC;
  44.  
  45.     va_start( arg_ptr, fmt );
  46.     vsprintf( buffer, fmt, arg_ptr );
  47.     va_end( arg_ptr );
  48.     
  49.     if( SvcIsService() ) {
  50.     SvcGenerateLog( buffer, EVENTLOG_AUDIT_SUCCESS );
  51.     }
  52.     if( hWnd != (HWND) NULL ) {
  53.     len = strlen( buffer );
  54.     if( buffer[len - 1] == '\n' ) {
  55.         if( col == 0 && len == 1 ) return FALSE;
  56.         buffer[len - 1] = '\0';
  57.     }
  58.     hDC = GetDC( hWnd );
  59.     GetClientRect( hWnd, &hWndRect );
  60.     x = col * CharWidth;
  61.     if( x == 0 ) {
  62.     if( yText + CharHeight > hWndRect.bottom - CharHeight ) {
  63.         ScrollWindow( hWnd, 0, -CharHeight, NULL, NULL );
  64.         UpdateWindow( hWnd );
  65.         } else {
  66.         yText += CharHeight;
  67.         }
  68.     }
  69.     OemToAnsi( buffer, buffer );
  70.     TextOut( hDC, x, yText, buffer, strlen( buffer ) );
  71.     ReleaseDC( hWnd, hDC );
  72.     }
  73.     return( TRUE );
  74. }
  75.  
  76. BOOL FAR _exportkwd PASCAL get_string_rtn( HWND hDlg, unsigned message,
  77.                       unsigned wParam, long lParam )
  78. /*********************************************************************/
  79. {
  80.     lParam = lParam;
  81.  
  82.     switch( message ) {
  83.     case WM_INITDIALOG:
  84.     SetWindowText( hDlg, (LPSTR) Prompt );
  85.         return( TRUE );
  86.  
  87.     case WM_COMMAND:
  88.     switch( LOWORD( wParam ) ) {
  89.     case IDOK:
  90.         GetDlgItemText( hDlg, IDE_STRING_EDIT,
  91.             (LPSTR) PromptString, StringLen );
  92.         /* Fall through */
  93.     case IDCANCEL:
  94.         EndDialog( hDlg, TRUE );
  95.     }
  96.     }
  97.     return( FALSE );
  98. }
  99.  
  100. static void prompt_for_string( LPSTR prompt, LPSTR buff, int len )
  101. /****************************************************************/
  102. {
  103.     FARPROC             proc;
  104.  
  105.     buff[0] = '\0';
  106.     Prompt = prompt;
  107.     PromptString = buff;
  108.     StringLen = len;
  109.     proc = MakeProcInstance( (FARPROC)get_string_rtn, hInst );
  110.     DialogBox( hInst, "DLG_PROMPT_STRING", hWnd, proc );
  111.     FreeProcInstance( proc );
  112. }
  113.  
  114. extern void GetValue( char *prompt, char *buff, int len)
  115. /******************************************************/
  116. {
  117.     if( SvcGUIActive() ) {
  118.         prompt_for_string( (LPSTR) prompt, (LPSTR) buff, len );
  119.     } else {
  120.     strcpy( buff, "" );
  121.     }
  122. }
  123.  
  124. extern void GetTableName( char *buff, int len)
  125. /********************************************/
  126. {
  127.     GetValue( (char *) "Enter table name", (char *) buff, len );
  128.     if( strlen( buff ) == 0 ) {
  129.     strcpy( buff, "employee" );
  130.     }
  131. }
  132.  
  133. BOOL InitApplication( HANDLE hInstance )
  134. /**************************************/
  135. {
  136.     WNDCLASS            wc;
  137.  
  138.     wc.style = 0;
  139.     #ifdef __TURBOC__
  140.     wc.lpfnWndProc = MainWndProc;
  141.     #else
  142.     wc.lpfnWndProc = (WNDPROC) MainWndProc;
  143.     #endif
  144.     wc.cbClsExtra = 0;
  145.     wc.cbWndExtra = 0;
  146.     wc.hInstance = hInstance;
  147.     wc.hIcon = LoadIcon( 0, IDI_APPLICATION );
  148.     wc.hCursor = LoadCursor( 0, IDC_ARROW );
  149.     wc.hbrBackground = GetStockObject( WHITE_BRUSH );
  150.     wc.lpszMenuName = "ExampleMenu";
  151.     wc.lpszClassName = "ExampleWClass";
  152.     return( RegisterClass( &wc ) );
  153. }
  154.  
  155. BOOL InitInstance( HANDLE hInstance, int nCmdShow )
  156. /*************************************************/
  157. {
  158.     hInst = hInstance;
  159.     hWnd = CreateWindow( "ExampleWClass", "Example", WS_OVERLAPPEDWINDOW,
  160.              170, 50, 350, 300, 0, 0, hInstance, 0 );
  161.     if( !hWnd ) {
  162.     return( FALSE );
  163.     }
  164.     ShowWindow( hWnd, nCmdShow );
  165.     UpdateWindow( hWnd );
  166.     return( TRUE );
  167. }
  168.  
  169. extern void Display_systemerror( char *message )
  170. /**********************************************/
  171. {
  172.     MessageBox( hWnd, message, "System Error", MB_OK );
  173. }
  174.  
  175. extern void Display_refresh( void )
  176. /*********************************/
  177. {
  178.     UpdateWindow( hWnd );
  179. }
  180.  
  181. int sv_start_service( HANDLE hInstance, HANDLE hPrevInstance,
  182.             char * lpCmdLine, int nCmdShow )
  183. /***********************************************************/
  184. {
  185.     int        retcode;
  186.  
  187.     if( SvcIsService() ) {
  188.     SvcSetRunning();
  189.     }
  190.     retcode = do_main( hInstance, hPrevInstance, lpCmdLine, SW_NORMAL );
  191.     if( SvcIsService() ) {
  192.     SvcSetStopped();
  193.     }
  194.     return( retcode );
  195. }
  196.  
  197. void sv_stop_service( void )
  198. /**************************/
  199. {
  200. }
  201.  
  202. void sv_resume_service( void )
  203. /****************************/
  204. {
  205. }
  206.  
  207. void sv_pause_service( void )
  208. /***************************/
  209. {
  210. }
  211.  
  212. void sv_debug_info( char *str )
  213. /*****************************/
  214. {
  215.     // Displaytext( 0, "%s", str );
  216.     SvcGenerateLog( str, EVENTLOG_INFORMATION_TYPE );
  217. }
  218.  
  219. int PASCAL do_main( HANDLE hInstance, HANDLE hPrevInstance,
  220.             LPSTR lpCmdLine, int nCmdShow )
  221. /*********************************************************/
  222. {
  223.     MSG                 msg;
  224.  
  225.     lpCmdLine = lpCmdLine;
  226.     hInst = hInstance;
  227.     #ifdef NTSERVICE
  228.     if( !SvcGUIActive() ) {
  229.         // If service is not able to start window, print one
  230.         // screen full to application event log to demonstrate
  231.         // that it is running.
  232.         if( !WSQLEX_Init() ) {
  233.         SvcGenerateLog( "unable to Init example", 1 );
  234.         return( FALSE );
  235.         }
  236.         sv_debug_info( "printing data..." );
  237.         WSQLEX_Process_Command( 'p' );
  238.         sv_debug_info( "shutting down..." );
  239.         WSQLEX_Finish();
  240.         return( TRUE );
  241.     }
  242.     #endif
  243.     if( !hPrevInstance ) {
  244.     if( !InitApplication( hInstance ) ) {
  245.         return( FALSE );
  246.     }
  247.     }
  248.     sv_debug_info( "initialized application..." );
  249.     if( !InitInstance( hInstance, nCmdShow ) ) {
  250.     SvcGenerateLog( "unable to initialize application", 1 );
  251.     return( FALSE );
  252.     }
  253.     sv_debug_info( "initialized window..." );
  254.     if( !WSQLEX_Init() ) {
  255.     SvcGenerateLog( "unable to Init example", 1 );
  256.     return( FALSE );
  257.     }
  258.     sv_debug_info( "WSQLEX_Init successful..." );
  259.     Displaytext( 0, "==>" );
  260.     while( GetMessage( &msg, 0, 0, 0 ) ) {
  261.     TranslateMessage( &msg );
  262.     DispatchMessage( &msg );
  263.     }
  264.     sv_debug_info( "WSQLEX_Init message loop terminated..." );
  265.     return( msg.wParam );
  266. }
  267.  
  268. long FAR _exportkwd PASCAL MainWndProc( HWND hWnd, unsigned message,
  269.                     unsigned wParam, long lParam )
  270. {
  271.     HDC                 hDC;
  272.     TEXTMETRIC          tm;
  273.     PAINTSTRUCT         ps;
  274.  
  275.     switch( message ) {
  276.     case WM_KEYDOWN:
  277.         Displaytext( 5, "%c", wParam );
  278.     if( wParam == 'Q' ) {
  279.         WSQLEX_Finish();
  280.         DestroyWindow( hWnd );
  281.         break;
  282.        }
  283.         WSQLEX_Process_Command( wParam );
  284.         Displaytext( 0, "==>" );
  285.     break;
  286.  
  287.     case WM_CREATE:
  288.     hDC = GetDC( hWnd );
  289.     GetTextMetrics( hDC, &tm );
  290.     CharHeight = tm.tmHeight + tm.tmExternalLeading;
  291.     CharWidth = tm.tmAveCharWidth;
  292.     ReleaseDC( hWnd, hDC );
  293.     break;
  294.  
  295.     case WM_SIZE:
  296.     yText = 0;
  297.     PageSize = HIWORD( lParam ) / CharHeight - 2;
  298.     if( PageSize <= 0 ) {
  299.         PageSize = 1;
  300.     }
  301.     if( WindowCreated ) {
  302.         InvalidateRect( hWnd, NULL, TRUE );
  303.         UpdateWindow( hWnd );
  304.         Displaytext( 0, "==>" );
  305.     } else {
  306.         WindowCreated = TRUE;
  307.     }
  308.     break;
  309.  
  310.     case WM_PAINT:
  311.     BeginPaint( hWnd, &ps );
  312.     EndPaint( hWnd, &ps );
  313.     break;
  314.  
  315.     case WM_COMMAND:
  316.     switch( LOWORD( wParam ) ) {
  317.     case IDM_HELP:
  318.         SendMessage( hWnd, WM_KEYDOWN, 'H', 0 );
  319.         break;
  320.     case IDM_PRINT:
  321.         SendMessage( hWnd, WM_KEYDOWN, 'P', 0 );
  322.         break;
  323.     case IDM_UP:
  324.         SendMessage( hWnd, WM_KEYDOWN, 'U', 0 );
  325.         break;
  326.     case IDM_DOWN:
  327.         SendMessage( hWnd, WM_KEYDOWN, 'D', 0 );
  328.         break;
  329.     case IDM_TOP:
  330.         SendMessage( hWnd, WM_KEYDOWN, 'T', 0 );
  331.         break;
  332.     case IDM_BOTTOM:
  333.         SendMessage( hWnd, WM_KEYDOWN, 'B', 0 );
  334.         break;
  335.     case IDM_INSERT:
  336.         SendMessage( hWnd, WM_KEYDOWN, 'I', 0 );
  337.         break;
  338.     case IDM_NAME:
  339.         SendMessage( hWnd, WM_KEYDOWN, 'N', 0 );
  340.         break;
  341.     case IDM_QUIT:
  342.         SendMessage( hWnd, WM_KEYDOWN, 'Q', 0 );
  343.         break;
  344.     }
  345.     break;
  346.  
  347.     case WM_DESTROY:
  348.     PostQuitMessage( 0 );
  349.     break;
  350.  
  351.     default:
  352.     return( DefWindowProc( hWnd, message, wParam, lParam ) );
  353.     }
  354.     return( 0 );
  355. }
  356.  
  357. int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
  358. /*****************************************************************************************/
  359. {
  360.     #ifdef NTSERVICE
  361.     return( SvcWinMain( hInstance, hPrevInstance, lpCmdLine, nCmdShow ) );
  362.     #else
  363.     return( do_main( hInstance, hPrevInstance, lpCmdLine, nCmdShow ) );
  364.     #endif
  365. }
  366.