📄 viewprev.cpp
字号:
m_nZoomOutPages = m_nPages;
// Just do this to set the status correctly and invalidate
SetCurrentPage(m_nCurrentPage, TRUE);
}
void CPreviewView::OnNextPage()
{
SetCurrentPage(m_nCurrentPage + 1, TRUE);
}
void CPreviewView::OnPrevPage()
{
SetCurrentPage(m_nCurrentPage - 1, TRUE);
}
void CPreviewView::OnPreviewPrint()
{
OnPreviewClose(); // force close of Preview
// cause print (can be overridden by catching the command)
CWnd* pMainWnd = AfxGetThread()->m_pMainWnd;
ASSERT_VALID(pMainWnd);
pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT);
}
// Finds page pointed to and convert to 1:1 screen device units
BOOL CPreviewView::FindPageRect(CPoint& point, UINT& nPage)
{
if (m_nZoomState != ZOOM_OUT)
point += (CSize)GetDeviceScrollPosition();
for (nPage = 0; nPage < m_nPages; nPage++)
{
if (m_pPageInfo[nPage].rectScreen.PtInRect(point))
{
// adjust point for page position
point -= (CSize)m_pPageInfo[nPage].rectScreen.TopLeft();
// convert to 1:1
point.x = MulDiv(point.x, m_pPageInfo[nPage].sizeScaleRatio.cy,
m_pPageInfo[nPage].sizeScaleRatio.cx);
point.y = MulDiv(point.y, m_pPageInfo[nPage].sizeScaleRatio.cy,
m_pPageInfo[nPage].sizeScaleRatio.cx);
return TRUE;
}
}
return FALSE;
}
void CPreviewView::OnLButtonDown(UINT, CPoint point)
{
UINT nPage;
if (!FindPageRect(point, nPage))
return; // Didn't click on a page
// Set new zoom state
SetZoomState((m_nZoomState == ZOOM_IN) ? ZOOM_OUT : m_nZoomState + 1,
nPage, point);
}
void CPreviewView::SetZoomState(UINT nNewState, UINT nPage, CPoint point)
{
if (m_nZoomState != nNewState)
{
m_nZoomState = nNewState;
DoZoom(nPage, point);
}
}
void CPreviewView::OnZoomIn()
{
if (m_nZoomState != ZOOM_IN)
SetZoomState(m_nZoomState + 1, 0, CPoint(0, 0));
}
void CPreviewView::OnZoomOut()
{
if (m_nZoomState != ZOOM_OUT)
SetZoomState(m_nZoomState - 1, 0, CPoint(0, 0));
}
// Actual zoom code.
void CPreviewView::DoZoom(UINT nPage, CPoint point)
{
if (m_nZoomState == ZOOM_OUT)
{
// taking over scroll bars
m_nPages = m_nZoomOutPages;
ShowScrollBar(SB_HORZ, FALSE); //hide the horizontal bar
BOOL bShowBar = m_pPreviewInfo->GetMaxPage() < 0x8000 &&
m_pPreviewInfo->GetMaxPage() -
m_pPreviewInfo->GetMinPage() <= 32767U;
ShowScrollBar(SB_VERT, bShowBar); //Show the vertical bar
if (bShowBar)
{
SCROLLINFO info;
info.fMask = SIF_PAGE|SIF_RANGE;
info.nMin = m_pPreviewInfo->GetMinPage();
info.nMax = m_pPreviewInfo->GetMaxPage();
info.nPage = 1;
if (!SetScrollInfo(SB_VERT, &info, FALSE))
SetScrollRange(SB_VERT, info.nMin, info.nMax, FALSE);
}
SetCurrentPage(m_nCurrentPage, TRUE);
}
else
{
m_nPages = 1; // only one page in zoomed states
m_pPageInfo[0].sizeZoomOutRatio = m_pPageInfo[nPage].sizeZoomOutRatio;
m_pPageInfo[0].sizeUnscaled = m_pPageInfo[nPage].sizeUnscaled;
// Sets the printer page
SetCurrentPage(m_nCurrentPage + nPage, FALSE);
SetScaledSize(0);
CSize* pRatio = &m_pPageInfo[nPage].sizeScaleRatio;
// convert Hit Point from screen 1:1
point.x = MulDiv(point.x, pRatio->cx, pRatio->cy);
point.y = MulDiv(point.y, pRatio->cx, pRatio->cy);
// Adjust point for page position
point += (CSize)m_pPageInfo[0].rectScreen.TopLeft();
// Scroll to center
CenterOnPoint(point);
}
}
void CPreviewView::SetCurrentPage(UINT nPage, BOOL bClearRatios)
{
m_nCurrentPage = nPage;
if (m_nCurrentPage > m_pPreviewInfo->GetMaxPage())
m_nCurrentPage = m_pPreviewInfo->GetMaxPage();
if (m_nCurrentPage < m_pPreviewInfo->GetMinPage())
m_nCurrentPage = m_pPreviewInfo->GetMinPage();
if (m_nZoomState == ZOOM_OUT)
SetScrollPos(SB_VERT, m_nCurrentPage);
if (bClearRatios)
{
// Force Recalc of layout
for (UINT i = 0; i < m_nMaxPages; i++)
m_pPageInfo[i].sizeScaleRatio.cx = 0; // zero scale ratios
}
Invalidate(TRUE);
}
void CPreviewView::OnDisplayPageNumber(UINT nPage, UINT nPagesDisplayed)
{
UINT nEndPage = nPage + nPagesDisplayed - 1;
CFrameWnd* pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd;
ASSERT_VALID(pParent);
ASSERT_KINDOF(CFrameWnd, pParent);
int nSubString = (nPagesDisplayed == 1) ? 0 : 1;
CString s;
if (AfxExtractSubString(s, m_pPreviewInfo->m_strPageDesc, nSubString))
{
TCHAR szBuf[80];
if (nSubString == 0)
wsprintf(szBuf, s, nPage);
else
wsprintf(szBuf, s, nPage, nEndPage);
pParent->SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)(LPVOID)szBuf);
}
else
{
TRACE1("Malformed Page Description string. Could not get string %d.\n",
nSubString);
}
}
void CPreviewView::OnUpdateNumPageChange(CCmdUI* pCmdUI)
{
// set text of button to opposite of current state
CString text;
UINT nPages = m_nZoomState == ZOOM_OUT ? m_nPages : m_nZoomOutPages;
VERIFY(text.LoadString(nPages == 1 ? AFX_IDS_TWOPAGE : AFX_IDS_ONEPAGE));
pCmdUI->SetText(text);
// enable it only if valid to display another page and not zoomed
pCmdUI->Enable(m_nZoomState == ZOOM_OUT && m_nMaxPages != 1 &&
(m_pPreviewInfo->GetMaxPage() > 1 || m_nPages > 1));
}
void CPreviewView::OnUpdateNextPage(CCmdUI* pCmdUI)
{
// enable if not showing last page
pCmdUI->Enable(m_nCurrentPage+m_nPages-1 < m_pPreviewInfo->GetMaxPage());
}
void CPreviewView::OnUpdatePrevPage(CCmdUI* pCmdUI)
{
// enable if not showing First page
pCmdUI->Enable(m_nCurrentPage > m_pPreviewInfo->GetMinPage());
}
void CPreviewView::OnUpdateZoomIn(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nZoomState != ZOOM_IN);
}
void CPreviewView::OnUpdateZoomOut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nZoomState != ZOOM_OUT);
}
BOOL CPreviewView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest != HTCLIENT)
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
CPoint point;
::GetCursorPos(&point);
ScreenToClient(&point); // client coordinates of mouse position
UINT nPage;
if (m_nZoomState != ZOOM_IN && FindPageRect(point, nPage))
{ // On a page and not zoomed all the way in
if (m_hMagnifyCursor == NULL)
{
HINSTANCE hInst = AfxFindResourceHandle(
MAKEINTRESOURCE(AFX_IDC_MAGNIFY), RT_GROUP_CURSOR);
m_hMagnifyCursor = ::LoadCursor(hInst,
MAKEINTRESOURCE(AFX_IDC_MAGNIFY));
}
::SetCursor(m_hMagnifyCursor);
}
else
{
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CPreviewView diagnostics
#ifdef _DEBUG
void CPreviewView::AssertValid() const
{
CView::AssertValid();
ASSERT_VALID(&m_dcPrint);
if (m_pPreviewDC != NULL)
ASSERT_VALID(m_pPreviewDC);
switch (m_nZoomState)
{
case ZOOM_OUT:
case ZOOM_IN:
case ZOOM_MIDDLE:
break;
default:
ASSERT(FALSE); // unknown zoom state
}
switch (m_nMapMode)
{
case MM_TEXT:
case MM_LOMETRIC:
case MM_HIMETRIC:
case MM_LOENGLISH:
case MM_HIENGLISH:
case MM_TWIPS:
case MM_ISOTROPIC:
case MM_ANISOTROPIC:
break;
default:
ASSERT(FALSE); // unknown mapping mode
}
}
void CPreviewView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
dc << "m_pPrintView = " << m_pPrintView;
dc << "\nm_pOrigView = " << m_pOrigView;
dc << "\nm_bPageNumDisplayed = " << m_bPageNumDisplayed;
dc << "\nm_bCenter = " << m_bCenter;
dc << "\nm_nPages = " << m_nPages;
dc << "\nm_nCurrentPage " << m_nCurrentPage;
dc << "\nm_nSecondPageOffset " << m_nSecondPageOffset;
dc << "\nm_nMaxPages = " << m_nMaxPages;
dc << "\nm_sizePrinterPPI = " << m_sizePrinterPPI;
dc << "\nm_ptCenterPoint = " << m_ptCenterPoint;
dc << "\nm_nZoomState = ";
switch (m_nZoomState)
{
case ZOOM_OUT:
dc << "ZOOM_OUT";
break;
case ZOOM_IN:
dc << "ZOOM_IN";
break;
case ZOOM_MIDDLE:
dc << "ZOOM_MIDDLE";
break;
default:
dc << "*unknown*";
break;
}
dc << "\nm_nMapMode = ";
switch (m_nMapMode)
{
case MM_TEXT:
dc << "MM_TEXT";
break;
case MM_LOMETRIC:
dc << "MM_LOMETRIC";
break;
case MM_HIMETRIC:
dc << "MM_HIMETRIC";
break;
case MM_LOENGLISH:
dc << "MM_LOENGLISH";
break;
case MM_HIENGLISH:
dc << "MM_HIENGLISH";
break;
case MM_TWIPS:
dc << "MM_TWIPS";
break;
case MM_ISOTROPIC:
dc << "MM_ISOTROPIC";
break;
case MM_ANISOTROPIC:
dc << "MM_ANISOTROPIC";
break;
default:
dc << "*unknown*";
break;
}
dc << "\nm_dcPrint = " << &m_dcPrint;
dc << "\nm_pPreviewDC = " << m_pPreviewDC;
dc << "\n";
}
#endif //_DEBUG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNCREATE(CPreviewView, CScrollView)
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -