home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 January / pcwk_01_1999.iso / Wtestowe / Vistdstd / Install / Data.Z / Vexe.CPP < prev    next >
C/C++ Source or Header  |  1996-11-27  |  8KB  |  324 lines

  1. /*    VEXE.CPP - WinMain and Window Procedure for VAddon derived classes.
  2.  *  Copyright (C) 1991-1996 Visio Corporation. All rights reserved.
  3.  *
  4.  *    Abstract
  5.  *        This file implements the standard Windows message loop and window
  6.  *        procedure for EXE based VAddon subclasses.
  7.  *        Allows VAddon-derived classes to be compiled into an EXE with no
  8.  *        additional effort!
  9.  */
  10.  
  11. #include <windows.h>
  12. #include <ole2.h>
  13.  
  14. #if !defined (_WIN32)
  15.     #include <dispatch.h>
  16. #endif
  17.  
  18. #include "vaddon.h"
  19.  
  20. LONG CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
  21. BOOL InitApplication(HANDLE);
  22. BOOL InitInstance(HANDLE, int);
  23. BOOL InitMenu(HWND hWnd);
  24.  
  25. void UnloadAddons(void);
  26. void LoadAddons(void);
  27. void EnumAddonsAndAddMenus(HWND hWnd);
  28.  
  29. HANDLE g_hInst;
  30. LPSTR g_lpszCmdLine;
  31.  
  32. /**************************************************************************
  33.  *+ WinMain
  34.  *
  35.  *    The main message loop and application initialization.
  36.  */
  37. #ifdef __BORLANDC__
  38. #pragma argsused
  39. #endif 
  40. int PASCAL WinMain(
  41.     HINSTANCE hInstance,
  42.     HINSTANCE hPrevInstance,
  43.     LPSTR lpszCmdLine,
  44.     int nCmdShow) 
  45.     {
  46.     MSG msg;
  47.     HRESULT hResult;
  48.     
  49.     if ( hPrevInstance || !InitApplication(hInstance) )
  50.         return (FALSE);
  51.  
  52.     if ( !InitInstance(hInstance, nCmdShow) )
  53.         return (FALSE);
  54.  
  55.     g_lpszCmdLine= lpszCmdLine;
  56.  
  57.     hResult = OleInitialize(NULL);
  58.     if (hResult != NOERROR )
  59.         return (FALSE);
  60.  
  61.     while (GetMessage(&msg, NULL, 0, 0))
  62.         {
  63.         TranslateMessage(&msg);
  64.         DispatchMessage(&msg);
  65.         }
  66.     
  67.     OleUninitialize();
  68.     
  69.     return (msg.wParam);
  70.     }
  71.  
  72.  
  73. /**************************************************************************
  74.  *+ InitApplication
  75.  *
  76.  *    One time initialization to register the window class.
  77.  */
  78.  
  79. BOOL InitApplication(HANDLE hInstance)
  80.     {
  81.     WNDCLASS  wc;
  82.  
  83.     wc.style = 0;
  84.     wc.lpfnWndProc = MainWndProc;
  85.     wc.cbClsExtra = 0;
  86.     wc.cbWndExtra = 0;
  87.     wc.hInstance = hInstance;
  88.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  89.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  90.     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  91.     wc.lpszMenuName =  NULL;
  92.     wc.lpszClassName = "VAddonExe";
  93.  
  94.     return (RegisterClass(&wc));
  95.     }
  96.  
  97.  
  98. /**************************************************************************
  99.  *+ InitInstance
  100.  *
  101.  *    Per instance initialization.  Creates the frame window.
  102.  */
  103.  
  104. BOOL InitInstance(HANDLE hInstance, int nCmdShow)
  105.     {
  106.     HWND hWnd;
  107.  
  108.     /* Make window small.
  109.      */
  110.     LONG dwBaseUnits = GetDialogBaseUnits();
  111.     int winw = (150 * LOWORD(dwBaseUnits))/4;
  112.     int winh = (50 * HIWORD(dwBaseUnits))/8;
  113.     int x = 32;
  114.     int y = 32;
  115.  
  116.     g_hInst = hInstance;
  117.     VAddon::SetInstance(hInstance);
  118.  
  119. #ifdef _DEBUG
  120.     #define WINDOW_TITLE "VAddon EXE Shell - DEBUG"
  121.     y += winh + 16;    //    DEBUG window shows up below Release window...
  122. #else
  123.     #define WINDOW_TITLE "VAddon EXE Shell"
  124. #endif
  125.  
  126.     hWnd = CreateWindow("VAddonExe", WINDOW_TITLE,
  127.                         WS_OVERLAPPEDWINDOW, x, y,
  128.                         winw, winh, NULL, NULL, hInstance, NULL);
  129.  
  130.     if (!hWnd) return (FALSE);
  131.  
  132.     if (!InitMenu(hWnd)) return (FALSE);
  133.  
  134.     LoadAddons();
  135.     EnumAddonsAndAddMenus(hWnd);
  136.  
  137.     ShowWindow(hWnd, nCmdShow);
  138.     UpdateWindow(hWnd);
  139.  
  140.     return (TRUE);
  141.     }
  142.  
  143. BOOL InitMenu(HWND hWnd)
  144. {
  145.     HMENU hMainMenu= CreateMenu();
  146.     HMENU hFileMenu= CreatePopupMenu();
  147.     HMENU hRunMenu= CreatePopupMenu();
  148.     HMENU hAboutMenu= CreatePopupMenu();
  149.     HMENU hHelpMenu= CreatePopupMenu();
  150.  
  151.     if (NULL==hMainMenu || NULL==hFileMenu || NULL==hRunMenu || NULL==hAboutMenu || NULL==hHelpMenu)
  152.         return FALSE;
  153.  
  154.     AppendMenu(hFileMenu, MF_STRING, 100, "&About VAddon EXE Shell...");
  155.     AppendMenu(hFileMenu, MF_STRING, 101, "E&xit");
  156.     AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT) hFileMenu, "&File");
  157.  
  158. //    AppendMenu(hRunMenu, MF_STRING, 999, "RemoveMe");
  159.     AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT) hRunMenu, "&Run");
  160.  
  161. //    AppendMenu(hAboutMenu, MF_STRING, 999, "RemoveMe");
  162.     AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT) hAboutMenu, "&About");
  163.  
  164. //    AppendMenu(hHelpMenu, MF_STRING, 999, "RemoveMe");
  165.     AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT) hHelpMenu, "&Help");
  166.  
  167.     SetMenu(hWnd, hMainMenu);
  168.  
  169.     return TRUE;
  170. }
  171.  
  172. void UnloadAddons(void)
  173.     {
  174.     VAddon *pAddon= VAddon::GetFirst();
  175.     while (NULL!=pAddon)
  176.         {
  177.         pAddon->Unload(0, NULL);
  178.         pAddon= VAddon::GetNext(pAddon);
  179.         }
  180.     }
  181.  
  182. void LoadAddons(void)
  183.     {
  184.     VAddon *pAddon= VAddon::GetFirst();
  185.     while (NULL!=pAddon)
  186.         {
  187.         pAddon->Load(VAO_L2V_VERSION(), NULL);
  188.         pAddon= VAddon::GetNext(pAddon);
  189.         }
  190.     }
  191.  
  192. #define RUN_MASK    0x4000
  193. #define ABOUT_MASK    0x2000
  194. #define HELP_MASK    0x1000
  195.  
  196. void EnumAddonsAndAddMenus(HWND hWnd)
  197.     {
  198.     VAddon *pAddon= NULL;
  199.     HMENU hMenuRun= NULL;
  200.     HMENU hMenuAbout= NULL;
  201.     HMENU hMenuHelp= NULL;
  202.     HMENU hMenu= NULL;
  203.     WORD w= 0;
  204.  
  205.  
  206.     if (NULL!=hWnd)
  207.         hMenu= GetMenu(hWnd);
  208.  
  209.     if (NULL!=hMenu)
  210.         {
  211.         //    File 0, Run 1, About 2, Help 3
  212.         hMenuRun= GetSubMenu(hMenu, 1);
  213.         hMenuAbout= GetSubMenu(hMenu, 2);
  214.         hMenuHelp= GetSubMenu(hMenu, 3);
  215.  
  216.         pAddon= VAddon::GetFirst();
  217.         while (NULL!=pAddon)
  218.             {
  219.             w= pAddon->GetIndex();
  220.  
  221.             AppendMenu(hMenuRun, MF_STRING, (w | RUN_MASK), pAddon->GetName());
  222.             AppendMenu(hMenuAbout, MF_STRING, (w | ABOUT_MASK), pAddon->GetName());
  223.             AppendMenu(hMenuHelp, MF_STRING, (w | HELP_MASK), pAddon->GetName());
  224.  
  225.             pAddon= VAddon::GetNext(pAddon);
  226.             }
  227.  
  228. //        DeleteMenu(hMenuRun, 0, MF_BYPOSITION);        //    The "RemoveMe" item...
  229. //        DeleteMenu(hMenuAbout, 0, MF_BYPOSITION);    //    The "RemoveMe" item...
  230. //        DeleteMenu(hMenuHelp, 0, MF_BYPOSITION);    //    The "RemoveMe" item...
  231.         }
  232.     }
  233.  
  234. /**************************************************************************
  235.  *+ MainWndProc
  236.  *
  237.  *    Frame window procedure.  The only special thing it does it run the 
  238.  *    demo when the Run Demo menu entry is selected.
  239.  */
  240.  
  241. LONG CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  242.     {
  243.     switch (message)
  244.         {
  245.         case WM_COMMAND:
  246.             switch (wParam)
  247.                 {
  248.                 case 100:
  249.                     MessageBox(hWnd, "VAddon EXE Shell\n\nCopyright (c) 1996 Visio Corporation.\nAll rights reserved.\n\nWritten by David Cole.", "About", MB_OK);
  250.                     break;
  251.  
  252.                 case 101:
  253.                     DestroyWindow(hWnd);
  254.                     break;
  255.  
  256.                 default:
  257.                     {
  258.                         if (wParam & RUN_MASK)
  259.                             {
  260.                             VAddon *pAddon= VAddon::FindAddon(wParam & ~RUN_MASK);
  261.                             if (NULL!=pAddon)
  262.                                 {
  263.                                 pAddon->Run(NULL);
  264.                                 }
  265.                             return 0;
  266.                             }
  267.                         else if (wParam & ABOUT_MASK)
  268.                             {
  269.                             VAddon *pAddon= VAddon::FindAddon(wParam & ~ABOUT_MASK);
  270.                             if (NULL!=pAddon)
  271.                                 {
  272.                                 pAddon->About(NULL);
  273.                                 }
  274.                             return 0;
  275.                             }
  276.                         else if (wParam & HELP_MASK)
  277.                             {
  278.                             VAddon *pAddon= VAddon::FindAddon(wParam & ~HELP_MASK);
  279.                             if (NULL!=pAddon)
  280.                                 {
  281.                                 pAddon->Help(NULL);
  282.                                 }
  283.                             return 0;
  284.                             }
  285.                     }
  286.                     return (DefWindowProc(hWnd, message, wParam, lParam));
  287.                 }
  288.             break;
  289.  
  290.         case WM_INITMENU:
  291.             {
  292.             HMENU hMenu= (HMENU) wParam;
  293.             if (NULL!=hMenu)
  294.                 {
  295.                 VAddon *pAddon= VAddon::GetFirst();
  296.                 while (NULL!=pAddon)
  297.                     {
  298.                     //    Enable or disable the 'Run' menu item based on what the addon says:
  299.                     if (pAddon->IsEnabled(NULL))
  300.                         EnableMenuItem(hMenu, (pAddon->GetIndex() | RUN_MASK), MF_BYCOMMAND|MF_ENABLED);
  301.                     else
  302.                         EnableMenuItem(hMenu, (pAddon->GetIndex() | RUN_MASK), MF_BYCOMMAND|MF_GRAYED);
  303.  
  304.                     pAddon= VAddon::GetNext(pAddon);
  305.                     }
  306.                 return 0;
  307.                 }
  308.  
  309.             return (DefWindowProc(hWnd, message, wParam, lParam));
  310.             }
  311.             break;
  312.  
  313.         case WM_DESTROY:
  314.             UnloadAddons();
  315.             PostQuitMessage(0);
  316.             break;
  317.  
  318.         default:
  319.             return (DefWindowProc(hWnd, message, wParam, lParam));
  320.         }
  321.  
  322.     return 0;
  323.     }
  324.