网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C5000 >> 文章正文
  有关DSP进程及其线程的代码         ★★★ 【字体:
有关DSP进程及其线程的代码
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-22    

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#ifndef __AFXOLE_H__
#define __AFXOLE_H__

#ifdef _AFX_NO_OLE_SUPPORT
 #error OLE classes not supported in this library variant.
#endif

#ifndef __AFXEXT_H__
 #include <afxext.h>
#endif

#ifndef __AFXDISP_H__
 #include <afxdisp.h>
#endif

// include OLE Compound Document headers
#ifndef _OLE2_H_
 #include <ole2.h>
#endif

// ActiveX Document support
#ifndef __docobj_h__
 #include <docobj.h>
#endif

// URL Monikers support
#ifndef __urlmon_h__
 #include <urlmon.h>
#endif

#ifndef __AFXCOM_H__
#include <afxcom_.h>
#endif

#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, on)
#endif

#ifdef _AFX_PACKING
#pragma pack(push, _AFX_PACKING)
#endif


#ifndef _AFX_NOFORCE_LIBS

#pragma comment(lib, "urlmon.lib")

#endif // !_AFX_NOFORCE_LIBS

/////////////////////////////////////////////////////////////////////////////
// AFXOLE.H - MFC OLE support

// Classes declared in this file

//CDocument
 class COleDocument;             // OLE container document
  class COleLinkingDoc;       // supports links to embeddings
   class COleServerDoc;    // OLE server document
 class CDocObjectServer;         // might be owned by a COleServerDoc

//CCmdTarget
 class CDocItem;                 // part of a document
  class COleClientItem;       // embedded ole object from outside
   class COleDocObjectItem;// ActiveX Document item
  class COleServerItem;       // ole object to export
 class COleDataSource;           // clipboard data source mechanism
 class COleDropSource;           // drag/drop source
 class COleDropTarget;           // drag/drop target
 class COleMessageFilter;        // concurrency management

//CFrameWnd
 class COleIPFrameWnd;           // frame window for in-place servers

//CControlBar
 class COleResizeBar;            // implements in-place resizing

//CFile
 class COleStreamFile;           // CFile wrapper for IStream interface
  class CMonikerFile;         // bound to via IMoniker
   class CAsyncMonikerFile;// asynchronous IMoniker

class COleDataObject;               // wrapper for IDataObject interface

/////////////////////////////////////////////////////////////////////////////

// AFXDLL support
#undef AFX_DATA
#define AFX_DATA AFX_OLE_DATA

/////////////////////////////////////////////////////////////////////////////
// backward compatibility

// COleClientDoc is now obsolete -- use COleDocument instead
#define COleClientDoc COleDocument

// COleServer has been replaced by the more general COleObjectFactory
#define COleServer  COleObjectFactory

/////////////////////////////////////////////////////////////////////////////
// Useful OLE specific types (some from OLE 1.0 headers)

// Codes for CallBack events
enum OLE_NOTIFICATION
{
 OLE_CHANGED,        // representation of a draw aspect has changed
 OLE_SAVED,          // the item has committed its storage
 OLE_CLOSED,         // the item has closed
 OLE_RENAMED,        // the item has changed its moniker
 OLE_CHANGED_STATE,  // the item state (open, active, etc.) has changed
 OLE_CHANGED_ASPECT, // the item draw aspect has changed
};

// Object types
enum OLE_OBJTYPE
{
 OT_UNKNOWN = 0,

 // These are OLE 1.0 types and OLE 2.0 types as returned from GetType().
 OT_LINK = 1,
 OT_EMBEDDED = 2,
 OT_STATIC = 3,

 // All OLE2 objects are written with this tag when serialized.  This
 //  differentiates them from OLE 1.0 objects written with MFC 2.0.
 //  This value will never be returned from GetType().
 OT_OLE2 = 256,
};

/////////////////////////////////////////////////////////////////////////////
// COleDataObject -- simple wrapper for IDataObject

class COleDataObject
{
// Constructors
public:
 COleDataObject();

// Operations
 void Attach(LPDATAOBJECT lpDataObject, BOOL bAutoRelease = TRUE);
 LPDATAOBJECT Detach();  // detach and get ownership of m_lpDataObject
 void Release(); // detach and Release ownership of m_lpDataObject
 BOOL AttachClipboard(); // attach to current clipboard object

// Attributes
 void BeginEnumFormats();
 BOOL GetNextFormat(LPFORMATETC lpFormatEtc);
 CFile* GetFileData(CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL);
 HGLOBAL GetGlobalData(CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL);
 BOOL GetData(CLIPFORMAT cfFormat, LPSTGMEDIUM lpStgMedium,
  LPFORMATETC lpFormatEtc = NULL);
 BOOL IsDataAvailable(CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL);

// Implementation
public:
 LPDATAOBJECT m_lpDataObject;
 LPENUMFORMATETC m_lpEnumerator;
 ~COleDataObject();

 // advanced use and implementation
 LPDATAOBJECT GetIDataObject(BOOL bAddRef);
 void EnsureClipboardObject();
 BOOL m_bClipboard;      // TRUE if represents the Win32 clipboard

protected:
 BOOL m_bAutoRelease;    // TRUE if destructor should call Release

private:
 // Disable the copy constructor and assignment by default so you will get
 //   compiler errors instead of unexpected behaviour if you pass objects
 //   by value or assign objects.
 COleDataObject(const COleDataObject&);  // no implementation
 void operator=(const COleDataObject&);  // no implementation
};

/////////////////////////////////////////////////////////////////////////////
// COleDataSource -- wrapper for implementing IDataObject
//  (works similar to how data is provided on the clipboard)

struct AFX_DATACACHE_ENTRY;
class COleDropSource;

class COleDataSource : public CCmdTarget
{
// Constructors
public:
 COleDataSource();

// Operations
 void Empty();   // empty cache (similar to ::EmptyClipboard)

 // CacheData & DelayRenderData operations similar to ::SetClipboardData
 void CacheGlobalData(CLIPFORMAT cfFormat, HGLOBAL hGlobal,
  LPFORMATETC lpFormatEtc = NULL);    // for HGLOBAL based data
 void DelayRenderFileData(CLIPFORMAT cfFormat,
  LPFORMATETC lpFormatEtc = NULL);    // for CFile* based delayed render

 // Clipboard and Drag/Drop access
 DROPEFFECT DoDragDrop(
  DWORD dwEffects = DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK,
  LPCRECT lpRectStartDrag = NULL,
  COleDropSource* pDropSource = NULL);
 void SetClipboard();
 static void PASCAL FlushClipboard();
 static COleDataSource* PASCAL GetClipboardOwner();

 // Advanced: STGMEDIUM based cached data
 void CacheData(CLIPFORMAT cfFormat, LPSTGMEDIUM lpStgMedium,
  LPFORMATETC lpFormatEtc = NULL);    // for LPSTGMEDIUM based data
 // Advanced: STGMEDIUM or HGLOBAL based delayed render
 void DelayRenderData(CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL);

 // Advanced: support for SetData in COleServerItem
 //  (not generally useful for clipboard or drag/drop operations)
 void DelaySetData(CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL);

// Overidables
 virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
 virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
 virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  // OnRenderFileData and OnRenderGlobalData are called by
  //  the default implementation of OnRenderData.

 virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  BOOL bRelease);
  // used only in COleServerItem implementation

// Implementation
public:
 virtual ~COleDataSource();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:
 AFX_DATACACHE_ENTRY* m_pDataCache;  // data cache itself
 UINT m_nMaxSize;    // current allocated size
 UINT m_nSize;       // current size of the cache
 UINT m_nGrowBy;     // number of cache elements to grow by for new allocs

 AFX_DATACACHE_ENTRY* Lookup(
  LPFORMATETC lpFormatEtc, DATADIR nDataDir) const;
 AFX_DATACACHE_ENTRY* GetCacheEntry(
  LPFORMATETC lpFormatEtc, DATADIR nDataDir);

// Interface Maps
public:
 BEGIN_INTERFACE_PART(DataObject, IDataObject)
  INIT_INTERFACE_PART(COleDataSource, DataObject)
  STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(QueryGetData)(LPFORMATETC);
  STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
  STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
  STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
  STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
  STDMETHOD(DUnadvise)(DWORD);
  STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
 END_INTERFACE_PART(DataObject)

 DECLARE_INTERFACE_MAP()

 friend class COleServerItem;
};

//////////////////////////////////////////////////////////////////////////////
// DocItem support

#ifdef _AFXDLL
class CDocItem : public CCmdTarget
#else
class AFX_NOVTABLE CDocItem : public CCmdTarget
#endif
{
 DECLARE_SERIAL(CDocItem)

// Constructors
protected:      // abstract class
 CDocItem();

// Attributes
public:
 CDocument* GetDocument() const; // return container document

// Overridables
public:
 // Raw data access (native format)
 virtual BOOL IsBlank() const;

// Implementation
protected:
 COleDocument* m_pDocument;

public:
 virtual void Serialize(CArchive& ar);   // for Native data
 virtual ~CDocItem();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

 friend class COleDocument;              // for access to back pointer
};

