📄 pages.cpp
字号:
* uReserved UINT unused
*
* Return Value:
* UINT Index to the now current page from the page
* list, NOVALUE on error.
*/
UINT CPages::PageDelete(UINT uReserved)
{
PCPage pPage;
if (!PageGet(m_iPageCur, &pPage, FALSE))
return NOVALUE;
//Delete the page in both the storage and in memory.
SendMessage(m_hWndPageList, LB_DELETESTRING, m_iPageCur, 0L);
m_pPageCur->Destroy(m_pIStorage);
m_pPageCur->Release(); //Does final pPage->Close
m_pPageCur=NULL;
/*
* If this is the last page then the current is one less. If
* it's the only page the current is zero. Otherwise the
* current is the next page.
*/
if (m_iPageCur==m_cPages-1) //Covers last or only page.
m_iPageCur--;
m_cPages--;
//Insure the new visible page is open.
if (0!=m_cPages)
{
PageGet(m_iPageCur, &m_pPageCur, TRUE);
InvalidateRect(m_hWnd, NULL, FALSE);
}
else
InvalidateRect(m_hWnd, NULL, TRUE);
UpdateWindow(m_hWnd);
return m_iPageCur;
}
/*
* CPages::CurPageGet
*
* Purpose:
* Retrieves the index of the current page we're viewing.
*
* Parameters:
* None
*
* Return Value:
* UINT Index of the current page.
*/
UINT CPages::CurPageGet(void)
{
return m_iPageCur;
}
/*
* CPages::CurPageSet
*
* Purpose:
* Sets the index of the current page to view.
*
* Parameters:
* iPage UINT index of the page to view. 0 means first
* page, NOVALUE means last page.
*
* Return Value:
* UINT Index of the previous current page, NOVALUE on
* error.
*/
UINT CPages::CurPageSet(UINT iPage)
{
UINT iPageNew;
UINT iPagePrev=m_iPageCur;
PCPage pPage;
switch (iPage)
{
case 0:
iPageNew=0;
break;
case NOVALUE:
iPageNew=m_cPages-1;
break;
default:
if (iPage >= m_cPages)
iPage=0;
iPageNew=iPage;
break;
}
//No reason to switch to the same page.
if (iPagePrev==iPageNew)
return iPage;
//Close the old page committing changes.
if (!PageGet(iPagePrev, &pPage, FALSE))
return NOVALUE;
pPage->Close(TRUE);
m_iPageCur=iPageNew;
//Open the new page.
PageGet(m_iPageCur, &m_pPageCur, TRUE);
InvalidateRect(m_hWnd, NULL, FALSE);
UpdateWindow(m_hWnd);
return iPagePrev;
}
/*
* CPages::NumPagesGet
*
* Purpose:
* Returns the number of pages this object current contains.
*
* Parameters:
* None
*
* Return Value:
* UINT Number of pages we contain.
*/
UINT CPages::NumPagesGet(void)
{
return m_cPages;
}
/*
* CPages::TenantCreate
* CPages::TenantDestroy
*
* Purpose:
* Pass-throughs for CPage members on the current page.
*/
BOOL CPages::TenantCreate(TENANTTYPE tType, LPVOID pv
, LPFORMATETC pFE, PPATRONOBJECT ppo, DWORD dwData)
{
BOOL fRet;
if (NULL==m_pPageCur)
return FALSE;
fRet=m_pPageCur->TenantCreate(tType, pv, pFE, ppo, dwData);
m_fDirty |= fRet;
return fRet;
}
BOOL CPages::TenantDestroy(void)
{
BOOL fRet;
if (NULL==m_pPageCur)
return FALSE;
fRet=m_pPageCur->TenantDestroy();
m_fDirty |= fRet;
return fRet;
}
/*
* CPages::TenantClip
*
* Purpose:
* Copies or cuts the currently selected tenant to the clipoard.
*
* Parameters:
* fCut BOOL TRUE to cut the object, FALSE to copy.
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CPages::TenantClip(BOOL fCut)
{
BOOL fRet;
if (NULL==m_pPageCur)
return FALSE;
fRet=m_pPageCur->TenantClip(fCut);
m_fDirty |= (fRet && fCut);
return fRet;
}
/*
* CPages::FQueryObjectSelected
*
* Purpose:
* Returns whether or not there is an object selected on this
* page for Cut, Copy, Delete functions.
*
* Parameters:
* hMenu HMENU on which object related items live.
*
* Return Value:
* BOOL TRUE if we have an object, FALSE otherwise.
*/
BOOL CPages::FQueryObjectSelected(HMENU hMenu)
{
if (NULL==m_pPageCur)
return FALSE;
return m_pPageCur->FQueryObjectSelected(hMenu);
}
//CHAPTER22MOD
/*
* CPages::ActivateObject
*
* Purpose:
* Executes a verb on the currently selected object.
*
* Parameters:
* iVerb LONG of the selected verb.
* pMSG LPMSG to whatever invoked the verb.
*
* Return Value:
* None
*/
void CPages::ActivateObject(LONG iVerb, LPMSG pMSG)
{
if (NULL==m_pPageCur)
return;
m_pPageCur->ActivateObject(iVerb, pMSG);
return;
}
//End CHAPTER22MOD
/*
* CPages::ShowObjectTypes
*
* Purpose:
* Pass-through to CPage::ShowObjectTypes
*
* Parameters:
* fShow BOOL indicating to show the type or not.
*
* Return Value:
* None
*/
void CPages::ShowObjectTypes(BOOL fShow)
{
if (NULL==m_pPageCur)
return;
m_fShowTypes=fShow;
m_pPageCur->ShowObjectTypes(fShow);
return;
}
/*
* CPages::NotifyTenantsOfRename
*
* Purpose:
* Pass-through to CPage to tell tenants that the document
* changes names.
*
* Parameters:
* pszFile LPTSTR of the new filename.
* pmk LPMONKIER to the new file moniker.
*
* Return Value:
* None
*/
void CPages::NotifyTenantsOfRename(LPTSTR pszFile, LPMONIKER pmk)
{
if (NULL==m_pPageCur)
return;
ReleaseInterface(m_pmkFile);
m_pmkFile=pmk;
m_pmkFile->AddRef();
m_pPageCur->NotifyTenantsOfRename(pszFile, pmk);
return;
}
/*
* CPages::FQueryLinksInPage
*
* Purpose:
* Pass through to current page to see if there are any
* linked objects
*
* Parameters:
* None
*
* Return Value:
* None
*/
BOOL CPages::FQueryLinksInPage()
{
if (NULL==m_pPageCur)
return FALSE;
return m_pPageCur->FQueryLinksInPage();
}
/*
* CPages::GetUILinkContainer
*
* Purpose:
* Creates an object with the IOleUILinkContainer interface for
* the links dialog. We know the current page which is what
* we need to create this thing, so we can create it here instead
* of bugging the page for it.
*
* Parameters:
* ppObj PCIOleUILinkContainer * in which we return
* the pointer.
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CPages::GetUILinkContainer(PCIOleUILinkContainer *ppObj)
{
PCIOleUILinkContainer pObj;
*ppObj=NULL;
if (NULL==m_pPageCur)
return FALSE;
pObj=new CIOleUILinkContainer(m_pPageCur);
if (NULL==pObj)
return FALSE;
if (!pObj->Init())
{
delete pObj;
return FALSE;
}
pObj->AddRef();
*ppObj=pObj;
return TRUE;
}
/*
* CPages::ConvertObject
*
* Purpose:
* Pass-through to the current page.
*
* Parameters:
* hWndFrame HWND of the frame window.
*
* Return Value:
* BOOL TRUE if the function is successful, FALSE
* otherwise.
*/
BOOL CPages::ConvertObject(HWND hWndFrame)
{
if (NULL==m_pPageCur)
return FALSE;
return m_pPageCur->ConvertObject(hWndFrame, FALSE);
}
/*
* CPages::CalcBoundingRect
* (Protected)
*
* Purpose:
* Calculates a rectangle that bounds the printed page and the
* current scroll state of the window.
*
* Parameters:
* prc LPRECT to fill with window (device) coordinates.
* fWindow BOOL indicating to include the window in this
* calculation or return only the printed page
* coordinates.
*
* Return Value:
* None
*/
void CPages::CalcBoundingRect(LPRECT prc, BOOL fWindow)
{
RECT rc, rcT;
if (NULL==prc)
return;
//Calculate the boundaries for sizing: intersect page & screen
rc.left=LOMETRIC_BORDER+m_xMarginLeft;
rc.top =-LOMETRIC_BORDER-m_yMarginTop;
rc.right =rc.left+(UINT)m_cx;
rc.bottom=rc.top -(UINT)m_cy;
RectConvertMappings(&rc, NULL, TRUE);
OffsetRect(&rc, -(int)m_xPos, -(int)m_yPos);
if (!fWindow)
{
*prc=rc;
return;
}
//Intersect with window to make the size bounds.
GetClientRect(m_hWnd, &rcT);
IntersectRect(prc, &rc, &rcT);
return;
}
/*
* CPages::PageGet
* (Protected)
*
* Purpose:
* Returns a page of a given index returning a BOOL so it's simple
* to use this function inside if statements.
*
* Parameters:
* iPage UINT page to retrieve 0 based.
* ppPage PCPage * in which to return the page pointer
* fOpen BOOL indicating if we should open this page as
* well.
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CPages::PageGet(UINT iPage, PCPage *ppPage, BOOL fOpen)
{
if (NULL==ppPage)
return FALSE;
if (LB_ERR!=SendMessage(m_hWndPageList, LB_GETTEXT
, iPage, (LONG)ppPage))
{
if (fOpen)
(*ppPage)->Open(m_pIStorage);
return TRUE;
}
return FALSE;
}
/*
* CPages::PageAdd
* (Protected)
*
* Purpose:
* Creates a new page initialized to the given values. The new
* page's storage is created if it does not already exist. If
* fOpenStorage is set the page's storage is opened and left
* opened.
*
* Parameters:
* iPage UINT Location at which to insert page; new page
* is inserted after this position. NOVALUE for
* the end.
* dwID DWORD ID for this page.
* fOpenStorage BOOL indicating if we're to leave the storage
* open.
*
* Return Value:
* BOOL TRUE if the function succeeded, FALSE otherwise.
*/
BOOL CPages::PageAdd(UINT iPage, DWORD dwID, BOOL fOpenStorage)
{
PCPage pPage;
LRESULT lr;
pPage=new CPage(dwID, m_hWnd, this);
if (NULL==pPage)
return FALSE;
pPage->AddRef();
if (fOpenStorage)
pPage->Open(m_pIStorage);
if (NOVALUE==iPage)
iPage--;
//Now try to add to the listbox.
lr=SendMessage(m_hWndPageList, LB_INSERTSTRING, iPage+1
, (LONG)pPage);
if (LB_ERRSPACE==lr)
{
if (fOpenStorage)
pPage->Close(FALSE);
pPage->Release();
return FALSE;
}
return TRUE;
}
/*
* CPages::IPageGetFromID
* (Protected)
*
* Purpose:
* Returns a page of a given identifier
*
* Parameters:
* dwID DWORD identifier of the page to retrieve. If
* NOVALUE, then we return the current page.
* ppPage PCPage * in which to return the page
* pointer
* fOpen BOOL indicating if we should open this page as
* well.
*
* Return Value:
* UINT Index of the page if successful, NOVALUE
* otherwise.
*/
UINT CPages::IPageGetFromID(DWORD dwID, PCPage *ppPage
, BOOL fOpen)
{
UINT i;
PCPage pPage;
if (NULL==ppPage)
return FALSE;
if ((LONG)-1==(LONG)dwID)
{
*ppPage=m_pPageCur;
return m_iPageCur;
}
*ppPage=NULL;
for (i=0; i < m_cPages; i++)
{
if (!PageGet(i, &pPage, FALSE))
continue;
if (pPage->GetID()==dwID)
{
if (fOpen)
pPage->Open(m_pIStorage);
*ppPage=pPage;
return i;
}
}
return NOVALUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -