You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
3.9 KiB
C++

1 month ago
#include "StdAfx.h"
#include "PrintTool.h"
#include <DrawModel/Rect8.h>
#include <DrawModel/SXY.h>
#include "SigmaDoc.h"
#include "SigmaView.h"
static CItemView * GetItemView(CSigmaView * pView)
{
if (pView == 0)
return 0;
if (pView->m_pDoc == 0)
return 0;
return pView->m_pDoc->GetItemView();
}
CPrintTool::CPrintTool(CSigmaDoc * pDoc)
:m_pDoc(pDoc)
{
}
void CPrintTool::ViewAll(CDC* pDC)
{
CItemView * item = m_pDoc->GetItemView();
if (item == 0)
return;
CRect rt = item->GetClientRect();
//CRect rt = GetPrintArea(pDC);
//rt.OffsetRect(-rt.left, -rt.top);
CRect8 rect(1e100, -1e100, -1e100, 1e100);
if (m_pDoc->GetDraw()->GetCount() > 0)
m_pDoc->GetDrawRange(rect);
//else
// *((CRect8*)&rect) = rt;
m_pDoc->GetDC().Extend(rect, rt, EXTEND_MODE_CENTER); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
//pDoc->GetDC().Extend(rect, rt, EXTEND_MODE_STRECH); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
}
CRect CPrintTool::GetPrintArea(CDC* pDC)
{
CRect rt(0, 0, pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES));
return rt;
}
bool CPrintTool::GetPartitionNum(int & rowOut, int & colOut, int superpositionWidth)
{
rowOut = colOut = 0;
if (m_pDoc->GetDraw()->GetCount() == 0)
{
rowOut = colOut = 1;
return false;
}
CItemView* item = GetItemView((CSigmaView *)m_pDoc->GetView());
if (item == 0)
{
rowOut = colOut = 1;
return false;
}
CRect clientRect = item->GetClientRect(); //<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С.<2E>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>
//<2F><><EFBFBD><EFBFBD>һҳ<D2BB>ɴ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD>Ĵ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ף<EFBFBD>
double sx = clientRect.Width() * m_pDoc->GetDC().UnitX;
double sy = clientRect.Height() * m_pDoc->GetDC().UnitY;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>ĺ<EFBFBD><C4BA>׳<EFBFBD><D7B3><EFBFBD>
CRect8 rect(1e100, -1e100, -1e100, 1e100);
m_pDoc->GetDrawRange(rect);
//<test>
CPoint2D pt;
pt.x0 = 0;
pt.y0 = 0;
CPoint2D ptSW = m_pDoc->m_xyDC.GetReal(pt);
double dx = ptSW.x0 - rect.left;
double dy = ptSW.y0 - rect.bottom;
//</test>
double mx = m_pDoc->GetDC().GetScreenWidth8(rect.Width()) * m_pDoc->GetDC().UnitX;
double my = m_pDoc->GetDC().GetScreenHeight8(rect.Height()) * m_pDoc->GetDC().UnitY;
my = fabs(my);
if (mx <= ZERO)
rowOut = 1;
else
{
while (mx > ZERO)
{
rowOut++;
mx -= sx;
if (mx <= ZERO)
break;
mx += superpositionWidth;
}
}
if (my <= ZERO)
colOut = 1;
else while (my > ZERO)
{
colOut++;
my -= sy;
if (my <= ZERO)
break;
my += superpositionWidth;
}
return true;
}
bool CPrintTool::Part(PrintPartition * partition)
{
CSigmaView * pView = (CSigmaView *)m_pDoc->GetView();
CItemView* item = GetItemView(pView);
if (item == 0)
return false;
CDC * pDC = pView->GetDc();
if (pDC == 0)
return false;
CRect clientRect = item->GetClientRect(); //<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С.<2E>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB>
if (partition->currentPage == 1)
{
pDC->SetViewportOrg(clientRect.left, clientRect.top);
}
else if (partition->currentPage > 1)
{
int pagew = clientRect.Width();
int pageh = clientRect.Height();
int x, y;
switch (partition->kind)
{
case 1://ȫ<><C8AB>
{
//<2F>ɵ<EFBFBD>ǰҳ<C7B0><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кź<D0BA><C5BA>к<EFBFBD>
//<2F>кš<D0BA><C5A1>кš<D0BA>ҳ<EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>r= partition->currentPage / partition->row
int row = partition->currentPage / partition->row;
row += (partition->currentPage % partition->row > 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>.<2E><><EFBFBD><EFBFBD>һ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кŵĴ<C5B5><C4B4><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD>ˡ<EFBFBD>
//1.<2E><>currentPage<67><65><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>2.<2E><>currentPage<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>д<EFBFBD>ĺܺá<DCBA>
int col = (partition->currentPage - 1) % partition->row + 1;
//TRACE("OnPrepareDC( row=%d, col=%d)\n", row,col);
x = -(pagew - partition->supperPosition)*(col - 1);
y = -(pageh - partition->supperPosition)*(row - 1);
}
break;
case 2://<2F><><EFBFBD><EFBFBD>
x = -(pagew - partition->supperPosition)*(partition->currentPage - 1);
y = 0;
break;
case 3://<2F><><EFBFBD><EFBFBD>
x = 0;
y = -(pageh - partition->supperPosition)*(partition->currentPage - 1);
break;
}
x += clientRect.left;
y += clientRect.top;
//pDC->SetViewportOrg(x/2, y);
//pView->SetOriginPointForPrint(1000, y);
}
return 0;
}