📄 preview.cpp
字号:
// PreView.cpp : implementation file
//
#include "stdafx.h"
#include "a1.h"
#include "PreView.h"
#include "afximpl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPreView
BOOL CALLBACK _AfxPreviewCloseProc(CFrameWnd* pFrameWnd)
{
ASSERT_VALID(pFrameWnd);
CPreView* pView = (CPreView*) pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
ASSERT_KINDOF(CPreView, pView);
pView->ClosePreview();
return FALSE;
}
CPrintPreviewState::CPrintPreviewState()
{
// set defaults
nIDMainPane = AFX_IDW_PANE_FIRST;
dwStates = AFX_CONTROLBAR_MASK(AFX_IDW_STATUS_BAR);
// status bar visible if available
lpfnCloseProc = _AfxPreviewCloseProc;
// set frame hook so closing the frame window
// when in preview state will just end the mode
hMenu = NULL;
pViewActiveOld = NULL;
hAccelTable = NULL;
}
IMPLEMENT_DYNCREATE(CPreView, CScrollView)
CPreView::CPreView()
:mc_iPageHW7Between(30),mc_iMargin(5)
{
m_pPrintView = NULL;
m_pOrigView = NULL;
m_pPreviewInfo = NULL;
m_pPreviewDC = NULL;
m_pPreviewState = NULL;
this->m_psPageSelected.m_bSelected=false;
this->m_psPageSelected.m_opOldState=OP_ROWCOLUMN_ING;
this->m_psPageSelected.m_nPageNumber=-1;
this->m_psPageSelected.m_nZoomInScale=100;
this->m_psPageSelected.m_iOldScale=100;
this->m_psPageSelected.m_iOldRows=1;
this->m_psPageSelected.m_iOldColumns=1;
m_hCursorZoomIn=NULL;
m_hCursorZoomOut=NULL;
this->m_iScale=100;
this->m_nUserColumns=1;
this->m_nUserRows=1;
m_nColumns=1;
m_nRows=1;
m_iScale=100;
m_sizePhysicalPage= CSize(0,0);
m_sizeShowPage= CSize(0,0);
m_rectClient= CRect(0,0,0,0);
m_rectSelected= CRect(0,0,0,0);
m_rectShowPages= CRect(0,0,0,0);
m_rectPage= CRect(0,0,0,0);
m_rectDisplayPage1= CRect(0,0,0,0);
// m_ptLeftTopPage1=CPoint(0,0);
m_opState=OP_ROWCOLUMN_ING;
}
CPreView::~CPreView()
{
m_dcPrint.Detach(); // print DC is deleted by CPrintInfo destructor
delete m_pPreviewInfo; // get rid of preview info
delete m_pPreviewState; // Get rid of preview state
delete m_pPreviewDC; // Get rid of preview DC object
if (m_hCursorZoomIn != NULL)
{
// make sure that m_hMagnifyCursor isn't the current cursor when we destroy it
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
DestroyCursor(m_hCursorZoomIn);
}
if (m_hCursorZoomOut != NULL)
{
// make sure that m_hMagnifyCursor isn't the current cursor when we destroy it
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
DestroyCursor(m_hCursorZoomOut);
}
}
BEGIN_MESSAGE_MAP(CPreView, CScrollView)
//{{AFX_MSG_MAP(CPreView)
ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_LBUTTONDOWN()
ON_WM_ERASEBKGND()
ON_COMMAND(IDC_BUTTON_ROWCOLUMN, OnGetRowColumn)
ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
ON_COMMAND(IDC_GETSCALE, OnGetScale)
ON_WM_SETCURSOR()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define PREVIEW_MARGIN 8
#define PREVIEW_PAGEGAP 8
/////////////////////////////////////////////////////////////////////////////
// CPreView drawing
/////////////////////////////////////////////////////////////////////////////
// CPreView diagnostics
#ifdef _DEBUG
void CPreView::AssertValid() const
{
CView::AssertValid();
ASSERT_VALID(&m_dcPrint);
if (m_pPreviewDC != NULL)
ASSERT_VALID(m_pPreviewDC);
}
void CPreView::Dump(CDumpContext& dc) const
{
dc<<"\nm_rectClient"<<this->m_rectClient;
dc<<"\nm_rectDisplayPage1"<<this->m_rectDisplayPage1;
dc<<"\nm_rectPage"<<this->m_rectPage;
dc<<"\nm_rectShowPages"<<this->m_rectShowPages;
dc<<"\nm_sizePhysicalPage"<<this->m_sizePhysicalPage;
dc<<"\nm_iSpaceBetweenl2"<<this->m_iSpaceBetweenl2;
dc<<"\nm_nColumns"<<this->m_nColumns;
dc<<"\nm_nRows"<<this->m_nRows;
dc<<"\nm_opState"<<this->m_opState;
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPreView message handlers
void CPreView::OnPreviewClose()
{
m_pToolBar->DestroyWindow();
m_pToolBar = NULL;
m_pPreviewInfo->m_nCurPage = m_nCurrentPage;
m_pOrigView->OnEndPrintPreview(m_pPreviewDC, m_pPreviewInfo,
CPoint(0, 0), this);
}
// 设置Print Preview 的初始状态
void CPreView::ClosePreview()
{
OnPreviewClose();
}
int CPreView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int retVal = CScrollView::OnCreate(lpCreateStruct);
if (retVal == -1)
return -1; // if -1 bag out
CCreateContext* pContext = (CCreateContext*)lpCreateStruct->lpCreateParams;
m_pOrigView = (CMyView *)pContext->m_pLastView;
ASSERT(m_pOrigView != NULL);
ASSERT_KINDOF(CView, m_pOrigView);
return retVal;
}
void CPreView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(this->m_rectDisplayPage1.top<this->m_rectClient.top||m_rectDisplayPage1.bottom>m_rectClient.bottom)
{
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
return;
}
switch (nSBCode)
{
case SB_BOTTOM:
SetCurrentPage(m_pPreviewInfo->GetMaxPage());
break;
case SB_TOP:
SetCurrentPage(m_pPreviewInfo->GetMinPage());
break;
case SB_PAGEDOWN:
SetCurrentPage(m_nCurrentPage + m_nColumns*this->m_nRows);
break;
case SB_PAGEUP:
SetCurrentPage(m_nCurrentPage - m_nColumns*this->m_nRows);
break;
case SB_LINEDOWN:
SetCurrentPage(m_nCurrentPage + m_nColumns);
break;
case SB_LINEUP:
SetCurrentPage(m_nCurrentPage - m_nColumns);
break;
case SB_THUMBPOSITION:
int pos=(nPos+m_rectClient.Height()/2)/m_rectClient.Height();
int page=pos*this->m_nColumns+m_pPreviewInfo->GetMinPage();
SetCurrentPage(page);
break;
}
}
void CPreView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
// Finds page pointed to and convert to 1:1 screen device units
void CPreView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
if (bActivate)
{
CWnd* pFocusWnd = GetFocus();
if (pFocusWnd == NULL ||
(m_pToolBar != NULL && !m_pToolBar->IsChild(pFocusWnd)))
{
// focus is not already on a toolbar button - set it to one
m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_PRINT)->SetFocus();
}
}
}
BOOL CPreView::OnEraseBkgnd(CDC* pDC)
{
ASSERT_VALID(pDC);
// Fill background with APPWORKSPACE
CBrush backBrush(GetSysColor(COLOR_APPWORKSPACE));
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect); // Erase the area needed
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
BOOL CPreView::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
int row,column;
if (this->m_opState!=OP_SELECTED_ING&&
FindPageRect(point, row,column)&&
m_psPageSelected.m_bSelected&&
m_psPageSelected.m_nPageNumber==this->m_nCurrentPage+this->GetPageNumber(row,column))
{
if (this->m_hCursorZoomIn == NULL)
{
m_hCursorZoomIn = ::LoadCursor(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_CURSOR_ZOOMIN));
}
::SetCursor(m_hCursorZoomIn);
}
else if(this->m_opState==OP_SELECTED_ING&&FindPageRect(point, row,column))
{
if (this->m_hCursorZoomOut == NULL)
{
m_hCursorZoomOut = ::LoadCursor(::AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_CURSOR_ZOOMOUT));
}
::SetCursor(m_hCursorZoomOut);
}
else
{
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
}
return 0;
}
void CPreView::OnLButtonDown(UINT nFlags, CPoint point)
{
int row,column;
if (!FindPageRect(point, row,column))
return; // Didn't click on a page
if(m_opState==OP_SELECTED_ING)
{
this->m_nColumns= m_psPageSelected.m_iOldColumns;
m_nRows= m_psPageSelected.m_iOldRows;
this->m_iScale= m_psPageSelected.m_iOldScale;
this->m_opState= m_psPageSelected.m_opOldState;
this->m_nCurrentPage=this->m_psPageSelected.m_nOldCurrentPage;
//进入放大状态;
this->m_psPageSelected.m_bSelected=true;
this->RefreshPreview();
return;
}
if(!m_psPageSelected.m_bSelected)//如果没有页被选中,进行选中操作
{
this->m_psPageSelected.m_bSelected=true;
this->m_psPageSelected.m_nPageNumber=this->m_nCurrentPage+this->GetPageNumber(row,column);
this->m_psPageSelected.m_nZoomInScale=100;
CRect DisplayPage=m_rectDisplayPage1;
CSize offset;
offset=CSize(this->m_rectPage.Width()*column,this->m_rectPage.Height()*row);
DisplayPage.OffsetRect(offset);
CDC*pDC=this->GetDC();
CPen *oldpen;
CPen pen;
pen.CreatePen(0,2,RGB(254,2,2));
oldpen=pDC->SelectObject(&pen);
DisplayPage=DisplayPage+CRect(1,1,1,1);
pDC->RectVisible(&DisplayPage);
pDC->Draw3dRect(&DisplayPage,RGB(254,254,254),RGB(254,254,254));
pDC->SelectObject(oldpen);
this->ReleaseDC(pDC);
}
else if(m_psPageSelected.m_bSelected)//如果有页被选中,进行放大,或变换选中操作
{
if(m_psPageSelected.m_nPageNumber!=(m_nCurrentPage+this->GetPageNumber(row,column)))
{
CSize offset;
CRect DisplayPage=m_rectDisplayPage1;
CDC*pDC=this->GetDC();
CPen *oldpen;
if(m_psPageSelected.m_nPageNumber<=this->m_pPreviewInfo->GetMaxPage()&&
m_psPageSelected.m_nPageNumber>=m_nCurrentPage)
{
int trow=(m_psPageSelected .m_nPageNumber-m_nCurrentPage)/m_nColumns;
int tcolumn=(m_psPageSelected.m_nPageNumber-m_nCurrentPage)%m_nColumns;
offset=CSize(this->m_rectPage.Width()*tcolumn,
this->m_rectPage.Height()*trow);
DisplayPage.OffsetRect(offset);
CPen pen;
pen.CreatePen(0,2,RGB(254,2,2));
oldpen=pDC->SelectObject(&pen);
DisplayPage=DisplayPage+CRect(1,1,1,1);
pDC->RectVisible(&DisplayPage);
pDC->Draw3dRect(&DisplayPage,RGB(0,0,0),RGB(0,0,0));
pDC->SelectObject(oldpen);
}
this->m_psPageSelected.m_nPageNumber=
this->m_nCurrentPage+this->GetPageNumber(row,column);
DisplayPage=m_rectDisplayPage1;
offset=CSize(this->m_rectPage.Width()*column,this->m_rectPage.Height()*row);
DisplayPage.OffsetRect(offset);
DisplayPage=DisplayPage+CRect(1,1,1,1);
pDC->RectVisible(&DisplayPage);
pDC->Draw3dRect(&DisplayPage,RGB(254,254,254),RGB(254,254,254));
this->ReleaseDC(pDC);
}
else
{
//记录当前状态,
this->m_psPageSelected.m_iOldColumns=this->m_nColumns;
this->m_psPageSelected.m_iOldRows=this->m_nRows;
this->m_psPageSelected.m_iOldScale=this->m_iScale;
this->m_psPageSelected.m_opOldState=this->m_opState;
//进入放大状态;
this->m_psPageSelected.m_nOldCurrentPage=m_nCurrentPage;
this->m_nCurrentPage=this->m_psPageSelected.m_nPageNumber;
this->BeginScale(m_psPageSelected.m_nZoomInScale);
this->m_opState=OP_SELECTED_ING;
this->SetScrollPos(SB_VERT,0);
this->SetScrollPos(SB_HORZ,0);
}
}
}
void CPreView::OnPreviewPrint()
{
CMyView* pOrigView = m_pOrigView;
// cause print (can be overridden by catching the command)
CMyFrame* pMainWnd = (CMyFrame*)this->m_pPrintView->GetParentFrame();//AfxGetThread()->m_pMainWnd;
ASSERT_VALID(pMainWnd);
// m_pPrintView->OnEndPrinting(this->m_pPreviewDC,this->m_pPreviewInfo) ;
// m_pPrintView->OnFilePrint();
OnPreviewClose(); // force close of Preview
pMainWnd->GetActiveView()->SendMessage(WM_COMMAND, ID_FILE_PRINT,0);
// m_pPrintView
}
void CPreView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
ASSERT_VALID(pDC);
CView::OnPrepareDC(pDC, pInfo);
}
void CPreView::OnGetScale()
{
int scale;
CString str;
CEdit * pEdit = (CEdit *)m_pToolBar->GetDlgItem(IDC_EDIT_SCALE);
pEdit->GetWindowText(str);
try{
scale = atoi(str);
}
catch(...)
{
return;
}
if(scale==this->m_iScale)
return;
if(scale>500||scale<10)
{
MessageBox("请输入10~500之间的数","注意");
return;
}
this->BeginScale(scale);
}
void CPreView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
ShowScrollBar(SB_VERT, TRUE); //Show the vertical bar
}
//确定预览客户区可显示多少页
void CPreView::SetScale(int scale)
{
// 设置比例,为在预览视图中模拟出打印纸做映射准备,我们输入的是实际比例,
// 该函数将会将其转化为物理比例用于在后面设定映射比例
this->m_pPreviewDC->SetScaleRatio(scale,100);
//计算出物理比例
scale=MulDiv(scale*100,afxData.cxPixelsPerInch,
::GetDeviceCaps(this->m_pPreviewDC->m_hAttribDC, LOGPIXELSX));
int x=this->m_sizePhysicalPage.cx*scale/10000;
int y=this->m_sizePhysicalPage.cy*scale/10000;
m_iSpaceBetweenl2=(x+y)/this->mc_iPageHW7Between;
int sb=m_iSpaceBetweenl2*2;
x+=sb;
y+=sb;
// //确定页空间大小;
this->m_rectPage.SetRect(this->m_rectShowPages.TopLeft(),
m_rectShowPages.TopLeft()+CPoint(x,y));
}
void CPreView::OnDraw(CDC *pDC)
{
ASSERT_VALID(pDC);
// don't do anything if not fully initialized
if (m_pPrintView == NULL || m_dcPrint.m_hDC == NULL)
return;
m_pPreviewInfo->m_bContinuePrinting = TRUE; // do this once each paint
this->SetSinglePageScroll(pDC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -