读书人

所见即所得打印程序有关问题

发布时间: 2012-02-20 21:18:24 作者: rapoo

所见即所得打印程序问题
请高手指点一下 VC++所见即所得打印程序的设计原理和思路,多谢!


[解决办法]
这个,怎么说呢,就是GDI编程,建议看看Feng yuan的书。
[解决办法]
#include "StdAfx.h "
#include "PrintDrawer.h "

using namespace nsPrintCode;
#define LIST_SPEAKER_COLUMN 0
#define LIST_EDITRES_COLUMN 4
CPrintDrawer::CPrintDrawer(void)
{
m_pDC = NULL; // 设备上下文指针
m_pInfo = NULL;
m_hListCtrl = NULL;

}

CPrintDrawer::CPrintDrawer(CDC* pDC,CPrintInfo* pInfo,HWND hWnd,CPrintSettting* pSettting)
{
m_pDC = pDC;
m_pInfo = pInfo;
m_hListCtrl = hWnd;

m_nStartTextLine = 0;

m_nPrintStyle = pSettting-> m_nPrintStyle;
m_nHeaderStyle = pSettting-> m_nHeaderStyle;
m_strTitle = pSettting-> m_strTitle;
m_arrSubTitles.Copy(pSettting-> m_arrSubTitles);
m_arrSubTitleValues.Copy(pSettting-> m_arrSubTitleValues);
CreateFont();
Prepare2Draw();
}
CPrintDrawer::~CPrintDrawer(void)
{
if(m_cfTitleFont.m_hObject != NULL)
m_cfTitleFont.DeleteObject();
if(m_cfTextFont.m_hObject != NULL)
m_cfTextFont.DeleteObject();
if(m_cfSpeakerFont.m_hObject != NULL)
m_cfSpeakerFont.DeleteObject();
if(m_cfSubTitleFont.m_hObject != NULL)
m_cfSubTitleFont.DeleteObject();
}
//创建字体
void CPrintDrawer::CreateFont()
{
//标题字体
m_cfTitleFont.CreateFont(-MulDiv(14,m_pDC-> GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T( "黑体 "));
//正文字体
m_cfTextFont.CreateFont(-MulDiv(10,m_pDC-> GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_NORMAL,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T( "宋体 "));

//说话人字体
m_cfSpeakerFont.CreateFont(-MulDiv(10,m_pDC-> GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_NORMAL,TRUE,TRUE,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T( "宋体 "));
//字标题字体
m_cfSubTitleFont.CreateFont(-MulDiv(11,m_pDC-> GetDeviceCaps(LOGPIXELSY),72),
0,0,0,FW_BOLD,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T( "宋体 "));
}
//准备绘制,设置页面参数
void CPrintDrawer::Prepare2Draw()
{
//计算相关的尺寸
int nXPixperInch = m_pDC-> GetDeviceCaps(LOGPIXELSX);//x方向每英寸像素点数
int nYPixperInch = m_pDC-> GetDeviceCaps(LOGPIXELSY);//y方向每英寸像素点数
m_dXPixperMiMetre = (DOUBLE)nXPixperInch*10/254; //每 mm 宽度的像素
m_dYPixperMiMetre = (DOUBLE)nYPixperInch*10/254; //每 mm 高度的像素

m_nPaperHeight = m_pDC-> GetDeviceCaps(VERTRES); //可打印区域高度(像素)
m_nPaperWidth = m_pDC-> GetDeviceCaps(HORZRES); //可打印区域宽度(像素)


m_dXLeftMargin = 15*m_dXPixperMiMetre; //最左线位置(像素) 合15mm
m_dXRightMargin = m_nPaperWidth - 15*m_dXPixperMiMetre; //最右线 15mm
m_dyTopMargin = m_dYPixperMiMetre*10; //最上线 10mm
m_dYBottomMargin = m_nPaperHeight - m_dYPixperMiMetre*25; //最下线 25mm
m_dTextOffset = 1.5*m_dXPixperMiMetre; //文字与表格偏移(像素)


//////////////////////////////////////////////////////////////////////////
CFont* pOldFont = m_pDC-> SelectObject(&m_cfTextFont);
TEXTMETRICA ptm;
GetTextMetrics(m_pDC-> m_hDC,&ptm);


int nCharHeight = ptm.tmHeight; //字符高度
int dMaxCharWidth = ptm.tmMaxCharWidth; //字符宽度

m_pDC-> SelectObject(&m_cfTitleFont);
GetTextMetrics(m_pDC-> m_hDC,&ptm);
m_nTitleHeight = ptm.tmHeight + (int)m_dYPixperMiMetre;

m_pDC-> SelectObject(&m_cfSubTitleFont);
GetTextMetrics(m_pDC-> m_hDC,&ptm);
m_nSubTitleHeight = ptm.tmHeight + (int)m_dYPixperMiMetre;
m_pDC-> SelectObject(pOldFont);


m_dRowHeight = nCharHeight + m_dYPixperMiMetre; //行高(像素)
m_dYHeaderBottom = m_dyTopMargin + m_nTitleHeight + CalculateSubTitleLines() * m_nSubTitleHeight;

//每行最大字符数
m_nMaxRowLength = (int)((m_dXRightMargin - m_dXLeftMargin - m_dTextOffset)/dMaxCharWidth)*2;
// 第一页行数
m_nFirstPageMaxRows = (int)((m_dYBottomMargin - m_dYHeaderBottom - m_dTextOffset * 3)/m_dRowHeight);
// 其他页行数
m_nCommonPageMaxRows = (int)((m_dYBottomMargin - m_dyTopMargin - m_dTextOffset * 3)/m_dRowHeight);

FetchAllLines(); //所有行数
}
//计算每个子标题的值被分割为多少行
int CPrintDrawer::DivideSubValue(CRect* pSTRect,int nSubTitle,CStringArray & newValues)
{
CString strOldValue = m_arrSubTitleValues.GetAt(nSubTitle);
TEXTMETRICA ptm;
int nLines = 1;
int dCharWidth = 0;
int nFirstRowWidth =(int) (m_dXRightMargin - pSTRect-> right - m_dTextOffset);
int nOtherRowWidth = (int) (m_dXRightMargin - m_dXLeftMargin - m_dTextOffset);
int nFirstRowLength,nOtherRowLength;
GetTextMetrics(m_pDC-> m_hDC,&ptm);
dCharWidth = ptm.tmMaxCharWidth;
nFirstRowLength =2*(nFirstRowWidth/dCharWidth);
nOtherRowLength = 2* (nOtherRowWidth/dCharWidth);

int nLength = strOldValue.GetLength();
CString strNewValue ;
if( nLength <= nFirstRowLength)
{
newValues.Add(strOldValue);
return nLines;
}
else
{
strNewValue = strOldValue.Left(nFirstRowLength);
newValues.Add(strNewValue);

nLength -= nFirstRowLength;
strOldValue = strOldValue.Right(nLength);

while(nLength > 0)
{
nLines ++;
if(nLength <= nOtherRowLength)
{
newValues.Add(strOldValue);
break;
}
else
{
strNewValue = strOldValue.Left(nOtherRowLength);
newValues.Add(strNewValue);
nLength -= nOtherRowLength;
strOldValue = strOldValue.Right(nLength);
}

}

}
return nLines;




}


[解决办法]
vc打印比较麻烦,但是设计好底层后还是比较方便的,实际上就是直接驱动打印机

读书人网 >VC/MFC

热点推荐