//////////////////////////////////////////////////////////////////////////////
// COleDocument - common OLE container behavior (enables server functionality)

class COleDocument : public CDocument
{
 DECLARE_DYNAMIC(COleDocument)

// Constructors
public:
 COleDocument();

// Attributes
 BOOL HasBlankItems() const; // check for BLANK items
 virtual COleClientItem* GetInPlaceActiveItem(CWnd* pWnd);
  // return in-place active item for this view or NULL if none

// Operations
 // iterating over existing items
 virtual POSITION GetStartPosition() const;
 virtual CDocItem* GetNextItem(POSITION& pos) const;

 // iterator helpers (helpers use virtual GetNextItem above)
 COleClientItem* GetNextClientItem(POSITION& pos) const;
 COleServerItem* GetNextServerItem(POSITION& pos) const;

 // adding new items - called from item constructors
 virtual void AddItem(CDocItem* pItem);
 virtual void RemoveItem(CDocItem* pItem);

 void EnableCompoundFile(BOOL bEnable = TRUE);
  // enable compound file support (only call during constructor)
 virtual void UpdateModifiedFlag();
  // scan for modified items -- mark document modified

 // printer-device caching/control
 BOOL ApplyPrintDevice(const DVTARGETDEVICE* ptd);
 BOOL ApplyPrintDevice(const PRINTDLG* ppd);
  // these apply the target device to all COleClientItem objects

// Overridables
 virtual COleClientItem* GetPrimarySelectedItem(CView* pView);
  // return primary selected item or NULL if none
 virtual void OnShowViews(BOOL bVisible);
  // called during app-idle when visibility of a document has changed

// Implementation
public:
 CObList m_docItemList;  // not owned items

#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif
 CFrameWnd* GetFirstFrame();

 // document handling overrides
 virtual void SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU = TRUE);
 virtual ~COleDocument();
 virtual void DeleteContents(); // delete client items in list
 virtual void Serialize(CArchive& ar);   // serialize items to file
 virtual void PreCloseFrame(CFrameWnd* pFrame);
 virtual BOOL SaveModified();
 virtual void OnIdle();

 // compound file implementation
 virtual BOOL OnNewDocument();
 virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
 virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
 virtual void OnCloseDocument();
 void CommitItems(BOOL bSuccess);    // called during File.Save & File.Save As

 // minimal linking protocol
 virtual LPMONIKER GetMoniker(OLEGETMONIKER nAssign);
 virtual LPOLEITEMCONTAINER GetContainer();

protected:
 // document state implementation
 UINT m_dwNextItemNumber;// serial number for next item in this document
 BOOL m_bLastVisible;    // TRUE if one or more views was last visible

 // 'docfile' support
 BOOL m_bCompoundFile;   // TRUE if use compound files
 LPSTORAGE m_lpRootStg;  // root storage for the document
 BOOL m_bSameAsLoad;     // TRUE = file-save, FALSE = Save [Copy] As
 BOOL m_bRemember;       // if FALSE, indicates Save Copy As

 DVTARGETDEVICE* m_ptd;  // current document target device

 // implementation helpers
 virtual void LoadFromStorage();
 virtual void SaveToStorage(CObject* pObject = NULL);
 CDocItem* GetNextItemOfKind(POSITION& pos, CRuntimeClass* pClass) const;

 // command handling
public:
 virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
  AFX_CMDHANDLERINFO* pHandlerInfo);

protected:
 afx_msg void OnUpdatePasteMenu(CCmdUI* pCmdUI);
 afx_msg void OnUpdatePasteLinkMenu(CCmdUI* pCmdUI);
 afx_msg void OnUpdateEditLinksMenu(CCmdUI* pCmdUI);
 afx_msg void OnEditLinks();
 afx_msg void OnEditConvert();
 afx_msg void OnUpdateEditChangeIcon(CCmdUI* pCmdUI);
 afx_msg void OnEditChangeIcon();
 afx_msg void OnUpdateObjectVerbMenu(CCmdUI* pCmdUI);
 afx_msg void OnFileSendMail();

 friend class COleClientItem;
 friend class COleServerItem;
};

/////////////////////////////////////////////////////////////////////////////
// COleClientItem - Supports OLE2 non-inplace editing.
//      implements IOleClientSite, IAdviseSink, and IOleInPlaceSite

class COleFrameHook;    // forward reference (see ..\src\oleimpl2.h)

class COleClientItem : public CDocItem
{
 DECLARE_DYNAMIC(COleClientItem)

// Constructors
public:
 COleClientItem(COleDocument* pContainerDoc = NULL);

 // create from the clipboard
 BOOL CreateFromClipboard(OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);
 BOOL CreateLinkFromClipboard(OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);
 BOOL CreateStaticFromClipboard(OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);

 // create from a class ID (Insert New Object dialog)
 BOOL CreateNewItem(REFCLSID clsid, OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);

 // create from COleDataObject
 BOOL CreateFromData(COleDataObject* pDataObject,
  OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);
 BOOL CreateLinkFromData(COleDataObject* pDataObject,
  OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);
 BOOL CreateStaticFromData(COleDataObject* pDataObject,
  OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);

 // create from file (package support)
 BOOL CreateFromFile(LPCTSTR lpszFileName, REFCLSID clsid = CLSID_NULL,
  OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);
 BOOL CreateLinkFromFile(LPCTSTR lpszFileName,
  OLERENDER render = OLERENDER_DRAW,
  CLIPFORMAT cfFormat = 0, LPFORMATETC lpFormatEtc = NULL);

 // create a copy
 BOOL CreateCloneFrom(const COleClientItem* pSrcItem);

// General Attributes
public:
 HICON GetIconFromRegistry() const;
 static HICON GetIconFromRegistry(CLSID& clsid);
 SCODE GetLastStatus() const;
 OLE_OBJTYPE GetType() const; // OT_LINK, OT_EMBEDDED, OT_STATIC
 void GetClassID(CLSID* pClassID) const;
 void GetUserType(USERCLASSTYPE nUserClassType, CString& rString);
 BOOL GetExtent(LPSIZE lpSize, DVASPECT nDrawAspect = (DVASPECT)-1);
  // will return FALSE if item is BLANK
 BOOL GetCachedExtent(LPSIZE lpSize, DVASPECT nDrawAspect = (DVASPECT)-1);

 // getting/setting iconic cache
 HGLOBAL GetIconicMetafile();
 BOOL SetIconicMetafile(HGLOBAL hMetaPict);

 // setting/getting default display aspect
 DVASPECT GetDrawAspect() const;
 virtual void SetDrawAspect(DVASPECT nDrawAspect);

 // for printer presentation cache
 BOOL SetPrintDevice(const DVTARGETDEVICE* ptd);
 BOOL SetPrintDevice(const PRINTDLG* ppd);

 // Item state
 enum ItemState
  { emptyState, loadedState, openState, activeState, activeUIState };
 UINT GetItemState() const;

 BOOL IsModified() const;
 BOOL IsRunning() const;
 BOOL IsInPlaceActive() const;
 BOOL IsOpen() const;
 CView* GetActiveView() const;

 // Data access
 void AttachDataObject(COleDataObject& rDataObject) const;

 // other rare access information
 COleDocument* GetDocument() const; // return container

 // helpers for checking clipboard data availability
 static BOOL PASCAL CanPaste();
 static BOOL PASCAL CanPasteLink();

 // helpers for checking COleDataObject, useful in drag drop
 static BOOL PASCAL CanCreateFromData(const COleDataObject* pDataObject);
 static BOOL PASCAL CanCreateLinkFromData(const COleDataObject* pDataObject);

// General Operations
 virtual void Release(OLECLOSE dwCloseOption = OLECLOSE_NOSAVE);
  // cleanup, detach (close if needed)
 void Close(OLECLOSE dwCloseOption = OLECLOSE_SAVEIFDIRTY);
  // close without releasing the item
 void Delete(BOOL bAutoDelete = TRUE);
  // logically delete from file -- not part of the document anymore
 void Run(); // insure item is in running state

 // Drawing
 BOOL Draw(CDC* pDC, LPCRECT lpBounds,
  DVASPECT nDrawAspect = (DVASPECT)-1);   // defaults to m_nDrawAspect

 // Activation
 virtual BOOL DoVerb(LONG nVerb, CView* pView, LPMSG lpMsg = NULL);
 void Activate(LONG nVerb, CView* pView, LPMSG lpMsg = NULL);

 // In-place Activation
 void Deactivate();          // completely deactivate
 void DeactivateUI();        // deactivate the user interface
 BOOL ReactivateAndUndo();   // reactivate then perform undo command
 BOOL SetItemRects(LPCRECT lpPosRect = NULL, LPCRECT lpClipRect = NULL);
 CWnd* GetInPlaceWindow();

