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

Windows编程

开发平台:

Visual C++

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