home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / com / dcom / atlcont / atlcont1.h < prev    next >
C/C++ Source or Header  |  1998-04-02  |  8KB  |  278 lines

  1. // AtlCont1.h : Declaration of the CAtlCont
  2.  
  3. #include "resource.h"       // main symbols
  4. #include <oledlg.h>
  5.  
  6. /////////////////////////////////////////////////////////////////////////////
  7. // CAtlCont
  8. class CAtlCont : 
  9.     public CComObjectRoot,
  10.     public CComCoClass<CAtlCont, &CLSID_CAtlCont>,
  11.     public CWindowImpl<CAtlCont>,
  12.     public IAtlCont,
  13.     public IOleClientSite,
  14.     public IOleInPlaceSite
  15. {
  16.     class CAtlContDialog : public CDialogImpl<CAtlContDialog>
  17.     {
  18.         BSTR m_bstr;
  19.     public:
  20.         enum { IDD = IDD_DIALOG1 };
  21.  
  22.     BEGIN_MSG_MAP(CAtlContDialog)
  23.         COMMAND_ID_HANDLER(IDC_CONNECT, OnConnect)
  24.         COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
  25.     END_MSG_MAP()
  26.  
  27.         CAtlContDialog() { m_bstr = 0; }
  28.         ~CAtlContDialog() { if (m_bstr) ::SysFreeString(m_bstr); }
  29.  
  30.         LRESULT OnConnect(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  31.         {   
  32.             GetDlgItemText(IDC_EDIT1, m_bstr); 
  33.             EndDialog(0);
  34.             return 0;
  35.         }
  36.     
  37.         LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  38.         {
  39.             EndDialog(1);
  40.             return 0;
  41.         }
  42.  
  43.         const BSTR GetString() const { return m_bstr; }
  44.     };
  45.  
  46.  
  47. public:
  48.     CAtlCont() { m_bInPlaceActive = FALSE; }
  49.  
  50. DECLARE_REGISTRY_RESOURCEID(IDR_AtlCont)
  51.  
  52. BEGIN_COM_MAP(CAtlCont)
  53.     COM_INTERFACE_ENTRY(IAtlCont)
  54.     COM_INTERFACE_ENTRY(IOleClientSite)
  55.     COM_INTERFACE_ENTRY(IOleWindow)
  56.     COM_INTERFACE_ENTRY(IOleInPlaceSite)
  57. END_COM_MAP()
  58.  
  59. BEGIN_MSG_MAP(CAtlCont)
  60.     MESSAGE_HANDLER(WM_NCDESTROY, OnNCDestroy)
  61.     COMMAND_ID_HANDLER(ID_CONNECT, OnConnect)
  62.     COMMAND_ID_HANDLER(ID_DISCONNECT, OnDisconnect)
  63.     COMMAND_ID_HANDLER(ID_CLEAR, OnClear)
  64.     MESSAGE_HANDLER(WM_SIZE, OnSize)
  65.     MESSAGE_HANDLER(WM_ERASEBKGND, OnErase)
  66. END_MSG_MAP()
  67.  
  68.     LRESULT OnNCDestroy(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& /* lResult */)
  69.     {
  70.         Stop();
  71.         return 0;
  72.     }
  73.  
  74.     LRESULT OnErase(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& bHandled)
  75.     {
  76.         if (m_bInPlaceActive)
  77.             return 0;
  78.         bHandled = FALSE;
  79.         return 1;
  80.     }
  81.  
  82.     LRESULT OnSize(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& /* lResult */)
  83.     {
  84.         if (m_pOleObject && m_bInPlaceActive)
  85.         {
  86.             CComQIPtr<IOleInPlaceObject, &IID_IOleInPlaceObject> pInPlaceObject(m_pOleObject);
  87.             RECT rcClient;
  88.             GetClientRect(&rcClient);
  89.             pInPlaceObject->SetObjectRects(&rcClient, &rcClient);
  90.         }
  91.         return 0;
  92.     }
  93.  
  94.     LRESULT OnConnect(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  95.     {
  96.         CAtlContDialog dialog;
  97.         if (dialog.DoModal())
  98.             return 0;
  99.  
  100.         HCURSOR hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  101.  
  102.         if (m_pOleObject)
  103.         {
  104.             m_pOleObject->Close(OLECLOSE_NOSAVE);
  105.             m_pOleObject.Release();
  106.         }
  107.         m_bInPlaceActive = FALSE;
  108.  
  109.         HRESULT hr = CoCreateInstance(__uuidof(CDrawCtl), NULL, CLSCTX_INPROC, IID_IOleObject, (void**)&m_pOleObject);
  110.         if (!m_pOleObject || FAILED(hr))
  111.         {
  112.             MessageBox(_T("CoCreateInstance failed"));
  113.             return 0;
  114.         }
  115.  
  116.         hr = m_pOleObject->SetClientSite(this);
  117.  
  118.         MSG msg;
  119.         RECT rcPos;
  120.         GetClientRect(&rcPos);
  121.  
  122.         if (SUCCEEDED(hr))
  123.         {
  124.             m_pOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, m_hWnd, &rcPos);
  125.             m_pDrawCtl = m_pOleObject;
  126.             if (m_pDrawCtl)
  127.             hr = m_pDrawCtl->Connect(dialog.GetString());
  128.         }
  129.         
  130.         if (FAILED(hr))
  131.             MessageBox(_T("Connected failed!"));
  132.         else
  133.         {
  134.             //MessageBox(_T("Connected!"), _T("Success"));
  135.             ::EnableMenuItem(GetMenu(), ID_DISCONNECT, MF_ENABLED);
  136.             ::EnableMenuItem(GetMenu(), ID_CONNECT, MF_GRAYED);
  137.             DrawMenuBar();
  138.         }
  139.         SetCursor(hPrevCursor);
  140.         return 0;
  141.     }
  142.  
  143.     LRESULT OnDisconnect(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  144.     {
  145.         HCURSOR hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  146.         HRESULT hr = m_pDrawCtl->Disconnect();
  147.         if (FAILED(hr))
  148.             MessageBox(_T("Disconnect failed!"));
  149.         else
  150.         {
  151.             //MessageBox(_T("Disconnected!"), _T("Success"));
  152.             ::EnableMenuItem(GetMenu(), ID_CONNECT, MF_ENABLED);
  153.             ::EnableMenuItem(GetMenu(), ID_DISCONNECT, MF_GRAYED);
  154.             DrawMenuBar();
  155.         }
  156.         SetCursor(hPrevCursor);
  157.         return 0;
  158.     }
  159.  
  160.     LRESULT OnClear(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  161.     {
  162.         HRESULT hr = m_pDrawCtl->Clear();
  163.         if (FAILED(hr))
  164.             MessageBox(_T("Clear failed!"), _T("Success"));
  165.         return 0;
  166.     }
  167.  
  168. // IAtlCont
  169. public:
  170.     STDMETHOD(Run)()
  171.     {
  172.         RECT rcPos = { CW_USEDEFAULT, 0, 0, 0 };
  173.         HMENU hMenu = LoadMenu(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MENU1));
  174.         Create(GetDesktopWindow(), rcPos, _T("ATL Container"), WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, (UINT)hMenu);
  175.         ShowWindow(SW_SHOWNORMAL);
  176.         ::EnableMenuItem(GetMenu(), ID_DISCONNECT, MF_GRAYED);
  177.         DrawMenuBar();
  178.         return S_OK;
  179.     }
  180.     STDMETHOD(Stop)()
  181.     {
  182.         PostQuitMessage(0);
  183.         return S_OK;
  184.     }
  185.  
  186. // IOleClientSite
  187. public:
  188.     STDMETHOD(SaveObject)(void)
  189.     {
  190.         ATLTRACENOTIMPL(_T("IOleClientSite::SaveObject"));
  191.     }
  192.     STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
  193.     {
  194.         ATLTRACENOTIMPL(_T("IOleClientSite::GetMoniker"));
  195.     }
  196.     STDMETHOD(GetContainer)(IOleContainer **ppContainer)
  197.     {
  198.         ATLTRACENOTIMPL(_T("IOleClientSite::GetContainer"));
  199.     }
  200.     STDMETHOD(ShowObject)(void)
  201.     {
  202.         ATLTRACENOTIMPL(_T("IOleClientSite::ShowObject"));
  203.     }
  204.     STDMETHOD(OnShowWindow)(BOOL fShow)
  205.     {
  206.         ATLTRACENOTIMPL(_T("IOleClientSite::OnShowWindow"));
  207.     }
  208.     STDMETHOD(RequestNewObjectLayout)(void)
  209.     {
  210.         ATLTRACENOTIMPL(_T("IOleClientSite::RequestNewObjectLayout"));
  211.     }
  212.  
  213.  
  214. // IOleWindow
  215. public:
  216.     STDMETHOD(GetWindow)(HWND *phwnd)
  217.     {
  218.         *phwnd = m_hWnd;
  219.         return S_OK;
  220.     }
  221.     STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode)
  222.     {
  223.         ATLTRACENOTIMPL(_T("IOleWindow::CanInPlaceActivate"));
  224.     }
  225.  
  226. // IOleInPlaceSite
  227. public:
  228.     STDMETHOD(CanInPlaceActivate)(void)
  229.     {
  230.         return S_OK;
  231.     }
  232.     STDMETHOD(OnInPlaceActivate)(void)
  233.     {
  234.         m_bInPlaceActive = TRUE;
  235.         return S_OK;
  236.     }
  237.     STDMETHOD(OnUIActivate)(void)
  238.     {
  239.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::OnUIActivate"));
  240.     }
  241.     STDMETHOD(GetWindowContext)(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc,
  242.         LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
  243.     {
  244.         GetClientRect(lprcPosRect);
  245.         GetClientRect(lprcClipRect);
  246.         return S_OK;
  247.     }
  248.     STDMETHOD(Scroll)(SIZE scrollExtant)
  249.     {
  250.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::Scroll"));
  251.     }
  252.     STDMETHOD(OnUIDeactivate)(BOOL fUndoable)
  253.     {
  254.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::OnUIDeactivate"));
  255.     }
  256.     STDMETHOD(OnInPlaceDeactivate)( void)
  257.     {
  258.         m_bInPlaceActive = FALSE;
  259.         return S_OK;
  260.     }
  261.     STDMETHOD(DiscardUndoState)( void)
  262.     {
  263.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::DiscardUndoState"));
  264.     }
  265.     STDMETHOD(DeactivateAndUndo)( void)
  266.     {
  267.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::DeactivateAndUndo"));
  268.     }
  269.     STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect)
  270.     {
  271.         ATLTRACENOTIMPL(_T("IOleInPlaceSite::OnPosRectChange"));
  272.     }
  273.  
  274.     CComPtr<IOleObject> m_pOleObject;
  275.     CComQIPtr<IDrawCtl, &__uuidof(IDrawCtl)> m_pDrawCtl;
  276.     BOOL m_bInPlaceActive;
  277. };
  278.