 // Clipboard operations
 void CopyToClipboard(BOOL bIncludeLink = FALSE);
 DROPEFFECT DoDragDrop(LPCRECT lpItemRect, CPoint ptOffset,
  BOOL bIncludeLink = FALSE,
  DWORD dwEffects = DROPEFFECT_COPY|DROPEFFECT_MOVE,
  LPCRECT lpRectStartDrag = NULL);
 void GetClipboardData(COleDataSource* pDataSource,
  BOOL bIncludeLink = FALSE, LPPOINT lpOffset = NULL,
  LPSIZE lpSize = NULL);

 // called for creating a COleDataSource by CopyToClipboard and DoDragDrop
 virtual COleDataSource* OnGetClipboardData(BOOL bIncludeLink,
  LPPOINT lpOffset, LPSIZE lpSize);

 // Operations that apply to embedded items only
 void SetHostNames(LPCTSTR lpszHost, LPCTSTR lpszHostObj);
 void SetExtent(const CSize& size, DVASPECT nDrawAspect = DVASPECT_CONTENT);

 // Operations that apply to linked items only
 //  (link options are rarely changed, except through Links dialog)
 OLEUPDATE GetLinkUpdateOptions();
 void SetLinkUpdateOptions(OLEUPDATE dwUpdateOpt);

 // Link-source update status (also useful for embeddings that contain links)
 BOOL UpdateLink();  // make up-to-date
 BOOL IsLinkUpToDate() const;    // is link up-to-date

 // object conversion
 virtual BOOL ConvertTo(REFCLSID clsidNew);
 virtual BOOL ActivateAs(LPCTSTR lpszUserType, REFCLSID clsidOld, REFCLSID clsidNew);
 BOOL Reload();  // for lazy reload after ActivateAs

// Overridables (notifications of IAdviseSink, IOleClientSite and IOleInPlaceSite)
 // Callbacks/notifications from the server you must/should implement
 virtual void OnChange(OLE_NOTIFICATION nCode, DWORD dwParam);
  // implement OnChange to invalidate when item changes

protected:
 virtual void OnGetItemPosition(CRect& rPosition);
  // implement OnGetItemPosition if you support in-place activation

 // Common overrides for in-place activation
 virtual BOOL OnScrollBy(CSize sizeExtent);

 // Common overrides for applications supporting undo
 virtual void OnDiscardUndoState();
 virtual void OnDeactivateAndUndo();

public:
 virtual void OnDeactivateUI(BOOL bUndoable);

protected:
 // Common overrides for applications supporting links to embeddings
 virtual void OnShowItem();

 // Advanced overrides for in-place activation
 virtual void OnGetClipRect(CRect& rClipRect);
 virtual BOOL CanActivate();

public:
 virtual void OnActivate();
 virtual void OnActivateUI();
 virtual void OnDeactivate();

protected:
 virtual BOOL OnGetWindowContext(CFrameWnd** ppMainFrame,
  CFrameWnd** ppDocFrame, LPOLEINPLACEFRAMEINFO lpFrameInfo);
 virtual BOOL OnChangeItemPosition(const CRect& rectPos);
  // default calls SetItemRects and caches the pos rect

public:
 // Advanced overrides for menu/title handling (rarely overridden)
 virtual void OnInsertMenus(CMenu* pMenuShared,
  LPOLEMENUGROUPWIDTHS lpMenuWidths);
 virtual void OnSetMenu(CMenu* pMenuShared, HOLEMENU holemenu,
  HWND hwndActiveObject);
 virtual void OnRemoveMenus(CMenu* pMenuShared);
 virtual BOOL OnUpdateFrameTitle();

 // Advanced override for control bar handling
 virtual BOOL OnShowControlBars(CFrameWnd* pFrameWnd, BOOL bShow);

// Implementation
public:
 // data to support non-inplace activated items
 LPOLEOBJECT m_lpObject; // in case you want direct access to the OLE object
 LPVIEWOBJECT2 m_lpViewObject;// IViewObject for IOleObject above
 DWORD m_dwItemNumber;   // serial number for this item in this document
 DVASPECT m_nDrawAspect; // current default display aspect
 SCODE m_scLast;         // last error code encountered
 LPSTORAGE m_lpStorage;  // provides storage for m_lpObject
 LPLOCKBYTES m_lpLockBytes;  // part of implementation of m_lpStorage
 DWORD m_dwConnection;   // advise connection to the m_lpObject
 BYTE m_bLinkUnavail;    // TRUE if link is currently unavailable
 BYTE m_bMoniker;        // TRUE if moniker is assigned
 BYTE m_bLocked;         // TRUE if object has external lock
 BYTE m_bNeedCommit;     // TRUE if need CommitItem
 BYTE m_bClosing;        // TRUE if currently doing COleClientItem::Close
 BYTE m_bReserved[3];    // (reserved for future use)

 // for compound file support
 LPSTORAGE m_lpNewStorage;   // used during Save As situations

 // item state & item type
 ItemState m_nItemState; // item state (see ItemState enumeration)
 OLE_OBJTYPE m_nItemType;    // item type (depends on how created)

 // data valid when in-place activated
 CView* m_pView; // view when object is in-place activated
 DWORD m_dwContainerStyle;   // style of the container wnd before activation
 COleFrameHook* m_pInPlaceFrame;// frame window when in-place active
 COleFrameHook* m_pInPlaceDoc;   // doc window when in-place (may be NULL)
 HWND m_hWndServer;  // HWND of in-place server window

public:
 virtual ~COleClientItem();
 virtual void Serialize(CArchive& ar);
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

// Implementation
public:
 virtual BOOL ReportError(SCODE sc) const;
 virtual BOOL FreezeLink();  // converts to static: for edit links dialog

 DWORD GetNewItemNumber();   // generates new item number
 void GetItemName(LPTSTR lpszItemName) const; // gets readable item name

 void UpdateItemType();  // update m_nItemType

protected:
 // clipboard helpers
 void GetEmbeddedItemData(LPSTGMEDIUM lpStgMedium);
 void AddCachedData(COleDataSource* pDataSource);
 BOOL GetLinkSourceData(LPSTGMEDIUM lpStgMedium);
 void GetObjectDescriptorData(LPPOINT lpOffset, LPSIZE lpSize,
  LPSTGMEDIUM lpStgMedium);

 // interface helpers
 virtual LPOLECLIENTSITE GetClientSite();

 // helpers for printer-cached representation
 BOOL GetPrintDeviceInfo(LPOLECACHE* plpOleCache,
  DVTARGETDEVICE** pptd, DWORD* pdwConnection);

// Advanced Overridables for implementation
protected:
 virtual BOOL FinishCreate(SCODE sc);
 virtual void CheckGeneral(SCODE sc);

 virtual void OnDataChange(LPFORMATETC lpFormatEtc,
  LPSTGMEDIUM lpStgMedium);

public:
 // for storage hookability (override to use 'docfiles')
 virtual void GetItemStorage();  // allocate storage for new item
 virtual void ReadItem(CArchive& ar);    // read item from archive
 virtual void WriteItem(CArchive& ar);   // write item to archive
 virtual void CommitItem(BOOL bSuccess); // commit item's storage

 // compound & flat file implementations of above
 void GetItemStorageFlat();
 void ReadItemFlat(CArchive& ar);
 void WriteItemFlat(CArchive& ar);
 void GetItemStorageCompound();
 void ReadItemCompound(CArchive& ar);
 void WriteItemCompound(CArchive& ar);

// Interface Maps
public:
 BEGIN_INTERFACE_PART(OleClientSite, IOleClientSite)
  INIT_INTERFACE_PART(COleClientItem, OleClientSite)
  STDMETHOD(SaveObject)();
  STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  STDMETHOD(GetContainer)(LPOLECONTAINER*);
  STDMETHOD(ShowObject)();
  STDMETHOD(OnShowWindow)(BOOL);
  STDMETHOD(RequestNewObjectLayout)();
 END_INTERFACE_PART(OleClientSite)

 BEGIN_INTERFACE_PART(AdviseSink, IAdviseSink)
  INIT_INTERFACE_PART(COleClientItem, AdviseSink)
  STDMETHOD_(void,OnDataChange)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD_(void,OnViewChange)(DWORD, LONG);
  STDMETHOD_(void,OnRename)(LPMONIKER);
  STDMETHOD_(void,OnSave)();
  STDMETHOD_(void,OnClose)();
 END_INTERFACE_PART(AdviseSink)

 BEGIN_INTERFACE_PART(OleIPSite, IOleInPlaceSite)
  INIT_INTERFACE_PART(COleClientItem, OleIPSite)
  STDMETHOD(GetWindow)(HWND*);
  STDMETHOD(ContextSensitiveHelp)(BOOL);
  STDMETHOD(CanInPlaceActivate)();
  STDMETHOD(OnInPlaceActivate)();
  STDMETHOD(OnUIActivate)();
  STDMETHOD(GetWindowContext)(LPOLEINPLACEFRAME*,
   LPOLEINPLACEUIWINDOW*, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO);
  STDMETHOD(Scroll)(SIZE);
  STDMETHOD(OnUIDeactivate)(BOOL);
  STDMETHOD(OnInPlaceDeactivate)();
  STDMETHOD(DiscardUndoState)();
  STDMETHOD(DeactivateAndUndo)();
  STDMETHOD(OnPosRectChange)(LPCRECT);
 END_INTERFACE_PART(OleIPSite)

