home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / activedocument / doserver / doserver.cpp < prev    next >
C/C++ Source or Header  |  1997-05-28  |  7KB  |  300 lines

  1. /**************************************************************************
  2.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3.    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4.    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5.    PARTICULAR PURPOSE.
  6.  
  7.    Copyright 1997 Microsoft Corporation.  All Rights Reserved.
  8. **************************************************************************/
  9.  
  10. /**************************************************************************
  11.  
  12.    File:          DOServer.cpp
  13.    
  14.    Description:   General function implementation.
  15.  
  16. **************************************************************************/
  17.  
  18. /**************************************************************************
  19.    #include statements
  20. **************************************************************************/
  21.  
  22. #include "DOServer.h"
  23. #include "ClsFact.h"
  24. #include <windowsx.h>
  25. #include <CommDlg.h>
  26.  
  27. #include <initguid.h>
  28.  
  29. // {F0FD0C00-65BA-11d0-B66F-00A0C90348D6}
  30. DEFINE_GUID(   CLSID_SimpleDocObject, 
  31.                0xf0fd0c00, 
  32.                0x65ba, 
  33.                0x11d0, 
  34.                0xb6, 
  35.                0x6f, 
  36.                0x0, 
  37.                0xa0, 
  38.                0xc9, 
  39.                0x3, 
  40.                0x48, 
  41.                0xd6);
  42.  
  43. /**************************************************************************
  44.    private function prototypes
  45. **************************************************************************/
  46.  
  47. BOOL InitApp(BOOL, int);
  48. void CenterWindow(HWND);
  49.  
  50. /**************************************************************************
  51.    global variables
  52. **************************************************************************/
  53.  
  54. HINSTANCE      g_hInst;
  55. DWORD          g_DllRefCount;
  56. DWORD          g_dwRegister;
  57.  
  58. /**************************************************************************
  59.  
  60.    WinMain
  61.  
  62. **************************************************************************/
  63.  
  64. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  65. {
  66. BOOL  fEmbedding;
  67. MSG   msg;
  68.  
  69. g_hInst = hInstance;
  70.  
  71. //check for the embedding switch
  72. ParseCommandLine(lpCmdLine, &fEmbedding, NULL);
  73.  
  74. if(!fEmbedding)
  75.    {
  76.    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, (DLGPROC)MainDlgProc);
  77.    return 0;
  78.    }
  79.  
  80. if(!InitApp(fEmbedding, nCmdShow))
  81.    return 0;
  82.  
  83. //DebugBreak();
  84.  
  85. //The message loop will only exit when the main object gets destroyed.
  86. while(GetMessage(&msg, NULL, 0, 0))
  87.    {
  88.    TranslateMessage(&msg);
  89.    DispatchMessage(&msg);
  90.    }
  91.  
  92. OutputDebugString(TEXT("Exiting WinMain\n"));
  93.  
  94. if(g_dwRegister)
  95.    CoRevokeClassObject(g_dwRegister);
  96.  
  97. CoUninitialize();
  98.  
  99. return msg.wParam;
  100. }                                 
  101.  
  102. /**************************************************************************
  103.  
  104.    InitApp()
  105.    
  106. **************************************************************************/
  107.  
  108. BOOL InitApp(BOOL fEmbedding, int nCmdShow)
  109. {
  110. //initialize OLE
  111. if(FAILED(CoInitialize(NULL)))
  112.    return FALSE;
  113.  
  114. CClassFactory  *pClassFactory = new CClassFactory();
  115.  
  116. if(NULL == pClassFactory)
  117.    {
  118.    CoUninitialize();
  119.    return FALSE;
  120.    }
  121.  
  122. LPUNKNOWN   pUnknown;
  123. HRESULT     hr;
  124.  
  125. hr = pClassFactory->QueryInterface(IID_IUnknown, (LPVOID*)&pUnknown);
  126. if(FAILED(hr))
  127.    {
  128.    pClassFactory->Release();
  129.    return FALSE;
  130.    }
  131.  
  132. //register the class object
  133. hr = CoRegisterClassObject(   CLSID_SimpleDocObject,
  134.                               pUnknown,
  135.                               CLSCTX_LOCAL_SERVER,
  136.                               REGCLS_MULTIPLEUSE,
  137.                               &g_dwRegister);
  138.  
  139. if(FAILED(hr))
  140.    {
  141.    pClassFactory->Release();
  142.    return FALSE;
  143.    }
  144.  
  145. return TRUE;
  146. }
  147.  
  148. /**************************************************************************
  149.  
  150.    MainDlgProc()
  151.    
  152. **************************************************************************/
  153.  
  154. BOOL CALLBACK MainDlgProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
  155. {
  156. static COleDocument  *pOleDoc;
  157.  
  158. switch(uMessage)
  159.    {
  160.    case WM_INITDIALOG:
  161.       CenterWindow(hWnd);
  162.       
  163.       pOleDoc = new COleDocument();
  164.  
  165.       if(pOleDoc)
  166.          {
  167.          EnableWindow(GetDlgItem(hWnd, IDC_REGISTER), TRUE);
  168.          EnableWindow(GetDlgItem(hWnd, IDC_CREATE_FILE), TRUE);
  169.          }
  170.  
  171.       break;
  172.    
  173.    case WM_DESTROY:
  174.       if(pOleDoc)
  175.          {
  176.          delete pOleDoc;
  177.          }
  178.  
  179.       break;
  180.    
  181.    case WM_COMMAND:
  182.       switch(GET_WM_COMMAND_ID(wParam, lParam))
  183.          {
  184.          case IDOK:
  185.          case IDCANCEL:
  186.             EndDialog(hWnd, 0);
  187.             break;
  188.          
  189.          case IDC_REGISTER:
  190.             if(pOleDoc)
  191.                {
  192.                pOleDoc->RegisterServer();
  193.                }
  194.             break;
  195.  
  196.          case IDC_CREATE_FILE:
  197.             if(pOleDoc)
  198.                {
  199.                pOleDoc->CreateFile(hWnd);
  200.                }
  201.             break;
  202.          }
  203.       return FALSE;
  204.    }
  205.  
  206. return FALSE;
  207. }
  208.  
  209.  
  210. /**************************************************************************
  211.  
  212.    ColorHookProc()
  213.    
  214. **************************************************************************/
  215.  
  216. BOOL CALLBACK ColorHookProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
  217. {
  218. static COleDocument  *pOleDoc;
  219. static UINT          uSaveOK;
  220.  
  221. switch(uMessage)
  222.    {
  223.    case WM_INITDIALOG:
  224.       {
  225.       UINT  uSelect;
  226.  
  227.       pOleDoc = (COleDocument*)((LPOPENFILENAME)(lParam))->lCustData;
  228.  
  229.       uSaveOK = RegisterWindowMessage(FILEOKSTRING);
  230.  
  231.       switch(pOleDoc->m_Color)
  232.          {
  233.          default:
  234.          case RED_COLOR:
  235.             uSelect = IDC_RED;
  236.             break;
  237.  
  238.          case GREEN_COLOR:
  239.             uSelect = IDC_GREEN;
  240.             break;
  241.  
  242.          case BLUE_COLOR:
  243.             uSelect = IDC_BLUE;
  244.             break;
  245.          }
  246.  
  247.       CheckRadioButton(hWnd, IDC_RED, IDC_BLUE, uSelect);
  248.       }
  249.       break;
  250.  
  251.    case WM_DESTROY:
  252.       break;
  253.  
  254.    default:
  255.       if(uMessage == uSaveOK)
  256.          {
  257.          //Save button pressed
  258.          if(IsDlgButtonChecked(hWnd, IDC_GREEN))
  259.             {
  260.             pOleDoc->m_Color = GREEN_COLOR;
  261.             }
  262.          else if(IsDlgButtonChecked(hWnd, IDC_BLUE))
  263.             {
  264.             pOleDoc->m_Color = BLUE_COLOR;
  265.             }
  266.          else
  267.             {
  268.             pOleDoc->m_Color = RED_COLOR;
  269.             }
  270.             }
  271.       
  272.       break;
  273.    }
  274.  
  275. return FALSE;
  276. }
  277.  
  278. /*****************************************************************************
  279.  
  280.    CenterWindow
  281.  
  282. *****************************************************************************/
  283.  
  284. void CenterWindow(HWND hWnd)
  285. {
  286. RECT  rc;
  287. int   x,
  288.       y;
  289.  
  290. GetWindowRect(hWnd, &rc);
  291.  
  292. x = GetSystemMetrics(SM_CXSCREEN)/2 - ((rc.right - rc.left)/2);
  293. y = GetSystemMetrics(SM_CYSCREEN)/2 - ((rc.bottom - rc.top)/2);
  294.  
  295. //don't move the window if it's already in the right position
  296. if((x != rc.left) || (y != rc.top))
  297.    MoveWindow(hWnd, x, y, rc.right - rc.left, rc.bottom - rc.top, TRUE);
  298. }
  299.  
  300.