ATLASYNC.H
Upload User: bangxh
Upload Date: 2007-01-31
Package Size: 42235k
Code Size: 5k
Category:

Windows Develop

Development Platform:

Visual C++

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