 DECLARE_INTERFACE_MAP()

// Friendship declarations (to avoid many public members)
 friend class COleUIWindow;
 friend class COleFrameWindow;
 friend class COleLinkingDoc;
};

class COleDocObjectItem : public COleClientItem
{
 friend class COleFrameHook;
 DECLARE_DYNAMIC(COleDocObjectItem)

// Constructors
public:
 COleDocObjectItem(COleDocument* pContainerDoc = NULL);

//Overridables
public:
 LPOLEDOCUMENTVIEW GetActiveView() const;
 virtual void Release(OLECLOSE dwCloseOption = OLECLOSE_NOSAVE);
 virtual void OnInsertMenus(CMenu* pMenuShared,
  LPOLEMENUGROUPWIDTHS lpMenuWidths);
 virtual void OnRemoveMenus(CMenu *pMenuShared);

// Operations
public:
 static BOOL OnPreparePrinting(CView* pCaller, CPrintInfo* pInfo,
  BOOL bPrintAll = TRUE);
 static void OnPrint(CView* pCaller, CPrintInfo* pInfo,
  BOOL bPrintAll = TRUE);
 BOOL GetPageCount(LPLONG pnFirstPage, LPLONG pcPages);
 HRESULT ExecCommand(DWORD nCmdID,
  DWORD nCmdExecOpt = OLECMDEXECOPT_DONTPROMPTUSER,
  const GUID* pguidCmdGroup = NULL);

// Implementation
public:
 virtual ~COleDocObjectItem();
 CMenu* m_pHelpPopupMenu;

protected:
 virtual void OnGetItemPosition(CRect& rPosition);
 virtual CMenu* GetHelpMenu(UINT& nPosition);
 void ActivateAndShow();
 LPOLEDOCUMENTVIEW m_pActiveView;
 LPPRINT m_pIPrint;
 BOOL SupportsIPrint();
 BOOL m_bInHelpMenu;

 BEGIN_INTERFACE_PART(OleDocumentSite, IOleDocumentSite)
  INIT_INTERFACE_PART(COleDocObjectItem, OleDocumentSite)
  STDMETHOD(ActivateMe)(LPOLEDOCUMENTVIEW pViewToActivate);
 END_INTERFACE_PART(OleDocumentSite)

 DECLARE_INTERFACE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// COleServerItem - IOleObject & IDataObject OLE component

#ifdef _AFXDLL
class COleServerItem : public CDocItem
#else
class AFX_NOVTABLE COleServerItem : public CDocItem
#endif
{
 DECLARE_DYNAMIC(COleServerItem)
protected:
 // NOTE: many members in this class are protected - since everything
 //   in this class is designed for implementing an OLE server.
 // Requests will come from OLE containers through non-C++ mechanisms,
 //   which will result in virtual functions in this class being called.

// Constructors
 COleServerItem(COleServerDoc* pServerDoc, BOOL bAutoDelete);
  // If your COleServerItem is an integral part of your data,
  //  bAutoDelete should be FALSE.  If your COleServerItem can be
  //  deleted when a link is released, it can be TRUE.

 COleDataSource* GetDataSource();
  // Use this data source to add conversion formats that your
  //  server should support.  Usually such formats are
  //  added in the item's constructor.

// Public Attributes
public:
 COleServerDoc* GetDocument() const; // return server document

 // naming (for links only)
 const CString& GetItemName() const; // get name of linked item
 void SetItemName(LPCTSTR lpszItemName);  // set name of linked item

 // link state
 BOOL IsConnected() const;   // returns TRUE if item has a client
 BOOL IsLinkedItem() const;  // returns TRUE if item is not embedded item

 // extents
 CSize m_sizeExtent;
  // HIMETRIC size -- the default implementation of OnSetExtent
  //  updates this member variable.  This member tells the server how
  //  much of the object is visible in the container document.

// Operations
public:
 void NotifyChanged(DVASPECT nDrawAspect = DVASPECT_CONTENT);
  // call this after you change item
 void CopyToClipboard(BOOL bIncludeLink = FALSE);
  // helper for implementing server 'copy to clipboard'
 DROPEFFECT DoDragDrop(LPCRECT lpRectItem, CPoint ptOffset,
  BOOL bIncludeLink = FALSE,
  DWORD dwEffects = DROPEFFECT_COPY|DROPEFFECT_MOVE,
  LPCRECT lpRectStartDrag = NULL);
 void GetClipboardData(COleDataSource* pDataSource,
  BOOL bIncludeLink = FALSE, LPPOINT lpOffset = NULL,
  LPSIZE lpSize = NULL);

// Overridables
 // overridables you must implement for yourself
 virtual BOOL OnDraw(CDC* pDC, CSize& rSize) = 0;
  // drawing for metafile format (return FALSE if not supported or error)
  //  (called for DVASPECT_CONTENT only)

 // overridables you may want to implement yourself
 virtual void OnUpdate(COleServerItem* pSender,
  LPARAM lHint, CObject* pHint, DVASPECT nDrawAspect);
  // the default implementation always calls NotifyChanged

 virtual BOOL OnDrawEx(CDC* pDC, DVASPECT nDrawAspect, CSize& rSize);
  // advanced drawing -- called for DVASPECT other than DVASPECT_CONTENT
 virtual BOOL OnSetExtent(DVASPECT nDrawAspect, const CSize& size);
 virtual BOOL OnGetExtent(DVASPECT nDrawAspect, CSize& rSize);
  // default implementation uses m_sizeExtent

 // overridables you do not have to implement
 virtual void OnDoVerb(LONG iVerb);
  // default routes to OnShow &/or OnOpen
 virtual BOOL OnSetColorScheme(const LOGPALETTE* lpLogPalette);
  // default does nothing
 virtual COleDataSource* OnGetClipboardData(BOOL bIncludeLink,
  LPPOINT lpOffset, LPSIZE lpSize);
  // called for access to clipboard data
 virtual BOOL OnQueryUpdateItems();
  // called to determine if there are any contained out-of-date links
 virtual void OnUpdateItems();
  // called to update any out-of-date links

protected:
 virtual void OnShow();
  // show item in the user interface (may edit in-place)
 virtual void OnOpen();
  // show item in the user interface (must open fully)
 virtual void OnHide();
  // hide document (and sometimes application)

 // very advanced overridables
public:
 virtual BOOL OnInitFromData(COleDataObject* pDataObject, BOOL bCreation);
  // initialize object from IDataObject

 // see COleDataSource for a description of these overridables
 virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
 virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
 virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  // HGLOBAL version will be called first, then CFile* version

 virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  BOOL bRelease);
  // Rare -- only if you support SetData (programmatic paste)

 // advanced helpers for CopyToClipboard
 void GetEmbedSourceData(LPSTGMEDIUM lpStgMedium);
 void AddOtherClipboardData(COleDataSource* pDataSource);
 BOOL GetLinkSourceData(LPSTGMEDIUM lpStgMedium);
 void GetObjectDescriptorData(LPPOINT lpOffset, LPSIZE lpSize,
  LPSTGMEDIUM lpStgMedium);

// Implementation
public:
 BOOL m_bNeedUnlock;             // if TRUE need to pDoc->LockExternal(FALSE)
 BOOL m_bAutoDelete;             // if TRUE will OnRelease will 'delete this'

 // special version of OnFinalRelease to implement document locking
 virtual void OnFinalRelease();

protected:
 CString m_strItemName;          // simple item name

public:
 LPOLEADVISEHOLDER m_lpOleAdviseHolder;  // may be NULL
 LPDATAADVISEHOLDER m_lpDataAdviseHolder;    // may be NULL

 virtual ~COleServerItem();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

 // implementation helpers
 void NotifyClient(OLE_NOTIFICATION wNotification, DWORD dwParam);
 LPDATAOBJECT GetDataObject();
 LPOLEOBJECT GetOleObject();
 LPMONIKER GetMoniker(OLEGETMONIKER nAssign);

protected:
 virtual BOOL GetMetafileData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM pmedium);
  // calls OnDraw or OnDrawEx
 virtual void OnSaveEmbedding(LPSTORAGE lpStorage);
 virtual BOOL IsBlank() const;

 // CItemDataSource implements OnRender reflections to COleServerItem
 class CItemDataSource : public COleDataSource
 {
 protected:
  // the GetData and SetData interfaces forward to m_pItem
  virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
  virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
  virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
   // HGLOBAL version will be called first, then CFile* version

  virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
   BOOL bRelease);
 };
 CItemDataSource m_dataSource;
  // data source used to implement IDataObject

