⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preview.cpp

📁 这是一个信息管理系统的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -