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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * PAGES.H
  3.  * Patron Chapter 22
  4.  *
  5.  * Definitions and function prototypes for the Pages window control
  6.  * as well as the CPage class.
  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 _PAGES_H_
  15. #define _PAGES_H_
  16. #include <stdlib.h>     //For atol
  17. //Versioning.
  18. #define VERSIONMAJOR                2
  19. #define VERSIONMINOR                0
  20. #define VERSIONCURRENT              0x00020000
  21. //Classname
  22. #define SZCLASSPAGES                TEXT("pages")
  23. #define HIMETRIC_PER_INCH           2540
  24. #define LOMETRIC_PER_INCH           254
  25. #define LOMETRIC_BORDER             60          //Border around page
  26. //Window extra bytes and offsets
  27. #define CBPAGESWNDEXTRA             (sizeof(LONG))
  28. #define PAGEWL_STRUCTURE            0
  29. #include "tenant.h"
  30. typedef struct tagTENANTLIST
  31.     {
  32.     DWORD       cTenants;
  33.     DWORD       dwIDNext;
  34.     } TENANTLIST, *PTENANTLIST;
  35. #define SZSTREAMTENANTLIST        OLETEXT("Tenant List")
  36. //Delay timer used in mouse debouncing
  37. #define IDTIMER_DEBOUNCE          120
  38. /*
  39.  * Page class describing an individual page and what things it
  40.  * contains, managing an IStorage for us.
  41.  *
  42.  * A DWORD is used to identify this page as the name of the storage
  43.  * is the string form of this ID.  If we added a page every second,
  44.  * it would take 136 years to overrun this counter, so we can
  45.  * get away with saving it persistently.  I hope this software is
  46.  * obsolete by then.
  47.  */
  48. class CPage : public IUnknown
  49.     {
  50.     friend class CIOleUILinkContainer;
  51.     friend class CImpIOleItemContainer;
  52.     private:
  53.         DWORD       m_dwID;             //Persistent identifier
  54.         LPSTORAGE   m_pIStorage;        //Substorage for this page
  55.         HWND        m_hWnd;             //Pages window
  56.         DWORD       m_cOpens;           //Calls to Open
  57.         class CPages *m_pPG;            //Pages window
  58.         DWORD       m_dwIDNext;
  59.         DWORD       m_cTenants;
  60.         HWND        m_hWndTenantList;   //Listbox; our tenant list
  61.         UINT        m_iTenantCur;
  62.         PCTenant    m_pTenantCur;
  63.         UINT        m_uHTCode;          //Last hit-test/mouse move
  64.         UINT        m_uSizingFlags;     //Restrictions on sizing
  65.         BOOL        m_fTracking;        //Tracking resize?
  66.         RECTL       m_rclOrg;           //Original before tracking
  67.         RECTL       m_rcl;              //Tracking rectangle
  68.         RECTL       m_rclBounds;        //Boundaries f/size tracking
  69.         HDC         m_hDC;              //Tracking hDC
  70.         BOOL        m_fDragPending;     //Waiting for drag?
  71.         BOOL        m_fSizePending;     //Waiting for debounce?
  72.         int         m_cxyDist;          //Debounce distance
  73.         UINT        m_cDelay;           //Debounce delay
  74.         POINTS      m_ptDown;           //Point of click to debounce
  75.         UINT        m_uKeysDown;        //Keys when click happens
  76.         DWORD       m_fTimer;           //Timer active?
  77.         BOOL        m_fReopen;          //Did we just close?
  78.         LPMONIKER               m_pmkFile;  //Document name
  79.         ULONG                   m_cRef;
  80.         DWORD                   m_dwRegROTWild;
  81.         class CImpIOleItemContainer *m_pImpIOleItemContainer;
  82.         //CHAPTER22MOD
  83.         BOOL                m_fFirstUIActivate;
  84.         //End CHAPTER22MOD
  85.     protected:
  86.         BOOL         TenantGet(UINT, PCTenant *, BOOL);
  87.         BOOL         TenantGetFromID(DWORD, PCTenant *, BOOL);
  88.         BOOL         TenantAdd(UINT, DWORD, PCTenant *);
  89.         LPDATAOBJECT TransferObjectCreate(PPOINTL);
  90.         //PAGEMOUS.CPP
  91.         BOOL         SelectTenantAtPoint(UINT, UINT);
  92.         UINT         TenantFromPoint(UINT, UINT, PCTenant *);
  93.         BOOL         DragDrop(UINT, UINT, UINT);
  94.     public:
  95.         CPage(DWORD, HWND, class CPages *);
  96.         ~CPage(void);
  97.         //IUnknown for delegation
  98.         STDMETHODIMP QueryInterface(REFIID, PPVOID);
  99.         STDMETHODIMP_(ULONG) AddRef(void);
  100.         STDMETHODIMP_(ULONG) Release(void);
  101.         DWORD       GetID(void);
  102.         BOOL        Open(LPSTORAGE);
  103.         void        Close(BOOL);
  104.         BOOL        Update(void);
  105.         void        Destroy(LPSTORAGE);
  106.         UINT        GetStorageName(LPOLESTR);
  107.         void        Draw(HDC, int, int, BOOL, BOOL);
  108.         BOOL        TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
  109.                         , PPATRONOBJECT, DWORD);
  110.         BOOL        TenantDestroy(void);
  111.         BOOL        TenantClip(BOOL);
  112.         BOOL        FQueryObjectSelected(HMENU);
  113.         //CHAPTER22MOD
  114.         void        ActivateObject(LONG, LPMSG);
  115.         //End CHAPTER22MOD
  116.         void        ShowObjectTypes(BOOL);
  117.         void        NotifyTenantsOfRename(LPTSTR, LPMONIKER);
  118.         BOOL        FQueryLinksInPage(void);
  119.         BOOL        ConvertObject(HWND, BOOL);
  120.         //CHAPTER22MOD
  121.         void        ScrolledWindow(void);
  122.         void        SwitchActiveTenant(PCTenant);
  123.         //End CHAPTER22MOD
  124.         //PAGEMOUSE.CPP
  125.         BOOL        OnRightDown(UINT, UINT, UINT);
  126.         BOOL        OnLeftDown(UINT, UINT, UINT);
  127.         BOOL        OnLeftDoubleClick(UINT, UINT, UINT);
  128.         BOOL        OnLeftUp(UINT, UINT, UINT);
  129.         void        OnMouseMove(UINT, int, int);
  130.         void        OnTimer(UINT);
  131.         void        StartSizeTracking(void);
  132.         void        OnNCHitTest(UINT, UINT);
  133.         BOOL        OnSetCursor(UINT);
  134.     };
  135. typedef CPage *PCPage;
  136. /*
  137.  * Structures to save with the document describing the device
  138.  * configuration and pages that we have.  This is followed by
  139.  * a list of DWORD IDs for the individual pages.
  140.  */
  141. typedef struct tagDEVICECONFIG
  142.     {
  143.     DWORD       cb;                         //Size of structure
  144.     TCHAR       szDriver[CCHDEVICENAME];
  145.     TCHAR       szDevice[CCHDEVICENAME];
  146.     TCHAR       szPort[CCHDEVICENAME];
  147.     DWORD       cbDevMode;                  //Size of actual DEVMODE
  148.     DEVMODE     dm;                         //Variable
  149.     } DEVICECONFIG, *PDEVICECONFIG;
  150. //Offset to cbDevMode
  151. #define CBSEEKOFFSETCBDEVMODE  (sizeof(DWORD)   
  152.                                +(3*CCHDEVICENAME*sizeof(TCHAR)))
  153. //Combined OLE and Patron device structures.
  154. typedef struct tagCOMBINEDEVICE
  155.     {
  156.     DVTARGETDEVICE  td;
  157.     DEVICECONFIG    dc;
  158.     } COMBINEBDEVICE, *PCOMBINEDEVICE;
  159. typedef struct tagPAGELIST
  160.     {
  161.     DWORD       cPages;
  162.     DWORD       iPageCur;
  163.     DWORD       dwIDNext;
  164.     } PAGELIST, *PPAGELIST;
  165. //PRINT.CPP
  166. BOOL    APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
  167. BOOL    APIENTRY AbortProc(HDC, int);
  168. //PAGEWIN.CPP
  169. LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
  170. void             RectConvertMappings(LPRECT, HDC, BOOL);
  171. class CPages : public CWindow
  172.     {
  173.     friend LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
  174.     friend BOOL    APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
  175.     friend class CPage;
  176.     friend class CTenant;
  177.     friend class CDropTarget;
  178.     friend class CImpIAdviseSink;
  179.     friend class CImpIOleItemContainer;
  180.     //CHAPTER22MOD
  181.     friend class CImpIOleInPlaceSite;
  182.     //End CHAPTER22MOD
  183.     protected:
  184.         PCPage      m_pPageCur;             //Current page
  185.         UINT        m_iPageCur;             //Current page
  186.         UINT        m_cPages;               //Number of pages
  187.         HWND        m_hWndPageList;         //Listbox with page list
  188.         HFONT       m_hFont;                //Page font
  189.         BOOL        m_fSystemFont;          //m_hFont system object?
  190.         UINT        m_cx;                   //Page size in LOMETRIC
  191.         UINT        m_cy;
  192.         UINT        m_xMarginLeft;          //Unusable margins,
  193.         UINT        m_xMarginRight;         //in LOMETRIC
  194.         UINT        m_yMarginTop;
  195.         UINT        m_yMarginBottom;
  196.         UINT        m_xPos;                 //Viewport scroll pos,
  197.         UINT        m_yPos;                 //both in *PIXELS*
  198.         DWORD       m_dwIDNext;             //Next ID for a page.
  199.         LPSTORAGE   m_pIStorage;            //Root storage
  200.         UINT        m_cf;                   //Clipboard format
  201.         BOOL        m_fDirty;
  202.         BOOL        m_fDragSource;          //Source==target?
  203.         BOOL        m_fMoveInPage;          //Moving in same page
  204.         BOOL        m_fLinkAllowed;         //Linking in drag-drop?
  205.         POINTL      m_ptDrop;               //Where to move object
  206.         BOOL        m_fDragRectShown;       //Is rect on the screen?
  207.         UINT        m_uScrollInset;         //Hit-test for drag-drop
  208.         UINT        m_uScrollDelay;         //Delay before repeat
  209.         DWORD       m_dwTimeLast;           //Ticks on last DragOver
  210.         UINT        m_uHScrollCode;         //L/R on scroll repeat?
  211.         UINT        m_uVScrollCode;         //U/D on scroll repeat?
  212.         UINT        m_uLastTest;            //Last test result
  213.         POINTL      m_ptlRect;              //Last feedback rectangle
  214.         SIZEL       m_szlRect;
  215.         BOOL        m_fShowTypes;           //Show Object active?
  216.         LPMONIKER   m_pmkFile;
  217.         //CHAPTER22MOD
  218.         BOOL        m_fAddUI;
  219.         //End CHAPTER22MOD
  220.     private:
  221.         void        Draw(HDC, BOOL, BOOL);
  222.         void        UpdateScrollRanges(void);
  223.         BOOL        ConfigureForDevice(void);
  224.         BOOL        PageGet(UINT, PCPage *, BOOL);
  225.         BOOL        PageAdd(UINT, DWORD, BOOL);
  226.         void        CalcBoundingRect(LPRECT, BOOL);
  227.         //DRAGDROP.CPP
  228.         UINT        UTestDroppablePoint(PPOINTL);
  229.         void        DrawDropTargetRect(PPOINTL, LPSIZEL);
  230.         void        AdjustPosition(PPOINTL, LPSIZEL);
  231.     public:
  232.         CPages(HINSTANCE, UINT);
  233.         ~CPages(void);
  234.         BOOL        Init(HWND, LPRECT, DWORD, UINT, LPVOID);
  235.         BOOL        StorageSet(LPSTORAGE, BOOL, BOOL);
  236.         BOOL        StorageUpdate(BOOL);
  237.         BOOL        Print(HDC, LPTSTR, DWORD, UINT, UINT, UINT);
  238.         void        RectGet(LPRECT);
  239.         void        RectSet(LPRECT, BOOL);
  240.         void        SizeGet(LPRECT);
  241.         void        SizeSet(LPRECT, BOOL);
  242.         PCPage      ActivePage(void);
  243.         UINT        PageInsert(UINT);
  244.         UINT        PageDelete(UINT);
  245.         UINT        CurPageGet(void);
  246.         UINT        CurPageSet(UINT);
  247.         UINT        NumPagesGet(void);
  248.         BOOL        DevModeSet(HGLOBAL, HGLOBAL);
  249.         HGLOBAL     DevModeGet(void);
  250.         BOOL        FIsDirty(void);
  251.         BOOL        DevReadConfig(PCOMBINEDEVICE *, HDC *);
  252.         BOOL        TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
  253.                         , PPATRONOBJECT, DWORD);
  254.         BOOL        TenantDestroy(void);
  255.         BOOL        TenantClip(BOOL);
  256.         BOOL        FQueryObjectSelected(HMENU);
  257.         //CHAPTER22MOD
  258.         void        ActivateObject(LONG, LPMSG);
  259.         //End CHAPTER22MOD
  260.         void        ShowObjectTypes(BOOL);
  261.         void        NotifyTenantsOfRename(LPTSTR, LPMONIKER);
  262.         BOOL        FQueryLinksInPage(void);
  263.         BOOL        GetUILinkContainer(class CIOleUILinkContainer **);
  264.         BOOL        ConvertObject(HWND);
  265.         UINT        IPageGetFromID(DWORD, PCPage *, BOOL);
  266.     };
  267. typedef CPages *PCPages;
  268. //Fixed names of streams in the Pages IStorage
  269. #define SZSTREAMPAGELIST        OLETEXT("Page List")
  270. #define SZSTREAMDEVICECONFIG    OLETEXT("Device Configuration")
  271. //Return values for UTestDroppablePoint
  272. #define UDROP_NONE              0x0000      //Exclusive
  273. #define UDROP_CLIENT            0x0001      //Inclusive
  274. #define UDROP_INSETLEFT         0x0002      //L/R are exclusive
  275. #define UDROP_INSETRIGHT        0x0004
  276. #define UDROP_INSETHORZ         (UDROP_INSETLEFT | UDROP_INSETRIGHT)
  277. #define UDROP_INSETTOP          0x0008      //T/B are exclusive
  278. #define UDROP_INSETBOTTOM       0x0010
  279. #define UDROP_INSETVERT         (UDROP_INSETTOP | UDROP_INSETBOTTOM)
  280. //Object used for the Links dialog
  281. class CIOleUILinkContainer : public IOleUILinkContainer
  282.     {
  283.     private:
  284.         ULONG                   m_cRef;
  285.         PCPage                  m_pPage;
  286.         UINT                    m_iTenant;
  287.         LPOLEUILINKCONTAINER    m_pDelIUILinks;
  288.     public:
  289.         BOOL                    m_fDirty;   //No reason to hide it
  290.     protected:
  291.         STDMETHODIMP GetObjectInterface(DWORD, REFIID, PPVOID);
  292.     public:
  293.         CIOleUILinkContainer(PCPage);
  294.         ~CIOleUILinkContainer(void);
  295.         BOOL Init(void);
  296.         BOOL IsDirty(void);
  297.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  298.         STDMETHODIMP_(ULONG) AddRef(void);
  299.         STDMETHODIMP_(ULONG) Release(void);
  300.         STDMETHODIMP_(DWORD) GetNextLink(DWORD);
  301.         STDMETHODIMP         SetLinkUpdateOptions(DWORD, DWORD);
  302.         STDMETHODIMP         GetLinkUpdateOptions(DWORD, LPDWORD);
  303.         STDMETHODIMP         SetLinkSource(DWORD, LPTSTR, ULONG
  304.                                  , ULONG *, BOOL);
  305.         STDMETHODIMP         GetLinkSource(DWORD, LPTSTR *, ULONG *
  306.                                  , LPTSTR *, LPTSTR *, BOOL *
  307.                                  , BOOL *);
  308.         STDMETHODIMP         OpenLinkSource(DWORD);
  309.         STDMETHODIMP         UpdateLink(DWORD, BOOL, BOOL);
  310.         STDMETHODIMP         CancelLink(DWORD);
  311.     };
  312. typedef CIOleUILinkContainer *PCIOleUILinkContainer;
  313. #endif  //_PAGES_H_