// Interface Maps
//  (Note: these interface maps are used just for link implementation)
public:
 BEGIN_INTERFACE_PART(OleObject, IOleObject)
  INIT_INTERFACE_PART(COleServerItem, OleObject)
  STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
  STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
  STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
  STDMETHOD(Close)(DWORD);
  STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
  STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
  STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
  STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);
  STDMETHOD(EnumVerbs)(LPENUMOLEVERB*);
  STDMETHOD(Update)();
  STDMETHOD(IsUpToDate)();
  STDMETHOD(GetUserClassID)(LPCLSID);
  STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
  STDMETHOD(SetExtent)(DWORD, LPSIZEL);
  STDMETHOD(GetExtent)(DWORD, LPSIZEL);
  STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
  STDMETHOD(Unadvise)(DWORD);
  STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
  STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
  STDMETHOD(SetColorScheme)(LPLOGPALETTE);
 END_INTERFACE_PART(OleObject)

 BEGIN_INTERFACE_PART(DataObject, IDataObject)
  INIT_INTERFACE_PART(COleServerItem, DataObject)
  STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(QueryGetData)(LPFORMATETC);
  STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
  STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
  STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
  STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
  STDMETHOD(DUnadvise)(DWORD);
  STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
 END_INTERFACE_PART(DataObject)

 DECLARE_INTERFACE_MAP()

 friend class CItemDataSource;
 friend class COleServerDoc;
 friend class COleLinkingDoc;
};

/////////////////////////////////////////////////////////////////////////////
// COleLinkingDoc -
//  (enables linking to embeddings - beginnings of server fuctionality)

class COleLinkingDoc : public COleDocument
{
 DECLARE_DYNAMIC(COleLinkingDoc)

// Constructors
public:
 COleLinkingDoc();

// Operations
 BOOL Register(COleObjectFactory* pFactory, LPCTSTR lpszPathName);
  // notify the running object table and connect to pServer
 void Revoke();
  // revoke from running object table

// Overridables
protected:
 virtual COleServerItem* OnGetLinkedItem(LPCTSTR lpszItemName);
  // return item for the named linked item (for supporting links)
 virtual COleClientItem* OnFindEmbeddedItem(LPCTSTR lpszItemName);
  // return item for the named embedded item (for links to embeddings)

// Implementation
public:
 COleObjectFactory* m_pFactory;  // back-pointer to server

#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif
 virtual ~COleLinkingDoc();

 // overrides for updating of monikers & running object table registration
 virtual BOOL OnNewDocument();
 virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
 virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
 virtual void OnCloseDocument();
 virtual LPOLEITEMCONTAINER GetContainer();
 virtual LPMONIKER GetMoniker(OLEGETMONIKER nAssign);

 // special handling of error messages during save/load
 virtual void ReportSaveLoadException(LPCTSTR lpszPathName,
  CException* e, BOOL bSaving, UINT nIDPDefault);
 void BeginDeferErrors();
 SCODE EndDeferErrors(SCODE sc);

protected:
 BOOL m_bDeferErrors;    // TRUE if in non-interactive OLE mode
 CException* m_pLastException;

 DWORD m_dwRegister;     // file moniker's registration in the ROT
 LPMONIKER m_lpMonikerROT; // file moniker that is registered
 CString m_strMoniker;   // filename used to create moniker
 BOOL m_bVisibleLock;    // TRUE if user is holding lock on document

 // implementation helpers
 virtual BOOL RegisterIfServerAttached(LPCTSTR lpszPathName, BOOL bMessage);
 void LockExternal(BOOL bLock, BOOL bRemoveRefs);
 void UpdateVisibleLock(BOOL bVisible, BOOL bRemoveRefs);
 virtual void OnShowViews(BOOL bVisible);

 virtual void SaveToStorage(CObject* pObject = NULL);

// Interface Maps
public:
 BEGIN_INTERFACE_PART(PersistFile, IPersistFile)
  INIT_INTERFACE_PART(COleLinkingDoc, PersistFile)
  STDMETHOD(GetClassID)(LPCLSID);
  STDMETHOD(IsDirty)();
  STDMETHOD(Load)(LPCOLESTR, DWORD);
  STDMETHOD(Save)(LPCOLESTR, BOOL);
  STDMETHOD(SaveCompleted)(LPCOLESTR);
  STDMETHOD(GetCurFile)(LPOLESTR*);
 END_INTERFACE_PART(PersistFile)

 BEGIN_INTERFACE_PART(OleItemContainer, IOleItemContainer)
  INIT_INTERFACE_PART(COleLinkingDoc, OleItemContainer)
  STDMETHOD(ParseDisplayName)(LPBC, LPOLESTR, ULONG*, LPMONIKER*);
  STDMETHOD(EnumObjects)(DWORD, LPENUMUNKNOWN*);
  STDMETHOD(LockContainer)(BOOL);
  STDMETHOD(GetObject)(LPOLESTR, DWORD, LPBINDCTX, REFIID, LPVOID*);
  STDMETHOD(GetObjectStorage)(LPOLESTR, LPBINDCTX, REFIID, LPVOID*);
  STDMETHOD(IsRunning)(LPOLESTR);
 END_INTERFACE_PART(OleItemContainer)

 DECLARE_INTERFACE_MAP()

 friend class COleClientItem;
 friend class COleClientItem::XOleClientSite;
 friend class COleServerItem::XOleObject;
};

//////////////////////////////////////////////////////////////////////////////
// COleServerDoc - registered server document containing COleServerItems

