PATRON.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * PATRON.H
  3.  * Patron Chapter 22
  4.  *
  5.  * Single include file that pulls in everything needed for other
  6.  * source files in the application.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14. #ifndef _PATRON_H_
  15. #define _PATRON_H_
  16. #define INC_CLASSLIB
  17. #define INC_OLEUI
  18. //CHAPTER22MOD
  19. #define CHAPTER22
  20. //End CHAPTER22MOD
  21. #include <inole.h>
  22. #include "resource.h"
  23. //Get editor window information
  24. #include "pages.h"
  25. /*
  26.  * UINT value such that adding one produces zero.  Portable to Win32.
  27.  * This is used to represent a non-existent zero-based UINT value
  28.  */
  29. #define NOVALUE                     ((UINT)-1)
  30. //PATRON.CPP:  Frame object that creates a main window
  31. //CHAPTER22MOD
  32. class CPatronFrame : public CFrame, public IOleInPlaceFrame
  33. //End CHAPTER22MOD
  34.     {
  35.     //For access to m_pCL for document creation
  36.     friend class CLinkClassFactory;
  37.     private:
  38.         BOOL            m_fInitialized;     //OleInitialize worked
  39.         LPCLASSFACTORY  m_pIClassDataTran;  //For locking.
  40.         PCDocument      m_pDocCreated;      //What class factory makes
  41.         BOOL            m_fEmbedding;       //-Embedding on command line?
  42.         DWORD           m_dwRegCO;          //From CoRegisterClassObject
  43.         LPCLASSFACTORY  m_pIClassFactory;
  44.         //CHAPTER22MOD
  45.         DWORD           m_cRef;
  46.         HMENU           m_hMenuOrg;         //Original menu
  47.         HMENU           m_hMenuTop;
  48.         HWND            m_hWndObj;          //Object window
  49.         BOOL            m_fOurToolsShowing; //Our tools up?
  50.         int             m_cyTop;            //In-place tool allocations
  51.         int             m_cyBottom;
  52.         int             m_cxLeft;
  53.         int             m_cxRight;
  54.         BOOL            m_fInContextHelp;   //In context help mode?
  55.         LPOLEINPLACEACTIVEOBJECT    m_pIOleIPActiveObject;
  56.         //End CHAPTER22MOD
  57.     //CHAPTER22MOD
  58.     //This is for access from IOleInPlaceSite::GetWindowContext
  59.     public:
  60.         HACCEL          m_hAccelIP;         //Accelerators for in-place
  61.     //End CHAPTER22MOD
  62.     protected:
  63.         //Overridable for creating a CPatronClient
  64.         virtual PCClient    CreateCClient(void);
  65.         virtual BOOL        FMessageHook(HWND, UINT, WPARAM, LPARAM
  66.                                 , LRESULT *);
  67.         virtual BOOL        PreShowInit(void);
  68.         virtual BOOL        RegisterAllClasses(void);
  69.         virtual UINT        CreateToolbar(void);
  70.         virtual LRESULT     OnCommand(HWND, WPARAM, LPARAM);
  71.     public:
  72.         CPatronFrame(HINSTANCE, HINSTANCE, LPSTR, int);
  73.         virtual ~CPatronFrame(void);
  74.         //Overrides
  75.         virtual BOOL        Init(PFRAMEINIT);
  76.         //CHAPTER22MOD
  77.         virtual WPARAM      MessageLoop(void);
  78.         //End CHAPTER22MOD
  79.         virtual void        UpdateMenus(HMENU, UINT);
  80.         virtual void        UpdateToolbar(void);
  81.         //CHAPTER22MOD
  82.         void                ShowUIAndTools(BOOL, BOOL);
  83.         void                ReinstateUI(void);
  84.         //IOleInPlaceFrame implementation
  85.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  86.         STDMETHODIMP_(ULONG) AddRef(void);
  87.         STDMETHODIMP_(ULONG) Release(void);
  88.         STDMETHODIMP         GetWindow(HWND *);
  89.         STDMETHODIMP         ContextSensitiveHelp(BOOL);
  90.         STDMETHODIMP         GetBorder(LPRECT);
  91.         STDMETHODIMP         RequestBorderSpace(LPCBORDERWIDTHS);
  92.         STDMETHODIMP         SetBorderSpace(LPCBORDERWIDTHS);
  93.         STDMETHODIMP         SetActiveObject(LPOLEINPLACEACTIVEOBJECT
  94.                                  , LPCOLESTR);
  95.         STDMETHODIMP         InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS);
  96.         STDMETHODIMP         SetMenu(HMENU, HOLEMENU, HWND);
  97.         STDMETHODIMP         RemoveMenus(HMENU);
  98.         STDMETHODIMP         SetStatusText(LPCOLESTR);
  99.         STDMETHODIMP         EnableModeless(BOOL);
  100.         STDMETHODIMP         TranslateAccelerator(LPMSG, WORD);
  101.         //End CHAPTER22MOD
  102.     };
  103. typedef CPatronFrame *PCPatronFrame;
  104. //These are global for simplification of object implementation.
  105. extern ULONG g_cObj;
  106. extern ULONG g_cLock;
  107. extern HWND  g_hWnd;
  108. //CHAPTER22MOD
  109. extern PCPatronFrame  g_pFR;
  110. //End CHAPTER22MOD
  111. //Function for the object to notify on destruction.
  112. void ObjectDestroyed(void);
  113. //ICLASSF.CPP
  114. class CLinkClassFactory : public IClassFactory
  115.     {
  116.     protected:
  117.         ULONG           m_cRef;
  118.         PCPatronFrame   m_pFR;          //For document creation.
  119.     public:
  120.         CLinkClassFactory(PCPatronFrame);
  121.         ~CLinkClassFactory(void);
  122.         //IUnknown members
  123.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  124.         STDMETHODIMP_(ULONG) AddRef(void);
  125.         STDMETHODIMP_(ULONG) Release(void);
  126.         //IClassFactory members
  127.         STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID
  128.                                  , PPVOID);
  129.         STDMETHODIMP         LockServer(BOOL);
  130.     };
  131. typedef CLinkClassFactory *PCLinkClassFactory;
  132. //CLIENT.CPP
  133. /*
  134.  * The only reason we have a derived class here is to override
  135.  * CreateCDocument so we can create our own type as well as
  136.  * overriding NewDocument to perform one other piece of work once
  137.  * the document's been created.
  138.  */
  139. class CPatronClient : public CClient
  140.     {
  141.     protected:
  142.         //Overridable for creating a new CDocument
  143.         virtual PCDocument CreateCDocument(void);
  144.     public:
  145.         CPatronClient(HINSTANCE, PCFrame);
  146.         virtual ~CPatronClient(void);
  147.         //CHAPTER22MOD
  148.         //This is added to handle IOleInPlaceFrame::SetMenu
  149.         void         SetMenu(HWND, HMENU, HMENU);
  150.         void         MoveWithoutFamily(LPRECT, int, int);
  151.         void         CallContextHelpOnDocuments(BOOL);
  152.         //End CHAPTER22MOD
  153.     };
  154. typedef CPatronClient *PCPatronClient;
  155. //DOCUMENT.CPP
  156. //Constant ID for the pages window that lives in a document window
  157. #define ID_PAGES            723
  158. class CImpIPersistFile;
  159. typedef class CImpIPersistFile *PCImpIPersistFile;
  160. class CImpIOleItemContainer;
  161. typedef class CImpIOleItemContainer *PCImpIOleItemContainer;
  162. //CHAPTER22MOD
  163. class CImpIOleInPlaceUIWindow;
  164. typedef class CImpIOleInPlaceUIWindow *PCImpIOleInPlaceUIWindow;
  165. //End CHAPTER22MOD
  166. /*
  167.  * To support linking to embeddings, the document needs to have
  168.  * IPersistFile and IOleItemContainer interfaces, so we multiply
  169.  * inherit from IUnknown and provide two interface implementations.
  170.  */
  171. class CPatronDoc : public CDocument, public IUnknown
  172.     {
  173.     //These need access to FQueryPasteFromData, PasteFromData
  174.     friend class CDropTarget;
  175.     friend class CDropSource;
  176.     friend class CImpIPersistFile;
  177.     friend class CImpIOleItemContainer;
  178.     //CHAPTER22MOD
  179.     friend class CImpIOleInPlaceUIWindow;
  180.     //End CHAPTER22MOD
  181.     protected:
  182.         LONG            m_lVer;         //Loaded data version
  183.         PCPages         m_pPG;          //Pages window in us
  184.         LPSTORAGE       m_pIStorage;    //Root storage for document
  185.         BOOL            m_fPrintSetup;
  186.         class CDropTarget *m_pDropTarget;   //Registered target
  187.         UINT            m_cfEmbeddedObject; //Clipboard formats
  188.         UINT            m_cfObjectDescriptor;
  189.         UINT            m_cfLinkSource;
  190.         UINT            m_cfLinkSrcDescriptor;
  191.         BOOL            m_fShowTypes;       //Show Objects active?
  192.         ULONG               m_cRef;
  193.         BOOL                m_fRename;          //Rename on Save?
  194.         DWORD               m_dwRegROT;
  195.         DWORD               m_dwRegROTWild;
  196.         PCImpIPersistFile       m_pImpIPersistFile;
  197.         PCImpIOleItemContainer  m_pImpIOleItemContainer;
  198.         //CHAPTER22MOD
  199.         PCImpIOleInPlaceUIWindow m_pImpIOleIPUIWindow;  //Ours
  200.         LPOLEINPLACEACTIVEOBJECT m_pIOleIPActiveObject; //Object's
  201.         BOOL                     m_fNoObjectFrameTools;
  202.         //End CHAPTER22MOD
  203.     protected:
  204.         virtual BOOL    FMessageHook(HWND, UINT, WPARAM, LPARAM
  205.             , LRESULT *);
  206.         BOOL            FQueryPasteFromData(LPDATAOBJECT
  207.                             , LPFORMATETC, PTENANTTYPE);
  208.         BOOL            FQueryPasteLinkFromData(LPDATAOBJECT
  209.                             , LPFORMATETC, PTENANTTYPE);
  210.         BOOL            PasteFromData(LPDATAOBJECT, LPFORMATETC
  211.                             , TENANTTYPE, PPATRONOBJECT, DWORD
  212.                             , BOOL);
  213.     public:
  214.         CPatronDoc(HINSTANCE, PCFrame, PCDocumentAdviseSink);
  215.         virtual ~CPatronDoc(void);
  216.         //We now need our ubiquitous set of IUnknown members.
  217.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  218.         STDMETHODIMP_(ULONG) AddRef(void);
  219.         STDMETHODIMP_(ULONG) Release(void);
  220.         virtual BOOL    Init(PDOCUMENTINIT);
  221.         virtual void    Clear(void);
  222.         virtual BOOL    FDirtySet(BOOL);
  223.         virtual BOOL    FDirtyGet(void);
  224.         virtual void    Delete(void);
  225.         virtual BOOL    FQueryPrinterSetup(void);
  226.         virtual BOOL    FQueryObjectSelected(HMENU);
  227.         virtual UINT    Load(BOOL, LPTSTR);
  228.         virtual UINT    Save(UINT, LPTSTR);
  229.         virtual BOOL    Print(HWND);
  230.         virtual UINT    PrinterSetup(HWND, BOOL);
  231.         virtual BOOL    Clip(HWND, BOOL);
  232.         virtual BOOL    FQueryPaste(void);
  233.         virtual BOOL    Paste(HWND);
  234.         virtual BOOL    PasteSpecial(HWND);
  235.         virtual BOOL    FQueryEnableEditLinks(void);
  236.         virtual BOOL    EditLinks(HWND);
  237.         virtual BOOL    ShowOrQueryObjectTypes(BOOL, BOOL);
  238.         virtual UINT    NewPage(void);
  239.         virtual UINT    DeletePage(void);
  240.         virtual UINT    NextPage(void);
  241.         virtual UINT    PreviousPage(void);
  242.         virtual UINT    FirstPage(void);
  243.         virtual UINT    LastPage(void);
  244.         virtual void    Rename(LPTSTR);
  245.         virtual BOOL    InsertObject(HWND);
  246.         //CHAPTER22MOD
  247.         virtual void    ActivateObject(LONG, LPMSG);
  248.         virtual BOOL    NoObjectFrameTools(BOOL, BOOL);
  249.         //End CHAPTER22MOD
  250.         virtual BOOL    ConvertObject(HWND);
  251.     };
  252. typedef CPatronDoc *PCPatronDoc;
  253. //Hook for Print Dialog to hide Setup... button
  254. UINT CALLBACK PrintDlgHook(HWND, UINT, WPARAM, LPARAM);
  255. //IPersistFile implementation for CPatronDoc
  256. class CImpIPersistFile : public IPersistFile
  257.     {
  258.     protected:
  259.         ULONG               m_cRef;      //Interface reference count
  260.         PCPatronDoc         m_pDoc;      //Back pointer to the object
  261.         LPUNKNOWN           m_pUnkOuter; //Controlling unknown
  262.     public:
  263.         CImpIPersistFile(PCPatronDoc, LPUNKNOWN);
  264.         ~CImpIPersistFile(void);
  265.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  266.         STDMETHODIMP_(ULONG) AddRef(void);
  267.         STDMETHODIMP_(ULONG) Release(void);
  268.         STDMETHODIMP GetClassID(LPCLSID);
  269.         STDMETHODIMP IsDirty(void);
  270.         STDMETHODIMP Load(LPCOLESTR, DWORD);
  271.         STDMETHODIMP Save(LPCOLESTR, BOOL);
  272.         STDMETHODIMP SaveCompleted(LPCOLESTR);
  273.         STDMETHODIMP GetCurFile(LPOLESTR *);
  274.     };
  275. /*
  276.  * IOleItemContainer implementation for both CPatronDoc and CPage,
  277.  * therefore have two back pointers.
  278.  */
  279. class CImpIOleItemContainer : public IOleItemContainer
  280.     {
  281.     protected:
  282.         ULONG               m_cRef;
  283.         class CPage        *m_pPage;
  284.         PCPatronDoc         m_pDoc;      //Convenient naming & types
  285.         LPUNKNOWN           m_pUnkOuter;
  286.         BOOL                m_fDoc;      //Document or page?
  287.     private:
  288.         BOOL         TenantFromName(LPOLESTR, PCTenant *);
  289.     public:
  290.         CImpIOleItemContainer(LPVOID, LPUNKNOWN, BOOL);
  291.         ~CImpIOleItemContainer(void);
  292.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  293.         STDMETHODIMP_(ULONG) AddRef(void);
  294.         STDMETHODIMP_(ULONG) Release(void);
  295.         STDMETHODIMP ParseDisplayName(LPBC, LPOLESTR, ULONG *
  296.             , LPMONIKER *);
  297.         STDMETHODIMP EnumObjects(DWORD, LPENUMUNKNOWN *);
  298.         STDMETHODIMP LockContainer(BOOL);
  299.         STDMETHODIMP GetObject(LPOLESTR, DWORD, LPBINDCTX, REFIID
  300.             , PPVOID);
  301.         STDMETHODIMP GetObjectStorage(LPOLESTR, LPBINDCTX, REFIID
  302.             , PPVOID);
  303.         STDMETHODIMP IsRunning(LPOLESTR);
  304.     };
  305. //CHAPTER22MOD
  306. //This goes on the document.
  307. class CImpIOleInPlaceUIWindow : public IOleInPlaceUIWindow
  308.     {
  309.     protected:
  310.         ULONG               m_cRef;
  311.         PCPatronDoc         m_pDoc;
  312.         LPUNKNOWN           m_pUnkOuter;
  313.     public:
  314.         CImpIOleInPlaceUIWindow(PCPatronDoc, LPUNKNOWN);
  315.         ~CImpIOleInPlaceUIWindow(void);
  316.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  317.         STDMETHODIMP_(ULONG) AddRef(void);
  318.         STDMETHODIMP_(ULONG) Release(void);
  319.         STDMETHODIMP GetWindow(HWND *);
  320.         STDMETHODIMP ContextSensitiveHelp(BOOL);
  321.         STDMETHODIMP GetBorder(LPRECT);
  322.         STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS);
  323.         STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS);
  324.         STDMETHODIMP SetActiveObject(LPOLEINPLACEACTIVEOBJECT
  325.                          , LPCOLESTR);
  326.     };
  327. //End CHAPTER22MOD
  328. //Drag-drop objects we need in the document
  329. class CDropTarget : public IDropTarget
  330.     {
  331.     protected:
  332.         ULONG               m_cRef;
  333.         PCPatronDoc         m_pDoc;
  334.         LPDATAOBJECT        m_pIDataObject;  //From DragEnter
  335.         BOOL                m_fPendingRepaint;
  336.         POINTL              m_ptPick;        //Pick-up offsets
  337.         POINTL              m_ptLast;        //Last drag point
  338.         SIZEL               m_szl;           //Object size
  339.         BOOL                m_fFeedback;     //Draw feedback?
  340.         FORMATETC           m_fe;            //Real dropping format
  341.     public:
  342.         CDropTarget(PCPatronDoc);
  343.         ~CDropTarget(void);
  344.         //IDropTarget interface members
  345.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  346.         STDMETHODIMP_(ULONG) AddRef(void);
  347.         STDMETHODIMP_(ULONG) Release(void);
  348.         STDMETHODIMP DragEnter(LPDATAOBJECT, DWORD, POINTL,LPDWORD);
  349.         STDMETHODIMP DragOver(DWORD, POINTL, LPDWORD);
  350.         STDMETHODIMP DragLeave(void);
  351.         STDMETHODIMP Drop(LPDATAOBJECT, DWORD, POINTL, LPDWORD);
  352.     };
  353. typedef CDropTarget *PCDropTarget;
  354. class CDropSource : public IDropSource
  355.     {
  356.     protected:
  357.         ULONG               m_cRef;
  358.     public:
  359.         CDropSource(void);
  360.         ~CDropSource(void);
  361.         //IDropSource interface members
  362.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  363.         STDMETHODIMP_(ULONG) AddRef(void);
  364.         STDMETHODIMP_(ULONG) Release(void);
  365.         STDMETHODIMP QueryContinueDrag(BOOL, DWORD);
  366.         STDMETHODIMP GiveFeedback(DWORD);
  367.     };
  368. typedef CDropSource *PCDropSource;
  369. #endif //_PATRON_H_