home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / autocalc.pak / WINMAIN.CPP < prev   
C/C++ Source or Header  |  1997-07-23  |  5KB  |  145 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents - (C) Copyright 1994 by Borland International
  3. // Automated calculator example demonstrating class hierarchy and collections
  4. // Automation localized for simultaneous English and German use and typelibs
  5. // The example can be built as an .EXE or as an inproc .DLL server
  6. //----------------------------------------------------------------------------
  7. #include "autocalc.h"
  8.  
  9. BEGIN_REGISTRATION(AppReg)
  10.   REGDATA(appname,    APP_NAME)
  11. #if !defined(__DLL__) // building EXE application
  12.   REGDATA(clsid,      "{877B6200-7627-101B-B87C-0000C057CE4E}")
  13.   REGDATA(progid,     APP_NAME ".Application")
  14.   REGDATA(description,"@AppName")
  15.   REGDATA(cmdline,    "/Automation")
  16. #if defined(BI_PLAT_WIN32)
  17. //  REGDATA(debugger,   "TD32")
  18. #else
  19. //  REGDATA(debugger,   "TDW")
  20. #endif
  21. #else                 // building DLL inproc server
  22.   REGDATA(clsid,      "{877B6280-7627-101B-B87C-0000C057CE4E}")
  23.   REGDATA(progid,     APP_NAME ".DLLServer")
  24.   REGDATA(description,"@AppDLLServer")
  25. #endif                // common to both EXE and DLL
  26.   REGDATA(typehelp,   "@typehelp")
  27.   REGDATA(version,    "1.2")
  28. END_REGISTRATION
  29.  
  30. BOOL InitApplication(HINSTANCE hInst);
  31. long FAR PASCAL WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  32.  
  33. TPointer<TRegistrar> Registrar;    // initialized at WinMain or LibMain
  34.  
  35. #if !defined(__DLL__)  // building EXE application
  36.  
  37. static const char* ErrorLookup(long errCode)
  38. {
  39.   static char buf[50];
  40.   wsprintf(buf, "Error message #%ld", errCode);
  41.   return buf;
  42. }
  43.  
  44. int PASCAL
  45. WinMain(HINSTANCE hInst, HINSTANCE prev, char far* cmdLine, int/*cmdShow*/)
  46. {
  47.   if(prev || InitApplication(hInst)) {
  48.     try {
  49.       ::Registrar=new TRegistrar(AppReg,TOcAutoFactory<TCalc>(),
  50.                                  string(cmdLine), hInst);
  51.       TAutoCommand::SetErrorMsgHook(ErrorLookup);
  52.       if (!::Registrar->IsOptionSet(amAnyRegOption))
  53.         ::Registrar->Run();
  54.       ::Registrar = 0;  // deletes registrar by replacing pointer
  55.       return 0;
  56.     }
  57.     catch (TXBase& x) {
  58.       ::MessageBox(0, x.why().c_str(), "OLE Exception", MB_OK);
  59.     }
  60.   }
  61.   return 1;
  62. }
  63.  
  64. #else  // building DLL inproc server
  65.  
  66. #if defined(BI_PLAT_WIN16)
  67. int PASCAL
  68. LibMain(HINSTANCE hInst, uint16 /*dataSeg*/, uint16 /*heapSize*/, char far* cmdLine)
  69. {
  70. #else
  71. int WINAPI
  72. DllEntryPoint(HINSTANCE hInst, uint32 reason, LPVOID)
  73. {
  74.   char* cmdLine = 0;
  75.   if (reason != DLL_PROCESS_ATTACH)
  76.     return 1;
  77. #endif
  78.   if (InitApplication(hInst)) {
  79.     try {
  80.       ::Registrar=new TRegistrar(AppReg,TOcAutoFactory<TCalc>(),
  81.                                  string(cmdLine), hInst);
  82.       return 1;
  83.     }
  84.     catch (TXBase& x) {
  85.       ::MessageBox(0, x.why().c_str(), "OLE Exception", MB_OK);
  86.     }
  87.   }
  88.   return 0;
  89. }
  90.  
  91. #endif  // the code following is common to both EXE and DLL builds
  92.  
  93. BOOL InitApplication(HINSTANCE hInst)
  94. {
  95.   WNDCLASS wc;
  96.   wc.style            = CS_HREDRAW | CS_VREDRAW;
  97.   wc.lpfnWndProc      = WndProc;
  98.   wc.cbClsExtra       = 0;
  99.   wc.cbWndExtra       = DLGWINDOWEXTRA + sizeof(long);
  100.   wc.hInstance        = hInst;
  101.   wc.hIcon            = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON));
  102.   wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
  103.   wc.hbrBackground    = (HBRUSH)(COLOR_APPWORKSPACE+1);
  104.   wc.lpszMenuName     = 0;
  105.   wc.lpszClassName    = APP_NAME;
  106.   return ::RegisterClass(&wc) != 0;
  107. }
  108.  
  109. long PASCAL __export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  110. {
  111.   TCalc* This = (TCalc*)::GetWindowLong(hwnd, DLGWINDOWEXTRA);
  112.   switch(msg) {
  113.   case WM_COMMAND:
  114.     if (wParam < IDC_FIRSTID || wParam > IDC_LASTID)
  115.       break;
  116.     This->ButtonPush(wParam);
  117.     return 0;
  118.  
  119.   case WM_ERASEBKGND:
  120.     if (!This->GetWindow().Background) {
  121.       This->GetWindow().Background = (long)::GetSysColor(COLOR_APPWORKSPACE);
  122.       break;
  123.     } else {
  124.       HBRUSH brush = ::CreateSolidBrush(This->GetWindow().Background);
  125.       ::UnrealizeObject(brush);
  126.       HBRUSH oldbrush = (HBRUSH)::SelectObject((HDC)wParam, brush);
  127.       ::PatBlt((HDC)wParam,0,0,10000,10000,PATCOPY);
  128.       ::SelectObject((HDC)wParam, oldbrush);
  129.       ::DeleteObject(brush);
  130.       return 1;
  131.     }
  132.  
  133.   case WM_DESTROY:
  134.     if (This) {
  135.       This->Closed();
  136.       ::Registrar->ReleaseAutoApp(TAutoObject<TCalc>(This));
  137.     }
  138.     if (This->Options & amExeMode)
  139.       PostQuitMessage(0);
  140.     return 0;
  141.   }
  142.   return ::DefWindowProc(hwnd, msg, wParam, lParam);
  143. }
  144.  
  145.