#ifdef _AFXDLL
class COleServerDoc : public COleLinkingDoc
#else
class AFX_NOVTABLE COleServerDoc : public COleLinkingDoc
#endif
{
 DECLARE_DYNAMIC(COleServerDoc)

// Constructors and Destructors
public:
 COleServerDoc();

// Attributes
 BOOL IsEmbedded() const;    // TRUE if document is an embedding
 BOOL IsDocObject() const;   // TRUE if document is a DocObject
 COleServerItem* GetEmbeddedItem();
  // return embedded item for document (will allocate if necessary)

 // attributes specific to in-place activation
 BOOL IsInPlaceActive() const;
 void GetItemPosition(LPRECT lpPosRect) const;
  // get current position rectangle of in-place edit
 void GetItemClipRect(LPRECT lpClipRect) const;
  // get current clipping rectangle of in-place edit
 BOOL GetZoomFactor(LPSIZE lpSizeNum = NULL, LPSIZE lpSizeDenom = NULL,
  LPCRECT lpPosRect = NULL) const;
  // returns the zoom factor in pixels

// Operations
 void NotifyChanged();
  // call this after you change some global attribute like
  //  document dimensions
 void UpdateAllItems(COleServerItem* pSender,
  LPARAM lHint = 0L, CObject* pHint = NULL,
  DVASPECT nDrawAspect = DVASPECT_CONTENT);

 // changes to the entire document (automatically notifies clients)
 void NotifyRename(LPCTSTR lpszNewName);
 void NotifySaved();
 void NotifyClosed();        // call this after you close document

 // specific operations for embedded documents
 void SaveEmbedding();       // call this to save embedded (before closing)

 // specific to in-place activation
 BOOL ActivateInPlace();
 void ActivateDocObject();
 void RequestPositionChange(LPCRECT lpPosRect);
 BOOL ScrollContainerBy(CSize sizeScroll);
 BOOL DeactivateAndUndo();
 BOOL DiscardUndoState();

public:
// Overridables for standard user interface (full server)
 virtual BOOL OnUpdateDocument(); // implementation of embedded update

protected:
// Overridables you must implement for yourself
 virtual COleServerItem* OnGetEmbeddedItem() = 0;
  // return item representing entire (embedded) document

// Overridables you do not have to implement
 virtual void OnClose(OLECLOSE dwCloseOption);
 virtual void OnSetHostNames(LPCTSTR lpszHost, LPCTSTR lpszHostObj);
 virtual HRESULT OnExecOleCmd(const GUID* pguidCmdGroup, DWORD nCmdID,
  DWORD nCmdExecOpt, VARIANTARG* pvarargIn, VARIANTARG* pvarargOut);
 virtual CDocObjectServer* GetDocObjectServer(LPOLEDOCUMENTSITE pDocSite);

// Advanced overridables
 LPUNKNOWN GetInterfaceHook(const void* piid);
 virtual void OnShowDocument(BOOL bShow);
  // show first frame for document or hide all frames for document

// Advanced overridables for in-place activation
public:
 virtual void OnDeactivate();
 virtual void OnDeactivateUI(BOOL bUndoable);

protected:
 virtual void OnSetItemRects(LPCRECT lpPosRect, LPCRECT lpClipRect);
 virtual BOOL OnReactivateAndUndo();

 virtual void OnFrameWindowActivate(BOOL bActivate);
 virtual void OnDocWindowActivate(BOOL bActivate);
 virtual void OnShowControlBars(CFrameWnd* pFrameWnd, BOOL bShow);
 virtual COleIPFrameWnd* CreateInPlaceFrame(CWnd* pParentWnd);
 virtual void DestroyInPlaceFrame(COleIPFrameWnd* pFrameWnd);
public:
 virtual void OnResizeBorder(LPCRECT lpRectBorder,
  LPOLEINPLACEUIWINDOW lpUIWindow, BOOL bFrame);

// Implementation
protected:
 LPOLECLIENTSITE m_lpClientSite;     // for embedded item
 CString m_strHostObj;               // name of document in container
 BOOL m_bCntrVisible;                // TRUE if OnShowWindow(TRUE) called
 BOOL m_bClosing;                    // TRUE if shutting down
 COleServerItem* m_pEmbeddedItem;    // pointer to embedded item for document

 COleIPFrameWnd* m_pInPlaceFrame;    // not NULL if in-place activated
 CWnd* m_pOrigParent;                // not NULL if existing view used
 DWORD m_dwOrigStyle;                // original style of in-place view
 DWORD m_dwOrigStyleEx;              // original extended style

 CDocObjectServer* m_pDocObjectServer;  // if DocObject, ptr to doc site

public:
 virtual ~COleServerDoc();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

 // overridables for implementation
 virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
 virtual void OnCloseDocument();
 virtual void DeleteContents(); // delete auto-delete server items
 virtual LPMONIKER GetMoniker(OLEGETMONIKER nAssign);
 virtual COleServerItem* OnGetLinkedItem(LPCTSTR lpszItemName);
  // return item for the named linked item (only if supporting links)
 virtual BOOL CanCloseFrame(CFrameWnd* pFrame);

protected:
 // overrides to handle server user-interface
 virtual BOOL SaveModified();        // return TRUE if ok to continue
 virtual HMENU GetDefaultMenu();     // return menu based on doc type
 virtual HACCEL GetDefaultAccelerator(); // return accel table based on doc type
 virtual BOOL GetFileTypeString(CString& rString);

 // IPersistStorage implementation
 virtual void OnNewEmbedding(LPSTORAGE lpStorage);
 virtual void OnOpenEmbedding(LPSTORAGE lpStorage);
 virtual void OnSaveEmbedding(LPSTORAGE lpStorage);

 // Implementation helpers
 void NotifyAllItems(OLE_NOTIFICATION wNotification, DWORD dwParam);
 BOOL SaveModifiedPrompt();
 void ConnectView(CWnd* pParentWnd, CView* pView);
 void UpdateUsingHostObj(UINT nIDS, CCmdUI* pCmdUI);

// Message Maps
 //{{AFX_MSG(COleServerDoc)
 afx_msg void OnFileUpdate();
 afx_msg void OnFileSaveCopyAs();
 afx_msg void OnUpdateFileUpdate(CCmdUI* pCmdUI);
 afx_msg void OnUpdateFileExit(CCmdUI* pCmdUI);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()

// Interface Maps
public:
 BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
  INIT_INTERFACE_PART(COleServerDoc, PersistStorage)
  STDMETHOD(GetClassID)(LPCLSID);
  STDMETHOD(IsDirty)();
  STDMETHOD(InitNew)(LPSTORAGE);
  STDMETHOD(Load)(LPSTORAGE);
  STDMETHOD(Save)(LPSTORAGE, BOOL);
  STDMETHOD(SaveCompleted)(LPSTORAGE);
  STDMETHOD(HandsOffStorage)();
 END_INTERFACE_PART(PersistStorage)

 BEGIN_INTERFACE_PART(OleObject, IOleObject)
  INIT_INTERFACE_PART(COleServerDoc, OleObject)
  STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
  STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
  STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
  STDMETHOD(Close)(DWORD);
  STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
  STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
  STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
  STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);
  STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
  STDMETHOD(Update)();
  STDMETHOD(IsUpToDate)();
  STDMETHOD(GetUserClassID)(CLSID*);
  STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
  STDMETHOD(SetExtent)(DWORD, LPSIZEL);
  STDMETHOD(GetExtent)(DWORD, LPSIZEL);
  STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
  STDMETHOD(Unadvise)(DWORD);
  STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
  STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
  STDMETHOD(SetColorScheme)(LPLOGPALETTE);
 END_INTERFACE_PART(OleObject)

 BEGIN_INTERFACE_PART(DataObject, IDataObject)
  INIT_INTERFACE_PART(COleServerDoc, DataObject)
  STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
  STDMETHOD(QueryGetData)(LPFORMATETC);
  STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
  STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
  STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
  STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
  STDMETHOD(DUnadvise)(DWORD);
  STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
 END_INTERFACE_PART(DataObject)

 BEGIN_INTERFACE_PART(OleInPlaceObject, IOleInPlaceObject)
  INIT_INTERFACE_PART(COleServerDoc, OleInPlaceObject)
  STDMETHOD(GetWindow)(HWND*);
  STDMETHOD(ContextSensitiveHelp)(BOOL);
  STDMETHOD(InPlaceDeactivate)();
  STDMETHOD(UIDeactivate)();
  STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT);
  STDMETHOD(ReactivateAndUndo)();
 END_INTERFACE_PART(OleInPlaceObject)

 BEGIN_INTERFACE_PART(OleInPlaceActiveObject, IOleInPlaceActiveObject)
  INIT_INTERFACE_PART(COleServerDoc, OleInPlaceActiveObject)
  STDMETHOD(GetWindow)(HWND*);
  STDMETHOD(ContextSensitiveHelp)(BOOL);
  STDMETHOD(TranslateAccelerator)(LPMSG);
  STDMETHOD(OnFrameWindowActivate)(BOOL);
  STDMETHOD(OnDocWindowActivate)(BOOL);
  STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
  STDMETHOD(EnableModeless)(BOOL);
 END_INTERFACE_PART(OleInPlaceActiveObject)

 DECLARE_INTERFACE_MAP()

 friend class COleServer;
 friend class COleServerItem;
 friend class CDocObjectServer;
};

//////////////////////////////////////////////////////////////////////////////
// COleIPFrameWnd

class COleCntrFrameWnd;

class COleIPFrameWnd : public CFrameWnd
{
 DECLARE_DYNCREATE(COleIPFrameWnd)

// Constructors
public:
 COleIPFrameWnd();

// Overridables
public:
 virtual BOOL OnCreateControlBars(CWnd* pWndFrame, CWnd* pWndDoc);
  // create control bars on container windows (pWndDoc can be NULL)
 virtual BOOL OnCreateControlBars(CFrameWnd* pWndFrame, CFrameWnd* pWndDoc);
  // create control bars on container windows (pWndDoc can be NULL)

 virtual void RepositionFrame(LPCRECT lpPosRect, LPCRECT lpClipRect);
  // Advanced: reposition frame to wrap around new lpPosRect

// Implementation
public:
 BOOL m_bUIActive;   // TRUE if currently in uiacitve state

 virtual BOOL LoadFrame(UINT nIDResource,
  DWORD dwDefaultStyle = WS_CHILD|WS_BORDER|WS_CLIPSIBLINGS,
  CWnd* pParentWnd = NULL,
  CCreateContext* pContext = NULL);
 virtual void RecalcLayout(BOOL bNotify = TRUE);
 virtual BOOL PreTranslateMessage(MSG* pMsg);
 virtual LRESULT OnSetMessageString(WPARAM wParam, LPARAM lParam);
 virtual ~COleIPFrameWnd();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:
 // in-place state
 OLEINPLACEFRAMEINFO m_frameInfo;
 LPOLEINPLACEFRAME m_lpFrame;
 LPOLEINPLACEUIWINDOW m_lpDocFrame;
 COleCntrFrameWnd* m_pMainFrame;
 COleCntrFrameWnd* m_pDocFrame;

 HMENU m_hSharedMenu;
 OLEMENUGROUPWIDTHS m_menuWidths;
 HOLEMENU m_hOleMenu;
 CRect m_rectPos;            // client area rect of the item
 CRect m_rectClip;           // area to which frame should be clipped
 BOOL m_bInsideRecalc;

 HMENU _m_Reserved;

 // Advanced: in-place activation virtual implementation
 virtual BOOL BuildSharedMenu();
 virtual void DestroySharedMenu();
 virtual HMENU GetInPlaceMenu();

 // Advanced: possible override to change in-place sizing behavior
 virtual void OnRequestPositionChange(LPCRECT lpRect);

protected:
 //{{AFX_MSG(COleIPFrameWnd)
 afx_msg void OnSize(UINT nType, int cx, int cy);
 afx_msg LRESULT OnRecalcParent(WPARAM wParam, LPARAM lParam);
 afx_msg void OnIdleUpdateCmdUI();
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnDestroy();
 afx_msg LRESULT OnResizeChild(WPARAM wParam, LPARAM lParam);
 afx_msg void OnContextHelp();
 afx_msg void OnUpdateControlBarMenu(CCmdUI* pCmdUI);
 afx_msg BOOL OnBarCheck(UINT nID);
 afx_msg void OnWindowPosChanging(LPWINDOWPOS lpWndPos);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()

 friend class COleServerDoc;
 friend class COleCntrFrameWnd;
 friend class CDocObjectServer;
};

/////////////////////////////////////////////////////////////////////////////
// COleResizeBar - supports in-place resizing in server applications

class COleResizeBar : public CControlBar
{
 DECLARE_DYNAMIC(COleResizeBar)

// Constructors
public:
 COleResizeBar();
 BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE,
  UINT nID = AFX_IDW_RESIZE_BAR);

// Implementation
public:
 virtual ~COleResizeBar();
 virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);

protected:
 CRectTracker m_tracker;     // implemented with a tracker

