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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * PAGES.CPP
  3.  * Patron Chapter 1
  4.  *
  5.  * Implementation of the CPages class.  See PAGEWIN.CPP and PRINT.CPP
  6.  * for additional member functions.
  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. #include "patron.h"
  15. /*
  16.  * CPages:CPages
  17.  * CPages::~CPages
  18.  *
  19.  * Constructor Parameters:
  20.  *  hInst           HINSTANCE of the application we're in.
  21.  */
  22. CPages::CPages(HINSTANCE hInst)
  23.     : CWindow(hInst)
  24.     {
  25.     m_iPageCur=NOVALUE;  //Pages are 0 indexed, this is one before
  26.     m_cPages=0;
  27.     m_hWndPageList=NULL;
  28.     m_hFont=NULL;
  29.     m_fSystemFont=FALSE;
  30.     //Initialize to 8.5*11 inch with .25 inch margins as a default.
  31.     m_cx=(LOMETRIC_PER_INCH*17)/2;
  32.     m_cy=LOMETRIC_PER_INCH*11;
  33.     m_xMarginLeft=LOMETRIC_PER_INCH/4;
  34.     m_xMarginRight=LOMETRIC_PER_INCH/4;
  35.     m_yMarginTop=LOMETRIC_PER_INCH/4;
  36.     m_yMarginBottom=LOMETRIC_PER_INCH/4;
  37.     m_xPos=0L;
  38.     m_yPos=0L;
  39.     m_dwIDNext=0;
  40.     m_hDevMode=NULL;
  41.     return;
  42.     }
  43. CPages::~CPages(void)
  44.     {
  45.     //Ensure memory is cleaned up in the list
  46.     New();
  47.     if (NULL!=m_hFont && !m_fSystemFont)
  48.         DeleteObject(m_hFont);
  49.     if (NULL!=m_hWndPageList)
  50.         DestroyWindow(m_hWndPageList);
  51.     return;
  52.     }
  53. /*
  54.  * CPages::Init
  55.  *
  56.  * Purpose:
  57.  *  Instantiates a pages window within a given parent.  The
  58.  *  parent may be a main application window, could be an MDI child
  59.  *  window. We really do not care.
  60.  *
  61.  * Parameters:
  62.  *  hWndParent      HWND of the parent of this window
  63.  *  pRect           LPRECT that this window should occupy
  64.  *  dwStyle         DWORD containing the window's style flags.
  65.  *                  Should contain WS_CHILD | WS_VISIBLE in
  66.  *                  typical circumstances.
  67.  *  uID             UINT ID to associate with this window
  68.  *  pv              LPVOID unused for now.
  69.  *
  70.  * Return Value:
  71.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  72.  */
  73. BOOL CPages::Init(HWND hWndParent, LPRECT pRect, DWORD dwStyle
  74.     , UINT uID, LPVOID pv)
  75.     {
  76.     int     cy;
  77.     m_hWnd=CreateWindowEx(WS_EX_NOPARENTNOTIFY, SZCLASSPAGES
  78.         , SZCLASSPAGES, dwStyle, pRect->left, pRect->top
  79.         , pRect->right-pRect->left, pRect->bottom-pRect->top
  80.         , hWndParent, (HMENU)uID, m_hInst, this);
  81.     if (NULL==m_hWnd)
  82.         return FALSE;
  83.     /*
  84.      * Create the hidden listbox we'll use to track pages.  We give
  85.      * it the owner-draw style so we can just store pointers in it.
  86.      */
  87.     m_hWndPageList=CreateWindow(TEXT("listbox"), TEXT("Page List")
  88.         , WS_POPUP | LBS_OWNERDRAWFIXED, 0, 0, 100, 100
  89.         , HWND_DESKTOP, NULL, m_hInst, NULL);
  90.     if (NULL==m_hWndPageList)
  91.         return FALSE;
  92.     //Create a 14 point Arial font, or use the system variable font.
  93.     cy=MulDiv(-14, LOMETRIC_PER_INCH, 72);
  94.     m_hFont=CreateFont(cy, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE
  95.         , ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY
  96.         , VARIABLE_PITCH | FF_SWISS, TEXT("Arial"));
  97.     if (NULL==m_hFont)
  98.         {
  99.         m_hFont=(HFONT)GetStockObject(ANSI_VAR_FONT);
  100.         m_fSystemFont=TRUE;
  101.         }
  102.     return TRUE;
  103.     }
  104. /*
  105.  * CPages::New
  106.  *
  107.  * Purpose:
  108.  *  Cleans out and reinitializes the data to defaults.
  109.  *
  110.  * Parameters:
  111.  *  None
  112.  *
  113.  * Return Value:
  114.  *  None
  115.  */
  116. void CPages::New(void)
  117.     {
  118.     PCPage      pPage;
  119.     UINT        i;
  120.     //First walk the page list and clean out the allocations.
  121.     for (i=0; i < m_cPages; i++)
  122.         {
  123.         if (PageGet(i, &pPage, FALSE))
  124.             delete pPage;
  125.         }
  126.     if (NULL!=m_hWndPageList)
  127.         SendMessage(m_hWndPageList, LB_RESETCONTENT, 0, 0L);
  128.     if (NULL!=m_hDevMode)
  129.         GlobalFree(m_hDevMode);
  130.     return;
  131.     }
  132. /*
  133.  * CPages::RectGet
  134.  *
  135.  * Purpose:
  136.  *  Returns the rectangle of the Pages window in parent coordinates.
  137.  *
  138.  * Parameters:
  139.  *  pRect           LPRECT in which to return the rectangle.
  140.  *
  141.  * Return Value:
  142.  *  None
  143.  */
  144. void CPages::RectGet(LPRECT pRect)
  145.     {
  146.     RECT        rc;
  147.     POINT       pt;
  148.     //Retrieve the size of our rectangle in parent coordinates.
  149.     GetWindowRect(m_hWnd, &rc);
  150.     pt.x=rc.left;
  151.     pt.y=rc.top;
  152.     ScreenToClient(GetParent(m_hWnd), &pt);
  153.     SetRect(pRect, pt.x, pt.y, pt.x+(rc.right-rc.left)
  154.         , pt.y+(rc.bottom-rc.top));
  155.     return;
  156.     }
  157. /*
  158.  * CPages::RectSet
  159.  *
  160.  * Purpose:
  161.  *  Sets a new rectangle for the Pages window which sizes to fit.
  162.  *  Coordinates are given in parent terms.
  163.  *
  164.  * Parameters:
  165.  *  pRect           LPRECT containing the new rectangle.
  166.  *  fNotify         BOOL indicating if we're to notify anyone of
  167.  *                  the change.
  168.  *
  169.  * Return Value:
  170.  *  None
  171.  */
  172. void CPages::RectSet(LPRECT pRect, BOOL fNotify)
  173.     {
  174.     UINT        cx, cy;
  175.     if (NULL==pRect)
  176.         return;
  177.     cx=pRect->right-pRect->left;
  178.     cy=pRect->bottom-pRect->top;
  179.     SetWindowPos(m_hWnd, NULL, pRect->left, pRect->top
  180.         , (UINT)cx, (UINT)cy, SWP_NOZORDER);
  181.     UpdateScrollRanges();
  182.     return;
  183.     }
  184. /*
  185.  * CPages::SizeGet
  186.  *
  187.  * Purpose:
  188.  *  Retrieves the size of the pages window in parent coordinates.
  189.  *
  190.  * Parameters:
  191.  *  pRect           LPRECT in which to return the size.  The right
  192.  *                  and bottom fields will contain the dimensions.
  193.  *
  194.  * Return Value:
  195.  *  None
  196.  */
  197. void CPages::SizeGet(LPRECT pRect)
  198.     {
  199.     RectGet(pRect);
  200.     return;
  201.     }
  202. /*
  203.  * CPages::SizeSet
  204.  *
  205.  * Purpose:
  206.  *  Sets a new size in parent coordinates for the Pages window.
  207.  *
  208.  * Parameters:
  209.  *  pRect           LPRECT containing the new rectangle.
  210.  *  fNotify         BOOL indicating if we're to notify anyone of
  211.  *                  the change.
  212.  *
  213.  * Return Value:
  214.  *  None
  215.  */
  216. void CPages::SizeSet(LPRECT pRect, BOOL fNotify)
  217.     {
  218.     UINT        cx, cy;
  219.     if (NULL==pRect)
  220.         return;
  221.     cx=pRect->right-pRect->left;
  222.     cy=pRect->bottom-pRect->top;
  223.     SetWindowPos(m_hWnd, NULL, 0, 0, (UINT)cx, (UINT)cy
  224.         , SWP_NOMOVE | SWP_NOZORDER);
  225.     UpdateScrollRanges();
  226.     return;
  227.     }
  228. /*
  229.  * CPages::ActivePage
  230.  *
  231.  * Purpose:
  232.  *  Returns a CPage pointer to the current page.
  233.  *
  234.  * Parameters:
  235.  *  None
  236.  *
  237.  * Return Value:
  238.  *  PCPage          Pointer to the current page.
  239.  */
  240. PCPage CPages::ActivePage(void)
  241.     {
  242.     PCPage      pPage;
  243.     BOOL        fRet;
  244.     fRet=PageGet(m_iPageCur, &pPage, FALSE);
  245.     return fRet ? pPage : NULL;
  246.     }
  247. /*
  248.  * CPages::PageInsert
  249.  *
  250.  * Purpose:
  251.  *  Creates a new page immediately after the current page.  If
  252.  *  there are no pages then this creates page 1.
  253.  *
  254.  * Parameters:
  255.  *  uReserved       UINT unused
  256.  *
  257.  * Return Value:
  258.  *  UINT            Index of the new page, 0 on failure.
  259.  */
  260. UINT CPages::PageInsert(UINT uReserved)
  261.     {
  262.     //Create and open the new page.
  263.     if (!PageAdd(m_iPageCur, m_dwIDNext, TRUE))
  264.         return 0;
  265.     m_dwIDNext++;
  266.     m_iPageCur++;
  267.     m_cPages++;
  268.     InvalidateRect(m_hWnd, NULL, FALSE);
  269.     UpdateWindow(m_hWnd);
  270.     return m_iPageCur;
  271.     }
  272. /*
  273.  * CPages::PageDelete
  274.  *
  275.  * Removes the current page from the page list.
  276.  *
  277.  * Parameters:
  278.  *  uReserved       UINT unused
  279.  *
  280.  * Return Value:
  281.  *  UINT            Index to the now current page from the page
  282.  *                  list, NOVALUE on error.
  283.  */
  284. UINT CPages::PageDelete(UINT uReserved)
  285.     {
  286.     PCPage      pPage;
  287.     if (!PageGet(m_iPageCur, &pPage, FALSE))
  288.         return NOVALUE;
  289.     //Delete the page in both the listbox and in memory.
  290.     SendMessage(m_hWndPageList, LB_DELETESTRING, m_iPageCur, 0L);
  291.     delete pPage;
  292.     /*
  293.      * If this is the last page then the current is one less.  If
  294.      * it's the only page the current is zero.  Otherwise the
  295.      * current is the next page.
  296.      */
  297.     if (m_iPageCur==m_cPages-1)   //Covers last or only page.
  298.         m_iPageCur--;
  299.     m_cPages--;
  300.     if (0!=m_cPages)
  301.         InvalidateRect(m_hWnd, NULL, FALSE);
  302.     else
  303.         InvalidateRect(m_hWnd, NULL, TRUE);
  304.     UpdateWindow(m_hWnd);
  305.     return m_iPageCur;
  306.     }
  307. /*
  308.  * CPages::CurPageGet
  309.  *
  310.  * Purpose:
  311.  *  Retrieves the index of the current page we're viewing.
  312.  *
  313.  * Parameters:
  314.  *  None
  315.  *
  316.  * Return Value:
  317.  *  UINT            Index of the current page.
  318.  */
  319. UINT CPages::CurPageGet(void)
  320.     {
  321.     return m_iPageCur;
  322.     }
  323. /*
  324.  * CPages::CurPageSet
  325.  *
  326.  * Purpose:
  327.  *  Sets the index of the current page to view.
  328.  *
  329.  * Parameters:
  330.  *  iPage           UINT index of the page to view. 0 means first
  331.  *                  page, NOVALUE means last page.
  332.  *
  333.  * Return Value:
  334.  *  UINT            Index of the previous current page, NOVALUE on
  335.  *                  error.
  336.  */
  337. UINT CPages::CurPageSet(UINT iPage)
  338.     {
  339.     UINT    iPageNew;
  340.     UINT    iPagePrev=m_iPageCur;
  341.     switch (iPage)
  342.         {
  343.         case 0:
  344.             iPageNew=0;
  345.             break;
  346.         case NOVALUE:
  347.             iPageNew=m_cPages-1;
  348.             break;
  349.         default:
  350.             if (iPage >= m_cPages)
  351.                 iPage=0;
  352.             iPageNew=iPage;
  353.             break;
  354.         }
  355.     //No reason to switch to the same page.
  356.     if (iPagePrev==iPageNew)
  357.         return iPage;
  358.     m_iPageCur=iPageNew;
  359.     InvalidateRect(m_hWnd, NULL, FALSE);
  360.     UpdateWindow(m_hWnd);
  361.     return iPagePrev;
  362.     }
  363. /*
  364.  * CPages::NumPagesGet
  365.  *
  366.  * Purpose:
  367.  *  Returns the number of pages this object current contains.
  368.  *
  369.  * Parameters:
  370.  *  None
  371.  *
  372.  * Return Value:
  373.  *  UINT            Number of pages we contain.
  374.  */
  375. UINT CPages::NumPagesGet(void)
  376.     {
  377.     return m_cPages;
  378.     }
  379. /*
  380.  * CPages::PageGet
  381.  * (Protected)
  382.  *
  383.  * Purpose:
  384.  *  Returns a page of a given index returning a BOOL so it's simple
  385.  *  to use this function inside if statements.
  386.  *
  387.  * Parameters:
  388.  *  iPage           UINT page to retrieve.
  389.  *  ppPage          PCPage * in which to return the page
  390.  *                  pointer
  391.  *  fReserved       BOOL reserved for future use.
  392.  *
  393.  * Return Value:
  394.  *  BOOL            TRUE if successful, FALSE otherwise.
  395.  */
  396. BOOL CPages::PageGet(UINT iPage, PCPage *ppPage
  397.     , BOOL fReserved)
  398.     {
  399.     if (NULL==ppPage)
  400.         return FALSE;
  401.     if (LB_ERR!=SendMessage(m_hWndPageList, LB_GETTEXT
  402.         , iPage, (LONG)ppPage))
  403.         return TRUE;
  404.     return FALSE;
  405.     }
  406. /*
  407.  * CPages::PageAdd
  408.  * (Protected)
  409.  *
  410.  * Purpose:
  411.  *  Creates a new page initialized to the given values.
  412.  *
  413.  * Parameters:
  414.  *  iPage           UINT Location at which to insert page; new page
  415.  *                  is inserted after this position.  NOVALUE for
  416.  *                  the end.
  417.  *  cObjects        UINT number of objects on this page.
  418.  *  dwID            DWORD ID for this page.
  419.  *  fReserved       BOOL reserved for future use.
  420.  *
  421.  * Return Value:
  422.  *  BOOL            TRUE if the function succeeded, FALSE otherwise.
  423.  */
  424. BOOL CPages::PageAdd(UINT iPage, DWORD dwID, BOOL fReserved)
  425.     {
  426.     PCPage      pPage;
  427.     LRESULT     lr;
  428.     pPage=new CPage(dwID);
  429.     if (NULL==pPage)
  430.         return FALSE;
  431.     if (NOVALUE==iPage)
  432.         iPage--;
  433.     //Now try to add to the listbox.
  434.     lr=SendMessage(m_hWndPageList, LB_INSERTSTRING, iPage+1
  435.         , (LONG)pPage);
  436.     if (LB_ERRSPACE==lr)
  437.         {
  438.         delete pPage;
  439.         return FALSE;
  440.         }
  441.     return TRUE;
  442.     }