QQ登录

只需一步,快速开始

309上位机VC MFC实现基于单文档的打印功能

[ 复制链接 ]

309上位机VC MFC实现基于单文档的打印功能

309上位机VC MFC实现基于单文档的打印功能

基于单文档的打印功能
功能展示
VC++中基于文档视图的应用程序封装了打印功能,所以新建基于单文档或多文档的程序就能够很方便的实现打印功能,我们当前例程就实现基于单文档的打印程序,效果如图,程序运行会显示一列表数据用于测试打印,点击<打印上面数据>会弹出视窗窗口,点击视窗上的菜单选项<打印><打印预览><打印设置>可以分别实现对应功能;

要点提示
视窗类Cview提供了一个打印用函数OnPrint(),此函数在打印或预览每一页时由框架调用,语法如下virtual void OnPrint( CDC* pDC, CPrintInfo* pInfo ); pDC是打印设备的上下文指针, pInfo 是一个类指针记录了当前打印的信息;我们在自己的程序中可以在此函数中利用pDC输出打印数据,但要注意,打印机的分辨率通常比屏幕分辨率高出许多,所以在打印信息时,得设置一定的输出 比率,可以利用CDC的GetDeviceCaps函数间接获得打印机与屏幕的分辨率比率;
函数原型为int GetDeviceCaps( int nIndex ) const; nIndex 的取值不同,获得的信息也不同,具体可查阅MSDN,我们当前例程是使用LOGPIXELSX,及LOGPIXELSY,分别是当前CDC对象水平与垂直每英寸像素个数;当窗口的CDC对象调用此GetDeviceCaps(LOGPIXELSX)时获得的是屏幕水平方向每英寸的像素个数

实现功能
1.新建基于单文档的应用程序
2.新建一对话框资源,添加一列表框IDC_LIST1用于显示要测试打印的数据,添加一按钮<打印上面数据>用于打开列表框内数据,再给此对话框资源关联对话框类CPrintDataDlg,列表框关联变量CListCtrl m_List; 按钮关联点击函数
void CPrintDataDlg::OnButton1()
{
AfxGetApp()->m_pMainWnd=NULL;
AfxGetApp()->m_pDocManager->OnFileNew();
}
最后添加对话框的初始化函数OnInitDialog,在函数内给列表框添加要打印的数据
m_List.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
m_List.InsertColumn(100,"姓",LVCFMT_LEFT,100);
m_List.InsertColumn(100,"语",LVCFMT_LEFT,70);
m_List.InsertColumn(100,"数",LVCFMT_LEFT,70);
m_List.InsertColumn(100,"英",LVCFMT_LEFT,70);
m_List.InsertColumn(100,"政",LVCFMT_LEFT,70);
m_List.InsertColumn(100,"史",LVCFMT_LEFT,70);

