#include "stdafx.h"
#include "printer.h"
#include <math.h>CPrinter::CPrinter(CDC * usedc)
{
m_dc = usedc;
m_page_v_margin = 0;
m_page_h_margin = 0;
m_page_height = 0;
m_current_y_pos = 0;
m_line_height = 0; 
m_is_printing_page = FALSE;
m_mission_started = FALSE;
m_page_number = 0;
m_max_page = 0;
m_total_line_number = 0;
m_v_dist = 2;
m_max_line_count_one_page = 0;
m_doc_name = AfxGetAppName();
m_need_start_new_page = TRUE;
}CPrinter::~CPrinter()
{
if(m_mission_started)
EndPrinting();
}BOOL CPrinter::StartPrinting()
{
DOCINFO info;
::ZeroMemory(&info, sizeof(info));
info.lpszDocName = m_doc_name;
m_dc->StartDoc(&info);
m_mission_started = TRUE;
return TRUE;
}void CPrinter::EndPrinting()
{
m_dc->EndPage();
m_dc->EndDoc();
m_page_number = 0;
m_mission_started = FALSE;
}void CPrinter::PrintLine(const CString & s)
{
//if(!m_is_printing_page || m_current_y_pos > m_page_height - m_page_v_margin)
//{
// if(m_is_printing_page) m_dc->EndPage(); // m_dc->StartPage();
// m_page_number++;
// m_current_y_pos = m_page_v_margin;
// m_is_printing_page = TRUE;
// PrintHeadLine();
//}
//m_dc->TextOut(m_page_h_margin, m_current_y_pos, s);
//m_current_y_pos += m_line_height;
}void CPrinter::SetPrinterFont()
{
CFont f;
f.CreateStockObject(ANSI_FIXED_FONT);
m_dc->SelectObject(&f);
}void CPrinter::PreparePrinting()
{
ASSERT( m_total_line_number != 0 );//检查是否调用了SetTotalLineNumber
if ( m_total_line_number == 0 )
{
return;
}
//设置字体
SetPrinterFont();
TEXTMETRIC tm;
m_dc->GetTextMetrics(&tm);
m_line_height  = tm.tmHeight + tm.tmInternalLeading;
m_page_v_margin = m_dc->GetDeviceCaps(LOGPIXELSY)/1.5 ;
m_page_h_margin = m_dc->GetDeviceCaps(LOGPIXELSX)/1.5 ;//第一行的文件
m_page_height  = m_dc->GetDeviceCaps(VERTRES);
m_page_width   = m_dc->GetDeviceCaps(HORZRES);
m_current_y_pos = m_page_v_margin;
//求出页数
m_max_line_count_one_page = (int)((m_page_height-m_page_v_margin*2-50)/(m_line_height));//
m_max_page = (int)(m_total_line_number / m_max_line_count_one_page);
if( m_max_page*m_max_line_count_one_page < m_total_line_number ) m_max_page++;
}
void CPrinter::PrintHeadLine()
{
int headingY = m_page_v_margin - (3 * m_line_height) / 2;
int lineY = m_page_v_margin - m_line_height / 2;
int saved = m_dc->SaveDC();
m_dc->SetTextColor(RGB(0,0,0));
CPen pen(PS_SOLID, m_dc->GetDeviceCaps(LOGPIXELSX) / 100, RGB(255, 0, 0));
m_dc->SelectObject(pen);
m_dc->TextOut(m_page_h_margin, headingY, m_doc_name);
CString s;
s.Format(_T("%d"), m_page_number);
int w = m_dc->GetTextExtent(s).cx;
m_dc->TextOut(m_page_width - m_page_h_margin - w, headingY, s);
m_dc->MoveTo(m_page_h_margin, lineY);
m_dc->LineTo(m_page_width - m_page_h_margin, lineY);
m_dc->RestoreDC(saved);
}void CPrinter::PrintHeader()
{
CFont *old_font = NULL;
CFont fontHeader;
fontHeader.CreatePointFont(100,_T("FixedSys"),m_dc);
old_font=(CFont *)(m_dc->SelectObject(&fontHeader));
int nPosY,nPosX;
nPosY = m_page_v_margin-(3*m_line_height)/2;
nPosX = m_page_h_margin;
CFont *old1_font = NULL;//
CFont data_font;
data_font.CreatePointFont(200,_T("宋体"),m_dc);
old1_font = m_dc->SelectObject(&data_font);//
m_dc->TextOut(nPosX,nPosY,CString("重庆江岸医药有限公司出库单"));
CString str;
str.Format(_T("第 %d 页 / 共 %d 页"),m_page_number,m_max_page);
CSize size=m_dc->GetTextExtent(str);
nPosX=m_page_width-m_page_h_margin-size.cx;
m_dc->TextOut(nPosX,nPosY,str);
m_dc->MoveTo(m_page_h_margin,m_page_v_margin-static_cast<int>(0.25*m_line_height));
m_dc->LineTo(m_page_width-m_page_h_margin,m_page_v_margin-static_cast<int>(0.25*m_line_height));
m_dc->SelectObject(old_font); fontHeader.DeleteObject();}void CPrinter::PrintFooter()
{}void CPrinter::PrintBody()
{
CFont *old_font = NULL;
CFont data_font;
data_font.CreatePointFont(180,_T("宋体"),m_dc);
if ( 1 )
{
TCHAR *pszTitle[8] = {_T("编号"),_T("数值1"),_T("数值2"),_T("数值3"),_T("数值4"),_T("数值5"),_T("数值6"),_T("数值7")};
old_font = m_dc->SelectObject(&data_font); //画矩形
m_dc->Rectangle(m_page_h_margin, m_page_v_margin, m_page_width-m_page_h_margin, m_page_height-m_page_v_margin);//bottom for(int i=0;i<8;i++)
{
m_dc->TextOut(
m_page_h_margin+50+i*(m_page_width-m_page_h_margin*2)/7,
4*m_line_height,
CString(pszTitle[i]));
}
//打印m_page_number这一页的内容,m_page_number从1开始
for(int i=0;i<m_max_line_count_one_page;i++)
{
int line_num = i+((m_page_number-1)*m_max_line_count_one_page);
CString str[7];
{
str[0].Format(_T("%-.3f"),(double)(line_num+1));
str[1].Format(_T("%-.3f"),1+sin(i*1.0));
str[2].Format(_T("%-.3f"),1+cos(i*1.0));
str[3].Format(_T("%-.3f"),1+sin(0.5*i)); str[4].Format(_T("%-.3f"),1+cos(0.5*i));
str[5].Format(_T("%-.3f"),1+sin(0.1*i));
str[6].Format(_T("%-.3f"),1+cos(0.1*i)); for(int j=0;j<7;j++)
{
m_dc->TextOut(
m_page_h_margin+50+j*(m_page_width-m_page_h_margin*2)/7,
m_page_v_margin+50+(i+1)*(m_line_height+50),
str[j] );
}
}
}
m_dc->SelectObject (old_font);
}
}