home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / todo.pak / TODOWIN.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  4KB  |  149 lines

  1. //---------------------------------------------------------------------
  2. //
  3. //  TODOWIN.CPP - part of TODO example program
  4. //
  5. //      Copyright (c) 1991, 1993 by Borland International
  6. //      All Rights Reserved.
  7. //
  8. //---------------------------------------------------------------------
  9.  
  10. #define STRICT
  11.  
  12. #include <windows.h>
  13. #include <except.h>
  14. #include <checks.h>
  15.  
  16. #include "todowin.h"
  17.  
  18. HINSTANCE WinBase::hInst;
  19. HINSTANCE WinBase::hPrevInst;
  20. LPSTR     WinBase::Cmd;
  21. int       WinBase::Show;
  22.  
  23. //---------------------------------------------------------------------
  24. //
  25. //  members and data for class ModalDialog
  26. //
  27. //---------------------------------------------------------------------
  28.  
  29. ModalDialog *ModalDialog::CurDlg = 0;
  30.  
  31. UINT ModalDialog::Run()
  32. {
  33.     FARPROC dlgProc =
  34.         MakeProcInstance( (FARPROC)ModalDialog::DlgProc, (HINSTANCE)hInst );
  35.     DialogBox( (HINSTANCE)hInst, 
  36.                (LPCSTR)GetDialogName(), 
  37.                (HWND)hWnd(), 
  38.                (DLGPROC)dlgProc );
  39.     FreeProcInstance( dlgProc );
  40.     return Result;
  41. }
  42.  
  43. BOOL CALLBACK _export ModalDialog::DlgProc( HWND hDlg,
  44.                 UINT msg,
  45.                 WPARAM wParam,
  46.                 LPARAM lParam
  47.                                             )
  48. {
  49.     return CurDlg->Dispatch( hDlg, msg, wParam, lParam );
  50. }
  51.  
  52. BOOL ModalDialog::Dispatch( HWND, UINT, WPARAM, LPARAM )
  53. {
  54.     return FALSE;
  55. }
  56.  
  57. //---------------------------------------------------------------------
  58. //
  59. //  members and data for class Window
  60. //
  61. //---------------------------------------------------------------------
  62.  
  63. Window *Window::InCreate = 0;
  64. Window *Window::WinList = 0;
  65.  
  66. BOOL Window::Create()
  67. {
  68.     if( hPrevInst == 0 && RegisterClass() == FALSE )
  69.         {
  70.         return FALSE;
  71.         }
  72.  
  73.     InCreate = this;            // flag that we're inside CreateNewWindow()
  74.  
  75.     CreateNewWindow();
  76.  
  77.     NextWin = WinList;          // insert this object into the Window list
  78.     WinList = this;
  79.  
  80.     InCreate = 0;               // now it's OK to use normal dispatching
  81.  
  82.     return TRUE;
  83. }
  84.  
  85. UINT Window::Run()
  86. {
  87.     PRECONDITION( hWnd() != 0 );// check that we really exist
  88.  
  89.     MSG msg;
  90.     while( GetMessage( &msg, NULL, NULL, NULL ) != 0 )
  91.         {
  92.         TranslateMessage( &msg );
  93.         DispatchMessage( &msg );
  94.         }
  95.     return msg.wParam;
  96. }
  97.  
  98. LONG Window::Dispatch( UINT msg, WPARAM wParam, LPARAM lParam )
  99. {
  100.     return DefWindowProc( (HWND)hWnd(), msg, wParam, lParam );
  101. }
  102.  
  103. LRESULT CALLBACK Window::WndProc( HWND hWnd,
  104.                                   UINT msg,
  105.                                   WPARAM wParam,
  106.                                   LPARAM lParam )
  107. {
  108.     try {
  109.         Window *cur = Window::WinList;
  110.  
  111.         //  look up the handle in our Window list
  112.         while( cur != 0 && cur->hWnd() != hWnd )
  113.             cur = cur->NextWin;
  114.  
  115.         //  normal dispatching
  116.         if( cur != 0 )
  117.             return cur->Dispatch( msg, wParam, lParam );
  118.  
  119.         //  if we're inside CreateNewWindow(), assume
  120.         //  that the message is for us
  121.         if( InCreate != 0 )
  122.             {
  123.             InCreate->hWindow = hWnd;
  124.             return InCreate->Dispatch( msg, wParam, lParam );
  125.             }
  126.  
  127.         //  otherwise, pass it on to windows
  128.         return DefWindowProc( hWnd, msg, wParam, lParam );
  129.         }
  130.     catch( const xmsg& msg )
  131.         {
  132.         MessageBox( InCreate ? InCreate->hWindow : hWnd,
  133.                     msg.why().c_str(),
  134.                     "Fatal Error",
  135.                     MB_ICONSTOP | MB_OK );
  136.         PostQuitMessage(0);
  137.         }
  138.     catch( ... )
  139.         {
  140.         MessageBox( InCreate ? InCreate->hWindow : hWnd,
  141.                     "Unknown error",
  142.                     "Fatal Error",
  143.                     MB_ICONSTOP | MB_OK );
  144.         PostQuitMessage(0);
  145.         }
  146.     return DefWindowProc( hWnd, msg, wParam, lParam );
  147. }
  148.  
  149.