CString temp;
int grade;
for (int i = 0;i<10;i++)//add data to list
{
m_List.InsertItem(i,"");
for (int c = 1;c<6;c++)
{
grade = c*2+80+i;
temp.Format("%d",grade);
m_List.SetItemText(i,c,temp);
}
}
m_List.SetItemText(0,0,"张三");
m_List.SetItemText(1,0,"李四");
m_List.SetItemText(2,0,"王五");
m_List.SetItemText(3,0,"周公");
m_List.SetItemText(4,0,"刘涛");
m_List.SetItemText(5,0,"刘海");
m_List.SetItemText(6,0,"中华");
m_List.SetItemText(7,0,"宋平");
m_List.SetItemText(8,0,"男男");
m_List.SetItemText(9,0,"菊花");
3.准备好对话框后,在App类中使用此对话框类:添加头文件#include “PrintDataDlg.h“ 及实例 CPrintDataDlg m_PrintDataDlg;,在函数InitInstance()中添加代码this->m_pMainWnd = &m_PrintDataDlg; m_PrintDataDlg.DoModal();并屏蔽不需要的代码;
4.在Cview中添加变量
CFont m_TitleFont; //标题字体
CFont m_BodyFont; //正文字体
int m_nScreenX,m_nScreenY; //获取窗口每英寸像素数
int m_nPrintX,m_nPrintY; //获取打印机每英寸像素数
double m_nXRate,m_YRate; //打印机与屏幕的像素比率
int m_nPageHeight,m_nPageWidth; //打印纸高度,打印纸宽度
int m_nLeftMargin,m_nRightMargin; //打印纸左右边距
BOOL m_bIsPreview; //是否处于预览状态
构造函数中初始化m_bIsPreview = FALSE;
5.在OnBeginPrinting()函数中给变量赋值
void CGkbc8View::OnBeginPrinting(CDC* pDC/**/, CPrintInfo* /*pInfo*/)
{
CDC *pWinDC = this->GetDC();
m_nScreenX =pWinDC->GetDeviceCaps(LOGPIXELSX);
m_nScreenY =pWinDC->GetDeviceCaps(LOGPIXELSY);
m_nPrintX =pDC->GetDeviceCaps(LOGPIXELSX);
m_nPrintY =pDC->GetDeviceCaps(LOGPIXELSY);
m_nXRate = (double)m_nPrintX /m_nScreenX; //确定打印机与屏幕的比率
m_YRate = (double)m_nPrintY /m_nScreenY;
m_nPageHeight =pDC->GetDeviceCaps(VERTRES);
m_nPageWidth =pDC->GetDeviceCaps(HORZRES);//获取打印机的左右边距
m_nLeftMargin = pDC->GetDeviceCaps(PHYSICALOFFSETX);//获取左边距
int phywidth= pDC->GetDeviceCaps(PHYSICALWIDTH);
m_nRightMargin = phywidth-m_nPageWidth-m_nLeftMargin;
}
在OnPrint()函数中实现打印功能
void CGkbc8View::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
m_bIsPreview = TRUE;
m_TitleFont.CreatePointFont((int)m_nXRate*90,"宋体",pDC);
m_BodyFont.CreatePointFont((int)m_nXRate*40,"宋体",pDC);
pDC->SelectObject(&m_TitleFont);
CRect m_rect(-m_nLeftMargin,0,m_nPageWidth+m_nRightMargin,m_nPageHeight);
m_rect.DeflateRect(0,(int)30*m_YRate,0,0);
pDC->DrawText("学生成绩单",m_rect,DT_CENTER|DT_SINGLELINE);//绘制标题
CPrintDataDlg *PrintDataDlg = &((CGkbc8App*)(AfxGetApp()))->m_PrintDataDlg;//绘制报表数据
m_rect.DeflateRect(0,(int)10*m_YRate,0,0);
pDC->SelectObject(&m_BodyFont);
char* pchar = new char[100];
LVCOLUMN column;
column.mask = LVCF_TEXT;
column.pszText = pchar;
column.cchTextMax = 100;
CString str;
CRect m_temprect ((int)(m_nXRate*60),m_rect.top+(int)(m_nXRate*60),(int)(m_nXRate*60)+(m_rect.Width()-(int)(m_nXRate*60)*2)/6,m_rect.bottom);
CRect m_itemrect;
int width = m_temprect.Width();
for (int i = 0;i< 6;i++)
{
if (PrintDataDlg->m_List.GetColumn(i,&column))
str = column.pszText;
pDC->DrawText(str,m_temprect,DT_LEFT);
m_itemrect.CopyRect(m_temprect);
for (int row = 0;row <10;row++)
{
m_itemrect.DeflateRect(0,(int)(m_nXRate*30));
str = PrintDataDlg->m_List.GetItemText(row,i);
pDC->DrawText(str,m_itemrect,DT_LEFT);
}
m_temprect.DeflateRect(width+1,0,0,0);
m_temprect.InflateRect(0,0,width+1,0);
}
m_TitleFont.DeleteObject();
m_BodyFont.DeleteObject();
delete []pchar;
// CView::OnPrint(pDC, pInfo);
}
在OnEndPrintPreview()函数中处理打印后的任务;
可以选择性的在OnDraw()函数内绘制要打印的数据,具体代码查看例程
最后在框架类的关联函数OnClose()中记得给APP的m_pMainWnd变量重新赋值
void CMainFrame::OnClose()
{
CGkbc8View* tempview =(CGkbc8View*) this->GetActiveView();
if (!tempview->m_bIsPreview)
{
AfxGetApp()->m_pMainWnd= &((CGkbc8App*)AfxGetApp())->m_PrintDataDlg;
}

CFrameWnd::OnClose();
}
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:309.上位机VC MFC实现基于单文档的打印功能.zip 
文件大小:152.92 KB  售价:11金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索