protected:
 //{{AFX_MSG(COleResizeBar)
 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 afx_msg void OnPaint();
 afx_msg void OnSize(UINT nType, int cx, int cy);
 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
 afx_msg void OnLButtonDown(UINT, CPoint point);
 afx_msg LRESULT OnSizeParent(WPARAM wParam, LPARAM lParam);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// COleStreamFile - implementation of CFile which uses an IStream

class COleStreamFile : public CFile
{
 DECLARE_DYNAMIC(COleStreamFile)

// Constructors and Destructors
public:
 COleStreamFile(LPSTREAM lpStream = NULL);

// Operations
 // Note: OpenStream and CreateStream can accept eith STGM_ flags or
 //  CFile::OpenFlags bits since common values are guaranteed to have
 //  the same semantics.
 BOOL OpenStream(LPSTORAGE lpStorage, LPCTSTR lpszStreamName,
  DWORD nOpenFlags = modeReadWrite|shareExclusive,
  CFileException* pError = NULL);
 BOOL CreateStream(LPSTORAGE lpStorage, LPCTSTR lpszStreamName,
  DWORD nOpenFlags = modeReadWrite|shareExclusive|modeCreate,
  CFileException* pError = NULL);

 BOOL CreateMemoryStream(CFileException* pError = NULL);

 // attach & detach can be used when Open/Create functions aren't adequate
 void Attach(LPSTREAM lpStream);
 LPSTREAM Detach();

 IStream* GetStream() const;
 // Returns the current stream

// Implementation
public:
 LPSTREAM m_lpStream;
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif
 virtual ~COleStreamFile();

 // attributes for implementation
 BOOL GetStatus(CFileStatus& rStatus) const;
 virtual DWORD GetPosition() const;

 virtual const CString GetStorageName() const;

 // overrides for implementation
 virtual CFile* Duplicate() const;
 virtual LONG Seek(LONG lOff, UINT nFrom);
 virtual void SetLength(DWORD dwNewLen);
 virtual DWORD GetLength() const;
 virtual UINT Read(void* lpBuf, UINT nCount);
 virtual void Write(const void* lpBuf, UINT nCount);
 virtual void LockRange(DWORD dwPos, DWORD dwCount);
 virtual void UnlockRange(DWORD dwPos, DWORD dwCount);
 virtual void Abort();
 virtual void Flush();
 virtual void Close();

protected:
 CString m_strStorageName;
};

/////////////////////////////////////////////////////////////////////////////
// CMonikerFile - implementation of COleStreamFile that uses an IMoniker to
//                get the IStream

class CMonikerFile: public COleStreamFile
{
 DECLARE_DYNAMIC(CMonikerFile)

public:
 CMonikerFile();

 virtual BOOL Open(LPCTSTR lpszURL, CFileException* pError=NULL);
 // Uses synchronous URLMonikers to create a moniker.
 // Opens the URL specified.
 // If provided, pError will be set in case of error.
 // Return value: TRUE if successful, FALSE otherwise.

 virtual BOOL Open(IMoniker* pMoniker, CFileException* pError=NULL);
 // Binds to the provided moniker to obtain a stream.
 // If provided, pError will be set in case of error.
 // Return value: TRUE if successful, FALSE otherwise.

 virtual void Close();
 // Detaches the stream, Release()s it, and the moniker.  Close may be
 // called on unopened, or already closed streams.

 BOOL Detach(CFileException* pError = NULL);
 // Closes the stream.  If there is an error when closing, then the
 // error code will be placed in pError and the function will return FALSE.

 IMoniker* GetMoniker() const;
 // Returns the current moniker.  The moniker returned is not AddRef()'ed.

protected:
// Overidables
 IBindCtx* CreateBindContext(CFileException* pError);
 // A hook so users can provide a particular IBindCtx, potentially one
 // on which the user has registered one or more objects.

// Implementation
protected:
 virtual BOOL Open(LPCTSTR lpszUrl, IBindHost* pBindHost,
  IBindStatusCallback* pBSC, IBindCtx* pBindCtx, CFileException* pError);
 BOOL Attach(LPCTSTR lpszUrl, IBindHost* pBindHost,
  IBindStatusCallback* pBSC, IBindCtx* pBindCtx, CFileException* pError);
 virtual BOOL Open(IMoniker* pMoniker, IBindHost* pBindHost,
  IBindStatusCallback* pBSC, IBindCtx* pBindCtx, CFileException* pError);

 BOOL Attach(IMoniker* pMoniker, IBindHost* pBindHost,
  IBindStatusCallback* pBSC, IBindCtx* pBindCtx, CFileException* pError);

 virtual BOOL PostBindToStream(CFileException* pError);

 static IBindHost* CreateBindHost();
public:
 virtual ~CMonikerFile();
 // Closes the stream, and releases the moniker if needed.

 virtual void Flush();

#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
 // Calls COleStreamFile::Dump(), and prints out moniker value.
#endif

protected:
 IPTR(IMoniker) m_Moniker;
 // The moniker provided or created to which this class is bound.

 CMonikerFile(const CMonikerFile&);
 // Prevents copying.
};

/////////////////////////////////////////////////////////////////////////////
// CAsyncMonikerFile - implementation of COleStreamFile that uses an
//                     asynchronous IMoniker to get the IStream

class _AfxBindStatusCallback; // Forward declaration

class CAsyncMonikerFile: public CMonikerFile
{
 DECLARE_DYNAMIC(CAsyncMonikerFile)

public:
 CAsyncMonikerFile();
 // Creates the IBindStatusCallback used internally to provide asynchronous
 // operation.

 //All Open overloads call one of these two.
 virtual BOOL Open(LPCTSTR lpszURL, IBindHost* pBindHost,
  CFileException* pError=NULL);
 virtual BOOL Open(IMoniker* pMoniker, IBindHost* pBindHost,
  CFileException* pError=NULL);

 //Open overloads that take monikers
 virtual BOOL Open(IMoniker* pMoniker, CFileException* pError=NULL);
 virtual BOOL Open(IMoniker* pMoniker, IServiceProvider* pServiceProvider,
  CFileException* pError=NULL);
 virtual BOOL Open(IMoniker* pMoniker, IUnknown* pUnknown,
  CFileException* pError=NULL);

 //Open overloads that take strings
 virtual BOOL Open(LPCTSTR lpszURL, CFileException* pError=NULL);
 virtual BOOL Open(LPCTSTR lpszURL, IServiceProvider* pServiceProvider,
  CFileException* pError=NULL);
 virtual BOOL Open(LPCTSTR lpszURL, IUnknown* pUnknown,
  CFileException* pError=NULL);

 virtual void Close();

 IBinding* GetBinding() const;
 // Returns the binding provided when the asychronous transfer begins.
 // With the IBinding*, the user may abort, or pause the transfer.
 // NULL may be returned if for any reason the transfer could not be
 // made asynchronous, or if the IBinding* has not yet been provided by
 // the system.

 FORMATETC* GetFormatEtc() const;
 // Returns the FORMATETC for the currently opened stream.  NULL will be
 // returned if this is called from outside the context of OnDataAvailable.
 // If you want to keep the FORMATETC beyond this call, make a copy of it.
 // The FORMATETC indicates the format of the data in the stream.

protected:
// Overidables
 virtual IUnknown* CreateBindStatusCallback(IUnknown* pUnkControlling);

 virtual DWORD GetBindInfo() const;
 // Returns the settings returned by IBindStatusCallback::GetBindInfo.
 // The default values returned should work for most cases and should not
 // be changed lightly.

 virtual LONG GetPriority() const;
 // Returns the priority at which the asynchronous transfer will take
 // place.  The value is one of the standard thread priority flags.
 // By default THREAD_PRIORITY_NORMAL is returned.

 virtual void OnDataAvailable(DWORD dwSize, DWORD bscfFlag);
 // Called when there is data available to be read.  dwSize indicates
 // the cumulative number of bytes which can be read.  The bscfFlag may be used
 // to identify first, last, and intermediate blocks of data.

 virtual void OnLowResource();
 // This is called when resources are low.

 virtual void OnStartBinding();
 // Called when the binding is starting up.

 virtual void OnProgress(ULONG ulProgress, ULONG ulProgressMax,
  ULONG ulStatusCode, LPCTSTR szStatusText);

 virtual void OnStopBinding(HRESULT hresult, LPCTSTR szError);
 // Called when the transfer is stopped.  This function releases the
 // IBinding and should nearly always be call when overidden.

// Implementation
public:
 virtual ~CAsyncMonikerFile();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
 // Calls CMonikerFile::Dump(), and prints out IBinding,
 // IBindStatusCallback, and m_pFormatEtc values.
#endif
 virtual UINT Read(void* lpBuf, UINT nCount);

protected:
 friend class _AfxBindStatusCallback;
 _AfxBindStatusCallback* m_pAfxBSCCurrent;
 BOOL m_bStopBindingReceived;
 void EndCallbacks();

 IPTR(IBinding) m_Binding;
 FORMATETC* m_pFormatEtc;

 void SetBinding(IBinding* pBinding);
 // Sets and AddRefs m_Binding

 void SetFormatEtc(FORMATETC* pFormatEtc);
 // Sets the FORMATETC for the current stream.

