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

Windows编程

开发平台:

Visual C++

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