所见即所得打印程序问题 请高手指点一下 VC++所见即所得打印程序的设计原理和思路,多谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个,怎么说呢,就是GDI编程,建议看看Feng yuan的书。 现在做的程序需要打印固定大小的卡片式的表格,我借用下面一段代码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); } 作了修改,感觉没达到要求,如果有哪位高手研究过这方面,请帮忙详细讲解一下这方面的问题。 #include "StdAfx.h"#include "PrintDrawer.h"using namespace nsPrintCode;#define LIST_SPEAKER_COLUMN 0#define LIST_EDITRES_COLUMN 4CPrintDrawer::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; } 这末复杂啊 谢谢mars 我看看先 sizeof的问题 p2p的TCP打洞技术如何知道对方的外网端口 急!对话框中有几组radio button,如何获取选中的radio button的值? ★★ - 有没有 VC7、Office 那样的 Dock 窗口控件 - ★★ 请问怎样设置编辑框的字体? 微调按钮的nPos最大只能到32767,我要更大的如何实现? 请高手提示:如何能够得到CPU的频率和内存,硬盘的容量??(能说的具体一点么。)在线给分 如何给局域网上的用户或进程发送消息? 简单问题:CommandLineToArgvW 如何处理内部组件的事件? 其它进程加载的模块信息 多文档一个问题
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); } 作了修改,感觉没达到要求,如果有哪位高手研究过这方面,请帮忙详细讲解一下这方面的问题。
#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;
}