 virtual BOOL PostBindToStream(CFileException* pError);
};

/////////////////////////////////////////////////////////////////////////////
// COleDropSource (advanced drop source support)

class COleDropSource : public CCmdTarget
{
// Constructors
public:
 COleDropSource();

// Overridables
 virtual SCODE QueryContinueDrag(BOOL bEscapePressed, DWORD dwKeyState);
 virtual SCODE GiveFeedback(DROPEFFECT dropEffect);
 virtual BOOL OnBeginDrag(CWnd* pWnd);

// Implementation
public:
#ifdef _DEBUG
 virtual void Dump(CDumpContext& dc) const;
#endif

public:
 BEGIN_INTERFACE_PART(DropSource, IDropSource)
  INIT_INTERFACE_PART(COleDropSource, DropSource)
  STDMETHOD(QueryContinueDrag)(BOOL, DWORD);
  STDMETHOD(GiveFeedback)(DWORD);
 END_INTERFACE_PART(DropSource)

 DECLARE_INTERFACE_MAP()

 CRect m_rectStartDrag;  // when mouse leaves this rect, drag drop starts
 BOOL m_bDragStarted;    // has drag really started yet?
 DWORD m_dwButtonCancel; // which button will cancel (going down)
 DWORD m_dwButtonDrop;   // which button will confirm (going up)

 // metrics for drag start determination
 static AFX_DATA UINT nDragMinDist;  // min. amount mouse must move for drag
 static AFX_DATA UINT nDragDelay;    // delay before drag starts

 friend class COleDataSource;
};

/////////////////////////////////////////////////////////////////////////////
// COleDropTarget (advanced drop target support)

class COleDropTarget : public CCmdTarget
{
// Constructors
public:
 COleDropTarget();

// Operations
 BOOL Register(CWnd* pWnd);
 virtual void Revoke();  // virtual for implementation

// Overridables
 virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject,
  DWORD dwKeyState, CPoint point);
 virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject,
  DWORD dwKeyState, CPoint point);
 virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
  DROPEFFECT dropEffect, CPoint point);
 virtual DROPEFFECT OnDropEx(CWnd* pWnd, COleDataObject* pDataObject,
  DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point);
 virtual void OnDragLeave(CWnd* pWnd);
 virtual DROPEFFECT OnDragScroll(CWnd* pWnd, DWORD dwKeyState,
  CPoint point);

// Implementation
public:
 virtual ~COleDropTarget();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:
 HWND m_hWnd;            // HWND this IDropTarget is attached to
 LPDATAOBJECT m_lpDataObject;    // != NULL between OnDragEnter, OnDragLeave
 UINT m_nTimerID;        // != MAKEWORD(-1, -1) when in scroll area
 DWORD m_dwLastTick;     // only valid when m_nTimerID valid
 UINT m_nScrollDelay;    // time to next scroll

 // metrics for drag-scrolling
 static AFX_DATA int nScrollInset;
 static AFX_DATA UINT nScrollDelay;
 static AFX_DATA UINT nScrollInterval;

 // implementation helpers
 void SetupTimer(CView* pView, UINT nTimerID);
 void CancelTimer(CWnd* pWnd);

// Interface Maps
public:
 BEGIN_INTERFACE_PART(DropTarget, IDropTarget)
  INIT_INTERFACE_PART(COleDropTarget, DropTarget)
  STDMETHOD(DragEnter)(LPDATAOBJECT, DWORD, POINTL, LPDWORD);
  STDMETHOD(DragOver)(DWORD, POINTL, LPDWORD);
  STDMETHOD(DragLeave)();
  STDMETHOD(Drop)(LPDATAOBJECT, DWORD, POINTL pt, LPDWORD);
 END_INTERFACE_PART(DropTarget)

 DECLARE_INTERFACE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// COleMessageFilter (implements IMessageFilter)

class COleMessageFilter : public CCmdTarget
{
// Constructors
public:
 COleMessageFilter();

// Operations
 BOOL Register();
 void Revoke();

 // for controlling the busy state of the server application (called app)
 virtual void BeginBusyState();
 virtual void EndBusyState();
 void SetBusyReply(SERVERCALL nBusyReply);

 // for controlling actions taken against rejected/retried calls
 void SetRetryReply(DWORD nRetryReply = 0);
  // only used when the "not responding" dialog is disabled
 void SetMessagePendingDelay(DWORD nTimeout = 5000);
  // used to determine amount of time before significant message
 void EnableBusyDialog(BOOL bEnableBusy = TRUE);
 void EnableNotRespondingDialog(BOOL bEnableNotResponding = TRUE);
  // used to enable/disable the two types of busy dialogs

// Overridables
 virtual BOOL OnMessagePending(const MSG* pMsg);
  // return TRUE to eat the message (usually only if processed)

// Implementation
public:
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif
 virtual ~COleMessageFilter();
 virtual BOOL IsSignificantMessage(MSG* pMsg);
  // determine if any significant messages are present in the queue
 virtual int OnBusyDialog(HTASK htaskBusy);
 virtual int OnNotRespondingDialog(HTASK htaskBusy);
  // these functions display the busy dialog

protected:
 BOOL m_bRegistered;
 LONG m_nBusyCount;  // for BeginBusyState & EndBusyState
 BOOL m_bEnableBusy;
 BOOL m_bEnableNotResponding;
 BOOL m_bUnblocking;
 DWORD m_nRetryReply;    // only used if m_bEnableNotResponding == FALSE
 DWORD m_nBusyReply;
 DWORD m_nTimeout;

// Interface Maps
public:
 BEGIN_INTERFACE_PART(MessageFilter, IMessageFilter)
  INIT_INTERFACE_PART(COleMessageFilter, MessageFilter)
  STDMETHOD_(DWORD, HandleInComingCall)(DWORD, HTASK, DWORD,
   LPINTERFACEINFO);
  STDMETHOD_(DWORD, RetryRejectedCall)(HTASK, DWORD, DWORD);
  STDMETHOD_(DWORD, MessagePending)(HTASK, DWORD, DWORD);
 END_INTERFACE_PART(MessageFilter)

 DECLARE_INTERFACE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// message map entries for OLE verbs

#define ON_STDOLEVERB(iVerb, memberFxn) \
 { 0xC002, 0, (UINT)iVerb, (UINT)iVerb, (UINT)-1, \
  (AFX_PMSG)(BOOL (AFX_MSG_CALL CCmdTarget::*)(LPMSG, HWND, LPCRECT))&memberFxn },

#define ON_OLEVERB(idsVerbName, memberFxn) \
 { 0xC002, 0, 1, 1, idsVerbName, \
  (AFX_PMSG)(BOOL (AFX_MSG_CALL CCmdTarget::*)(LPMSG, HWND, LPCRECT))&memberFxn },

/////////////////////////////////////////////////////////////////////////////
// global helpers and debugging

void AFXAPI AfxOleSetEditMenu(COleClientItem* pClient, CMenu* pMenu,
 UINT iMenuItem, UINT nIDVerbMin, UINT nIDVerbMax = 0, UINT nIDConvert = 0);

#ifdef _DEBUG
// Mapping SCODEs to readable text
LPCTSTR AFXAPI AfxGetFullScodeString(SCODE sc);
LPCTSTR AFXAPI AfxGetScodeString(SCODE sc);
LPCTSTR AFXAPI AfxGetScodeRangeString(SCODE sc);
LPCTSTR AFXAPI AfxGetSeverityString(SCODE sc);
LPCTSTR AFXAPI AfxGetFacilityString(SCODE sc);

// Mapping IIDs to readable text
LPCTSTR AFXAPI AfxGetIIDString(REFIID iid);
#endif

/////////////////////////////////////////////////////////////////////////////
// Inline function declarations

#ifdef _AFX_PACKING
#pragma pack(pop)
#endif

#ifdef _AFX_ENABLE_INLINES
#define _AFXOLE_INLINE AFX_INLINE
#define _AFXOLECLI_INLINE AFX_INLINE
#define _AFXOLESVR_INLINE AFX_INLINE
#define _AFXOLEDOBJ_INLINE AFX_INLINE
#define _AFXOLEMONIKER_INLINE AFX_INLINE
#include <afxole.inl>
#undef _AFXOLE_INLINE
#undef _AFXOLECLI_INLINE
#undef _AFXOLESVR_INLINE
#undef _AFXOLEDOBJ_INLINE
#undef _AFXOLEMONIKER_INLINE
#endif

#undef AFX_DATA
#define AFX_DATA

#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif

#endif //__AFXOLE_H__

/////////////////////////////////////////////////////////////////////////////

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    TMS320C55x DSP 库
    TMS320C54x DSP 库
    DSP5410实现PN码(汇编源代码…
    用于TMS320VC5502的语言压缩…
    在DSP上实现DCT的三角波/方波…
    在DSP上实现DCT的三角波/方波…
    在DSP上实现DCT的三角波/方波…
    TMS320VC5402下电话接口的简…
    TMS320C54XX DSP的串行口试验…
    TMS320C54XXDSP的定时器试验…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号