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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * PAGES.H
  3.  * Patron Chapter 13
  4.  *
  5.  * Definitions and function prototypes for the Pages window control
  6.  * as well as the CPage and CTenant classes.
  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. //Versioning.
  17. #define VERSIONMAJOR                2
  18. #define VERSIONMINOR                0
  19. #define VERSIONCURRENT              0x00020000
  20. //Classname
  21. #define SZCLASSPAGES                TEXT("pages")
  22. #define HIMETRIC_PER_INCH           2540
  23. #define LOMETRIC_PER_INCH           254
  24. #define LOMETRIC_BORDER             60          //Border around page
  25. //Window extra bytes and offsets
  26. #define CBPAGESWNDEXTRA             (sizeof(LONG))
  27. #define PAGEWL_STRUCTURE            0
  28. /*
  29.  * Tenant class describing an individual piece of data in a page.
  30.  * It knows where it sits, what object is inside of it, and what
  31.  * its identifer is such that it can find it's storage within a
  32.  * page.
  33.  */
  34. //Patron Objects clipboard format
  35. typedef struct tagPATRONOBJECT
  36.     {
  37.     POINTL      ptl;        //Location of object
  38.     POINTL      ptlPick;    //Pick point from drag-drop operation
  39.     SIZEL       szl;        //Extents of object (absolute)
  40.     FORMATETC   fe;         //Actual object format
  41.     } PATRONOBJECT, *PPATRONOBJECT;
  42. //Values for hit-testing, drawing, and resize-tracking tenants
  43. #define CXYHANDLE       5
  44. //Tenant creation types (not persistent)
  45. typedef enum
  46.     {
  47.     TENANTTYPE_NULL=0,
  48.     TENANTTYPE_STATIC,
  49.     } TENANTTYPE, *PTENANTTYPE;
  50. //State flags
  51. #define TENANTSTATE_DEFAULT      0x00000000
  52. #define TENANTSTATE_SELECTED     0x00000001
  53. /*
  54.  * Persistent information we need to save for each tenant, which is
  55.  * done in the tenant list instead of with each tenant.  Since this
  56.  * is a small structure it's best not to blow another stream for it
  57.  * (overhead).  (fSetExtent used in compound documents later on.)
  58.  */
  59. typedef struct tagTENANTINFO
  60.     {
  61.     DWORD       dwID;
  62.     RECTL       rcl;
  63.     FORMATETC   fe;             //Excludes ptd
  64.     short       fSetExtent;     //Call IOleObject::SetExtent on Run
  65.     } TENANTINFO, *PTENANTINFO;
  66. class CTenant
  67.     {
  68.     private:
  69.         HWND            m_hWnd;         //Pages window
  70.         DWORD           m_dwID;         //Persistent DWORD ID
  71.         DWORD           m_cOpens;       //Count calls to Open
  72.         BOOL            m_fInitialized; //Something here?
  73.         LPUNKNOWN       m_pObj;         //The object here
  74.         LPSTORAGE       m_pIStorage;    //Sub-storage for tenant
  75.         FORMATETC       m_fe;           //Used to create the object
  76.         DWORD           m_dwState;      //State flags
  77.         RECTL           m_rcl;          //Space of this object
  78.         CLSID           m_clsID;        //Object class (for statics)
  79.         BOOL            m_fSetExtent;   //Call SetExtent on next run
  80.         class CPages   *m_pPG;          //Pages window
  81.     protected:
  82.         HRESULT CreateStatic(LPDATAOBJECT, LPFORMATETC
  83.             , LPUNKNOWN *);
  84.     public:
  85.         CTenant(DWORD, HWND, CPages *);
  86.         ~CTenant(void);
  87.         DWORD       GetID(void);
  88.         UINT        GetStorageName(LPOLESTR);
  89.         UINT        Create(TENANTTYPE, LPVOID, LPFORMATETC, PPOINTL
  90.                         , LPSIZEL, LPSTORAGE, PPATRONOBJECT, DWORD);
  91.         BOOL        Load(LPSTORAGE, PTENANTINFO);
  92.         void        GetInfo(PTENANTINFO);
  93.         BOOL        Open(LPSTORAGE);
  94.         void        Close(BOOL);
  95.         BOOL        Update(void);
  96.         void        Destroy(LPSTORAGE);
  97.         void        Select(BOOL);
  98.         BOOL        Activate(LONG);
  99.         void        Draw(HDC, DVTARGETDEVICE *, HDC, int, int
  100.                         , BOOL, BOOL);
  101.         void        Repaint(void);
  102.         void        Invalidate(void);
  103.         void        ObjectGet(LPUNKNOWN *);
  104.         void        FormatEtcGet(LPFORMATETC, BOOL);
  105.         void        SizeGet(LPSIZEL, BOOL);
  106.         void        SizeSet(LPSIZEL, BOOL);
  107.         void        RectGet(LPRECTL, BOOL);
  108.         void        RectSet(LPRECTL, BOOL);
  109.     };
  110. typedef CTenant *PCTenant;
  111. //Return codes for Create
  112. #define CREATE_FAILED               0
  113. #define CREATE_GRAPHICONLY          1
  114. #define CREATE_PLACEDOBJECT         2
  115. typedef struct tagTENANTLIST
  116.     {
  117.     DWORD       cTenants;
  118.     DWORD       dwIDNext;
  119.     } TENANTLIST, *PTENANTLIST;
  120. #define SZSTREAMTENANTLIST        OLETEXT("Tenant List")
  121. //Delay timer used in mouse debouncing
  122. #define IDTIMER_DEBOUNCE          120
  123. /*
  124.  * Page class describing an individual page and what things it
  125.  * contains, managing an IStorage for us.
  126.  *
  127.  * A DWORD is used to identify this page as the name of the storage
  128.  * is the string form of this ID.  If we added a page every second,
  129.  * it would take 136 years to overrun this counter, so we can
  130.  * get away with saving it persistently.  I hope this software is
  131.  * obsolete by then.
  132.  */
  133. class CPage
  134.     {
  135.     private:
  136.         DWORD       m_dwID;             //Persistent identifier
  137.         LPSTORAGE   m_pIStorage;        //Substorage for this page
  138.         HWND        m_hWnd;             //Pages window
  139.         DWORD       m_cOpens;           //Calls to Open
  140.         class CPages *m_pPG;            //Pages window
  141.         DWORD       m_dwIDNext;
  142.         DWORD       m_cTenants;
  143.         HWND        m_hWndTenantList;   //Listbox; our tenant list
  144.         UINT        m_iTenantCur;
  145.         PCTenant    m_pTenantCur;
  146.         UINT        m_uHTCode;          //Last hit-test/mouse move
  147.         UINT        m_uSizingFlags;     //Restrictions on sizing
  148.         BOOL        m_fTracking;        //Tracking resize?
  149.         RECTL       m_rclOrg;           //Original before tracking
  150.         RECTL       m_rcl;              //Tracking rectangle
  151.         RECTL       m_rclBounds;        //Boundaries f/size tracking
  152.         HDC         m_hDC;              //Tracking hDC
  153.         //CHAPTER13MOD
  154.         BOOL        m_fDragPending;     //Waiting for drag?
  155.         //End CHAPTER13MOD
  156.         BOOL        m_fSizePending;     //Waiting for debounce?
  157.         int         m_cxyDist;          //Debounce distance
  158.         UINT        m_cDelay;           //Debounce delay
  159.         POINTS      m_ptDown;           //Point of click to debounce
  160.         //CHAPTER13MOD
  161.         UINT        m_uKeysDown;        //Keys when click happens
  162.         //End CHAPTER13MOD
  163.         DWORD       m_fTimer;           //Timer active?
  164.     protected:
  165.         BOOL         TenantGet(UINT, PCTenant *, BOOL);
  166.         BOOL         TenantAdd(UINT, DWORD, PCTenant *);
  167.         LPDATAOBJECT TransferObjectCreate(PPOINTL);
  168.         //PAGEMOUS.CPP
  169.         UINT         TenantFromPoint(UINT, UINT, PCTenant *);
  170.         //CHAPTER13MOD
  171.         BOOL         DragDrop(UINT, UINT, UINT);
  172.         //End CHAPTER13MOD
  173.     public:
  174.         CPage(DWORD, HWND, class CPages *);
  175.         ~CPage(void);
  176.         DWORD       GetID(void);
  177.         BOOL        Open(LPSTORAGE);
  178.         void        Close(BOOL);
  179.         BOOL        Update(void);
  180.         void        Destroy(LPSTORAGE);
  181.         UINT        GetStorageName(LPOLESTR);
  182.         void        Draw(HDC, int, int, BOOL, BOOL);
  183.         BOOL        TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
  184.                         , PPATRONOBJECT, DWORD);
  185.         BOOL        TenantDestroy(void);
  186.         BOOL        TenantClip(BOOL);
  187.         BOOL        FQueryObjectSelected(HMENU);
  188.         //PAGEMOUSE.CPP
  189.         BOOL        OnLeftDown(UINT, UINT, UINT);
  190.         BOOL        OnLeftDoubleClick(UINT, UINT, UINT);
  191.         BOOL        OnLeftUp(UINT, UINT, UINT);
  192.         void        OnMouseMove(UINT, int, int);
  193.         void        OnTimer(UINT);
  194.         void        StartSizeTracking(void);
  195.         void        OnNCHitTest(UINT, UINT);
  196.         BOOL        OnSetCursor(UINT);
  197.     };
  198. typedef CPage *PCPage;
  199. /*
  200.  * Structures to save with the document describing the device
  201.  * configuration and pages that we have.  This is followed by
  202.  * a list of DWORD IDs for the individual pages.
  203.  */
  204. typedef struct tagDEVICECONFIG
  205.     {
  206.     DWORD       cb;                         //Size of structure
  207.     TCHAR       szDriver[CCHDEVICENAME];
  208.     TCHAR       szDevice[CCHDEVICENAME];
  209.     TCHAR       szPort[CCHDEVICENAME];
  210.     DWORD       cbDevMode;                  //Size of actual DEVMODE
  211.     DEVMODE     dm;                         //Variable
  212.     } DEVICECONFIG, *PDEVICECONFIG;
  213. //Offset to cbDevMode
  214. #define CBSEEKOFFSETCBDEVMODE  (sizeof(DWORD)   
  215.                                +(3*CCHDEVICENAME*sizeof(TCHAR)))
  216. //Combined OLE and Patron device structures.
  217. typedef struct tagCOMBINEDEVICE
  218.     {
  219.     DVTARGETDEVICE  td;
  220.     DEVICECONFIG    dc;
  221.     } COMBINEBDEVICE, *PCOMBINEDEVICE;
  222. typedef struct tagPAGELIST
  223.     {
  224.     DWORD       cPages;
  225.     DWORD       iPageCur;
  226.     DWORD       dwIDNext;
  227.     } PAGELIST, *PPAGELIST;
  228. //PRINT.CPP
  229. BOOL    APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
  230. BOOL    APIENTRY AbortProc(HDC, int);
  231. //PAGEWIN.CPP
  232. LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
  233. void             RectConvertMappings(LPRECT, HDC, BOOL);
  234. class CPages : public CWindow
  235.     {
  236.     friend LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
  237.     friend BOOL    APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
  238.     friend class CPage;
  239.     friend class CTenant;
  240.     //CHAPTER13MOD
  241.     friend class CDropTarget;
  242.     //End CHAPTER13MOD
  243.     protected:
  244.         PCPage      m_pPageCur;             //Current page
  245.         UINT        m_iPageCur;             //Current page
  246.         UINT        m_cPages;               //Number of pages
  247.         HWND        m_hWndPageList;         //Listbox with page list
  248.         HFONT       m_hFont;                //Page font
  249.         BOOL        m_fSystemFont;          //m_hFont system object?
  250.         UINT        m_cx;                   //Page size in LOMETRIC
  251.         UINT        m_cy;
  252.         UINT        m_xMarginLeft;          //Unusable margins,
  253.         UINT        m_xMarginRight;         //in LOMETRIC
  254.         UINT        m_yMarginTop;
  255.         UINT        m_yMarginBottom;
  256.         UINT        m_xPos;                 //Viewport scroll pos,
  257.         UINT        m_yPos;                 //both in *PIXELS*
  258.         DWORD       m_dwIDNext;             //Next ID for a page.
  259.         LPSTORAGE   m_pIStorage;            //Root storage
  260.         UINT        m_cf;                   //Clipboard format
  261.         BOOL        m_fDirty;
  262.         //CHAPTER13MOD
  263.         BOOL        m_fDragSource;          //Source==target?
  264.         BOOL        m_fMoveInPage;          //Moving in same page
  265.         POINTL      m_ptDrop;               //Where to move object
  266.         BOOL        m_fDragRectShown;       //Is rect on the screen?
  267.         UINT        m_uScrollInset;         //Hit-test for drag-drop
  268.         UINT        m_uScrollDelay;         //Delay before repeat
  269.         DWORD       m_dwTimeLast;           //Ticks on last DragOver
  270.         UINT        m_uHScrollCode;         //L/R on scroll repeat?
  271.         UINT        m_uVScrollCode;         //U/D on scroll repeat?
  272.         UINT        m_uLastTest;            //Last test result
  273.         POINTL      m_ptlRect;              //Last feedback rectangle
  274.         SIZEL       m_szlRect;
  275.         //End CHAPTER13MOD
  276.     protected:
  277.         void        Draw(HDC, BOOL, BOOL);
  278.         void        UpdateScrollRanges(void);
  279.         BOOL        ConfigureForDevice(void);
  280.         BOOL        PageGet(UINT, PCPage *, BOOL);
  281.         BOOL        PageAdd(UINT, DWORD, BOOL);
  282.         void        CalcBoundingRect(LPRECT, BOOL);
  283.         //CHAPTER13MOD
  284.         //DRAGDROP.CPP
  285.         UINT        UTestDroppablePoint(PPOINTL);
  286.         void        DrawDropTargetRect(PPOINTL, LPSIZEL);
  287.         void        AdjustPosition(PPOINTL, LPSIZEL);
  288.         //End CHAPTER13MOD
  289.     public:
  290.         CPages(HINSTANCE, UINT);
  291.         ~CPages(void);
  292.         BOOL        Init(HWND, LPRECT, DWORD, UINT, LPVOID);
  293.         BOOL        StorageSet(LPSTORAGE, BOOL, BOOL);
  294.         BOOL        StorageUpdate(BOOL);
  295.         BOOL        Print(HDC, LPTSTR, DWORD, UINT, UINT, UINT);
  296.         void        RectGet(LPRECT);
  297.         void        RectSet(LPRECT, BOOL);
  298.         void        SizeGet(LPRECT);
  299.         void        SizeSet(LPRECT, BOOL);
  300.         PCPage      ActivePage(void);
  301.         UINT        PageInsert(UINT);
  302.         UINT        PageDelete(UINT);
  303.         UINT        CurPageGet(void);
  304.         UINT        CurPageSet(UINT);
  305.         UINT        NumPagesGet(void);
  306.         BOOL        DevModeSet(HGLOBAL, HGLOBAL);
  307.         HGLOBAL     DevModeGet(void);
  308.         BOOL        FIsDirty(void);
  309.         BOOL        DevReadConfig(PCOMBINEDEVICE *, HDC *);
  310.         BOOL        TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
  311.                         , PPATRONOBJECT, DWORD);
  312.         BOOL        TenantDestroy(void);
  313.         BOOL        TenantClip(BOOL);
  314.         BOOL        FQueryObjectSelected(HMENU);
  315.     };
  316. typedef CPages *PCPages;
  317. //Fixed names of streams in the Pages IStorage
  318. #define SZSTREAMPAGELIST        OLETEXT("Page List")
  319. #define SZSTREAMDEVICECONFIG    OLETEXT("Device Configuration")
  320. //CHAPTER13MOD
  321. //Return values for UTestDroppablePoint
  322. #define UDROP_NONE              0x0000      //Exclusive
  323. #define UDROP_CLIENT            0x0001      //Inclusive
  324. #define UDROP_INSETLEFT         0x0002      //L/R are exclusive
  325. #define UDROP_INSETRIGHT        0x0004
  326. #define UDROP_INSETHORZ         (UDROP_INSETLEFT | UDROP_INSETRIGHT)
  327. #define UDROP_INSETTOP          0x0008      //T/B are exclusive
  328. #define UDROP_INSETBOTTOM       0x0010
  329. #define UDROP_INSETVERT         (UDROP_INSETTOP | UDROP_INSETBOTTOM)
  330. //End CHAPTER13MOD
  331. #endif  //_PAGES_H_