所见即所得打印程序问题

twlls 2007-03-19 01:56:15
请高手指点一下 VC++所见即所得打印程序的设计原理和思路,多谢!
...全文
274 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gezihou 2007-04-05
  • 打赏
  • 举报
回复
vc打印比较麻烦,但是设计好底层后还是比较方便的,实际上就是直接驱动打印机
一直在攀登 2007-04-05
  • 打赏
  • 举报
回复
mark
twlls 2007-03-19
  • 打赏
  • 举报
回复
这末复杂啊 谢谢mars 我看看先
Murray Mu 2007-03-19
  • 打赏
  • 举报
回复
#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;




}

twlls 2007-03-19
  • 打赏
  • 举报
回复
好的,谢谢建议
twlls 2007-03-19
  • 打赏
  • 举报
回复
Mackz 你好!
twlls 2007-03-19
  • 打赏
  • 举报
回复
现在做的程序需要打印固定大小的卡片式的表格,我借用下面一段代码
void CPrintSameView::OnPrepareDC

  (CDC* pDC, CPrintInfo* pInfo)

  { CView::OnPrepareDC(pDC, pInfo);

  pDC->SetMapMode(MM_ANISOTROPIC);

  CSize size = CSize(800, 560);

  pDC->SetWindowExt(size);

  int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);

  int yLogPixPerInch = pDC- >GetDeviceCaps(LOGPIXELSY);

  long xExt = (long)size.cx * xLogPixPerInch/96 ;

  long yExt = (long)size.cy * yLogPixPerInch/96 ;

  pDC->SetViewportExt((int)xExt, (int)yExt);

   }



作了修改,感觉没达到要求,如果有哪位高手研究过这方面,请帮忙详细讲解一下这方面的问题。
菜牛 2007-03-19
  • 打赏
  • 举报
回复
这个,怎么说呢,就是GDI编程,建议看看Feng yuan的书。
twlls 2007-03-19
  • 打赏
  • 举报
回复
我对所见即所得 理解得不太清楚,好像VC的底层代码有打印代码,要解决的是实现所见即所得对巴?
rabo 2007-03-19
  • 打赏
  • 举报
回复
预览?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