home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / atl / async / atlasync.h < prev    next >
C/C++ Source or Header  |  1998-03-26  |  5KB  |  156 lines

  1. // ATLAsync.h : Declaration of the CATLAsync
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12.  
  13. #include "resource.h"       // main symbols
  14.  
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CATLAsync
  18. class CATLAsync :
  19.     public CComObjectRoot,
  20.     public CComCoClass<CATLAsync, &CLSID_CATLAsync>,
  21.     public CComControl<CATLAsync>,
  22.     public IDispatchImpl<IATLAsync, &IID_IATLAsync, &LIBID_ASYNCLib>,
  23.     public IProvideClassInfo2Impl<&CLSID_CATLAsync, NULL, &LIBID_ASYNCLib>,
  24.     public IPersistStreamInitImpl<CATLAsync>,
  25.     public IPersistStorageImpl<CATLAsync>,
  26.     public IQuickActivateImpl<CATLAsync>,
  27.     public IOleControlImpl<CATLAsync>,
  28.     public IOleObjectImpl<CATLAsync>,
  29.     public IOleInPlaceActiveObjectImpl<CATLAsync>,
  30.     public IViewObjectExImpl<CATLAsync>,
  31.     public IOleInPlaceObjectWindowlessImpl<CATLAsync>,
  32.     public IDataObjectImpl<CATLAsync>,
  33.     public IPersistPropertyBagImpl<CATLAsync>,
  34.     public IPerPropertyBrowsingImpl<CATLAsync>,
  35.     public IObjectSafetyImpl<CATLAsync, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
  36. {
  37. public:
  38.     CContainedWindow m_EditCtrl;
  39.  
  40.     CATLAsync() : m_EditCtrl(_T("EDIT"), this, 1)
  41.     {
  42.         m_bWindowOnly = TRUE;
  43.     }
  44.  
  45. DECLARE_REGISTRY_RESOURCEID(IDR_ATLAsync)
  46.  
  47.  
  48. BEGIN_COM_MAP(CATLAsync)
  49.     COM_INTERFACE_ENTRY(IATLAsync)
  50.     COM_INTERFACE_ENTRY(IDispatch)
  51.     COM_INTERFACE_ENTRY(IObjectSafety)
  52.     COM_INTERFACE_ENTRY_IMPL(IViewObjectEx)
  53.     COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx)
  54.     COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx)
  55.     COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless)
  56.     COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
  57.     COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
  58.     COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject)
  59.     COM_INTERFACE_ENTRY_IMPL(IOleControl)
  60.     COM_INTERFACE_ENTRY_IMPL(IOleObject)
  61.     COM_INTERFACE_ENTRY_IMPL(IQuickActivate)
  62.     COM_INTERFACE_ENTRY_IMPL(IPersistStorage)
  63.     COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit)
  64.     COM_INTERFACE_ENTRY_IMPL_IID(IID_IPersist, IPersistPropertyBag)
  65.     COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag)
  66.     COM_INTERFACE_ENTRY_IMPL(IDataObject)
  67.     COM_INTERFACE_ENTRY(IProvideClassInfo)
  68.     COM_INTERFACE_ENTRY(IProvideClassInfo2)
  69. END_COM_MAP()
  70.  
  71. BEGIN_PROPERTY_MAP(CATLAsync)
  72.     PROP_ENTRY("URL", 0, CLSID_NULL)
  73. END_PROPERTY_MAP()
  74.  
  75.  
  76. BEGIN_MSG_MAP(CATLAsync)
  77.     MESSAGE_HANDLER(WM_CREATE, OnCreate)
  78. ALT_MSG_MAP(1)
  79.     MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnDoubleClick)
  80. END_MSG_MAP()
  81.  
  82. // IATLAsync
  83. public:
  84.  
  85.     HRESULT OnDraw(ATL_DRAWINFO&)
  86.     {
  87.         return 0;
  88.     }
  89.     LRESULT OnDoubleClick(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  90.     {
  91.         put_URL(CComBSTR(_T("http://www.microsoft.com")));
  92.  
  93.         return 0;
  94.     }
  95.     LRESULT OnCreate(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  96.     {
  97.         RECT rc;
  98.         GetWindowRect(&rc);
  99.         rc.right -= rc.left;
  100.         rc.bottom -= rc.top;
  101.         rc.top = rc.left = 0;
  102.         USES_CONVERSION;
  103.         m_EditCtrl.Create(m_hWnd, rc, OLE2CT((BSTR)m_bstrText), WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL);
  104.         ::SendMessage(m_EditCtrl.m_hWnd, WM_SETTEXT, 0,  (LPARAM)_T("Double click on this window or set the URL property to initiate download."));
  105.         return 0;
  106.     }
  107.     STDMETHOD(SetObjectRects)(LPCRECT prcPos,LPCRECT prcClip)
  108.     {
  109.         IOleInPlaceObjectWindowlessImpl<CATLAsync>::SetObjectRects(prcPos, prcClip);
  110.         int cx, cy;
  111.         cx = prcPos->right - prcPos->left;
  112.         cy = prcPos->bottom - prcPos->top;
  113.         ::SetWindowPos(m_EditCtrl.m_hWnd, NULL, 0,
  114.                      0, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE);
  115.         return S_OK;
  116.     }
  117.  
  118.     CComBSTR m_bstrText;    //holds data received from the URL
  119.  
  120.     //OnData will be used as a callback functin by the CBindStatusCallback object.
  121.     //OnData will be called periodically with data from the asynchronous transfer
  122.     void OnData(CBindStatusCallback<CATLAsync>* pbsc, BYTE* pBytes, DWORD dwSize)
  123.     {
  124.         ATLTRACE(_T("OnData called\n"));
  125.         m_bstrText.Append((LPCSTR)pBytes);
  126.         if (::IsWindow(m_EditCtrl.m_hWnd))
  127.         {
  128.             USES_CONVERSION;
  129.             ::SendMessage(m_EditCtrl.m_hWnd, WM_SETTEXT, 0,  (LPARAM)OLE2CT((BSTR)m_bstrText));
  130.         }
  131.     }
  132.  
  133.     //put_URL is the put method for the URL property.
  134.     //Calling this function starts the URL transfer.
  135.     STDMETHOD(put_URL)(BSTR strURL)
  136.     {
  137.         USES_CONVERSION;
  138.         ATLTRACE(_T("IATLAsync::put_URL\n"));
  139.         m_bstrURL = strURL;
  140.         if (::IsWindow(m_EditCtrl.m_hWnd))
  141.         {
  142.             USES_CONVERSION;
  143.             ::SendMessage(m_EditCtrl.m_hWnd, WM_SETTEXT, 0,  (LPARAM)_T(""));
  144.             CBindStatusCallback<CATLAsync>::Download(this, OnData, m_bstrURL, m_spClientSite, FALSE);
  145.         }
  146.         return S_OK;
  147.     }
  148.     STDMETHOD(get_URL)(BSTR* pstrURL)
  149.     {
  150.         ATLTRACE(_T("IATLAsync::get_URL\n"));
  151.         *pstrURL = m_bstrURL.Copy();
  152.         return S_OK;
  153.     }
  154.     CComBSTR m_bstrURL; //string representing a URL
  155. };
  156.