`

MFC下 报表打印程序的实现

 
阅读更多

VC 6.0下实现的 报表打印类 对数据制定打印位置 位置调整 打印预览 以及批量打印

适用于 罚单、发票等批量打印要求

以下为程序代码:

// ReportPrint.h: interface for the ReportPrint class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_REPORTPRINT_H__7A35BA1E_B178_4C1B_8970_5226028695DB__INCLUDED_)
#define AFX_REPORTPRINT_H__7A35BA1E_B178_4C1B_8970_5226028695DB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#define POINT_COUNT 2
//打印信息结构体
typedef struct tag_PRINTINFO
{
CString text[POINT_COUNT];
}PRINTINFO;

class ReportPrint
{
public:
BOOL m_bEditMode;
void SetTextFont(char* height,char* facename);
void PrintPreview();
void Print(BOOL bDirect);
void SetPrintInfo(PRINTINFO printInfo[],int size);
void SetPaperSize(int x,int y);
void SetPaperSize(CSize paperSize);
ReportPrint();
virtual ~ReportPrint();
private:
PRINTINFO* m_pPrintInfo;

CSize m_paperSize;//打印纸张型号默认 A4 297*210
int m_nCurPage;//当前页
int m_nMaxPage;//最大页
CString m_csHeight;
CString m_csFaceName;
CPoint m_printPoint[POINT_COUNT];//打印坐标数组
};

#endif // !defined(AFX_REPORTPRINT_H__7A35BA1E_B178_4C1B_8970_5226028695DB__INCLUDED_)
/////////////////////////////////////////////////////////////////////////////
// CDlgReportPrintPreview dialog

class CDlgReportPrintPreview : public CDialog
{
// Construction
public:
BOOL m_bEditMode;
CDlgReportPrintPreview(CWnd* pParent = NULL); // standard constructor
CDlgReportPrintPreview::CDlgReportPrintPreview(CString& csHeight,CString& csFaceName, CSize paperSize, PRINTINFO printInfo[], int nMaxPage, CPoint* pPrintPoint, int nPrintCount,ReportPrint* parent = NULL);
// Dialog Data
//{{AFX_DATA(CDlgReportPrintPreview)
enum { IDD = IDD_DLG_PRINT_PREVIEW };
CComboBoxm_ctrlNodes;
intm_nCurPage;
intm_nPosX;
intm_nPosY;
//}}AFX_DATA


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDlgReportPrintPreview)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CDlgReportPrintPreview)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnBnPre();
afx_msg void OnBnNext();
virtual void OnOK();
afx_msg void OnBnSetPos();
afx_msg void OnSelchangeComboNode();
afx_msg void OnChangeEditY();
afx_msg void OnChangeEditX();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void DrawPrintPreview(CDC* pDC,CRect* previewRect);

CRect m_previewRect;//打印预览矩形默认 297*210
CSize m_paperSize;
PRINTINFO* m_pPrintInfo;
int m_nMaxPage;//最大页
double m_nRato;//预览缩放比率
CPoint* m_pPrintPoint;//打印坐标数组
int m_nPrintCount;
ReportPrint* m_pParent;
CString m_csHeight;
CString m_csFaceName;
};

// ReportPrint.cpp: implementation of the ReportPrint class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyPrint.h"
#include "ReportPrint.h"
#include <winspool.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ReportPrint::ReportPrint()
{
m_printPoint[0].x = 20;
m_printPoint[0].y = 20;
m_printPoint[1].x = 20;
m_printPoint[1].y = 200;
}

ReportPrint::~ReportPrint()
{

}
//设置打印字体 默认 宋体15号
void ReportPrint::SetTextFont(char* height,char* faceName)
{

m_csHeight = height;
m_csFaceName = faceName;
}

//设置打印纸张的大小
void ReportPrint::SetPaperSize(CSize paperSize)
{
m_paperSize = paperSize;
}
//设置打印纸张的大小 重载
void ReportPrint::SetPaperSize(int x, int y)
{
m_paperSize.cx = x;
m_paperSize.cy = y;
}
//设置打印数据 同时设置批量打印的数量
void ReportPrint::SetPrintInfo(PRINTINFO printInfo[], int size)
{
m_pPrintInfo = printInfo;
m_nMaxPage = size;
}
//打印
void ReportPrint::Print(BOOL bDirect)
{
DWORD dwflags=PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_SELECTION | PD_HIDEPRINTTOFILE;
CPrintDialog dlg(0);//(bDirect,dwflags,NULL);
//dlg.GetDefaults();

//if (dev = dlg.GetDevMode());
if(dlg.DoModal()==IDOK)
{

CDC dc;

//定义打印模式信息
LPDEVMODE dev = dlg.GetDevMode();


dev->dmPaperSize = DMPAPER_USER;
dev->dmPaperLength = m_paperSize.cy * 10;
dev->dmPaperWidth = m_paperSize.cx * 10;
dev->dmFields = DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH | dev->dmFields;
dev->dmFields = dev->dmFields | DMBIN_MANUAL;
dev->dmDefaultSource = DMBIN_MANUAL;

strcpy((char*)dev->dmFormName,"自定义");
dc.Attach(dlg.CreatePrinterDC());//打印机DC构造完成
/*
DOCINFO di;
memset( &di, 0, sizeof(DOCINFO) );
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Printing Test ";
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;
*/
dc.StartDoc("print");

CFont font;
font.CreatePointFont(atoi(m_csHeight)*10,m_csFaceName,&dc);

dc.SelectObject(&font);//设置用户配置字体

for (int i=0;i<m_nMaxPage;i++)
{
dc.StartPage();
for (int j=0;j<POINT_COUNT;j++)
{
dc.TextOut(m_printPoint[j].x*10,m_printPoint[j].y*10,m_pPrintInfo[i].text[j]);
}
dc.EndPage();
}

dc.EndDoc();
font.DeleteObject();
dc.DeleteDC();
}


}
//打印预览
void ReportPrint::PrintPreview()
{
CDlgReportPrintPreview dlg(m_csHeight,m_csHeight,m_paperSize,m_pPrintInfo,m_nMaxPage,m_printPoint,POINT_COUNT,this);
dlg.m_bEditMode = m_bEditMode;
dlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CDlgReportPrintPreview dialog


CDlgReportPrintPreview::CDlgReportPrintPreview(CWnd* pParent /*=NULL*/)
: CDialog(CDlgReportPrintPreview::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgReportPrintPreview)
m_nCurPage = 0;
m_nPosX = 0;
m_nPosY = 0;
//}}AFX_DATA_INIT
}

CDlgReportPrintPreview::CDlgReportPrintPreview(CString& csHeight,CString& csFaceName, CSize paperSize, PRINTINFO printInfo[], int nMaxPage, CPoint* pPrintPoint, int nPrintCount,ReportPrint* parent )
: CDialog(CDlgReportPrintPreview::IDD, NULL)
{
//初始化字体
m_csHeight = csHeight;
m_csFaceName = csFaceName;
//初始化纸张大小
m_paperSize = paperSize;
//初始化打印信息
m_pPrintInfo = printInfo;
//初始化最大打印页数
m_nMaxPage = nMaxPage;
//初始化打印坐标
m_pPrintPoint = pPrintPoint;
//初始化打印坐标个数
m_nPrintCount = nPrintCount;
//父类指针
m_pParent = parent;

m_previewRect.bottom = m_previewRect.top = m_previewRect.left = m_previewRect.right =0;
m_nCurPage=1;

m_bEditMode = FALSE;


}
void CDlgReportPrintPreview::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgReportPrintPreview)
DDX_Control(pDX, IDC_COMBO_NODE, m_ctrlNodes);
DDX_Text(pDX, IDC_EDIT_CUR_PAGE, m_nCurPage);
DDX_Text(pDX, IDC_EDIT_X, m_nPosX);
DDX_Text(pDX, IDC_EDIT_Y, m_nPosY);
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgReportPrintPreview, CDialog)
//{{AFX_MSG_MAP(CDlgReportPrintPreview)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BN_PRE, OnBnPre)
ON_BN_CLICKED(IDC_BN_NEXT, OnBnNext)
ON_BN_CLICKED(IDC_BN_SET_POS, OnBnSetPos)
ON_CBN_SELCHANGE(IDC_COMBO_NODE, OnSelchangeComboNode)
ON_EN_CHANGE(IDC_EDIT_Y, OnChangeEditY)
ON_EN_CHANGE(IDC_EDIT_X, OnChangeEditX)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgReportPrintPreview message handlers

BOOL CDlgReportPrintPreview::OnInitDialog()
{
CDialog::OnInitDialog();

CString str;
int i=0;
for (;i<POINT_COUNT;i++)
{

str.Format(" [%d] ",i);
m_ctrlNodes.AddString(str);
}
m_ctrlNodes.SelectString(i,str);

m_ctrlNodes.SetCurSel(0);
m_nPosX = m_pPrintPoint[0].x;
m_nPosY = m_pPrintPoint[0].y;
CString csPosX;
csPosX.Format("%d",m_nPosX);
CString csPosY;
csPosY.Format("%d",m_nPosY);
SetDlgItemText(IDC_EDIT_X,csPosX);
SetDlgItemText(IDC_EDIT_Y,csPosY);
UpdateData(TRUE);


if (m_bEditMode == FALSE)
{
GetDlgItem(IDC_STATIC_NODE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_POS)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BN_SET_POS)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_COMBO_NODE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_X)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_Y)->ShowWindow(SW_HIDE);
}


return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgReportPrintPreview::OnPaint()
{

//CPaintDC pDC(this->GetDlgItem(IDD_DLG_PRINT_PREVIEW));
CDialog::OnPaint();

CDC* pDC;
pDC = GetDC();
GetClientRect(&m_previewRect);//获得客户区大小

m_previewRect.left +=40;
m_previewRect.right-=40;
m_previewRect.top +=70;
m_previewRect.bottom -=40;

m_nRato=float(m_previewRect.right-m_previewRect.left)/m_paperSize.cx;//预览窗口的宽度除以纸张的宽度 得到预览缩放比例
m_previewRect.bottom =m_previewRect.top+int(m_paperSize.cy*m_nRato);//用缩放比例调整预览纸张的长度 保证预览纸张的高宽比
DrawPrintPreview(pDC,&m_previewRect);
}

void CDlgReportPrintPreview::DrawPrintPreview(CDC *pDC, CRect *previewRect)
{
CFont font,*pOldFont;
CPen pen,*pOldPen;


GetDlgItem(IDC_STATIC_MAP)->ShowWindow(SW_HIDE);

pen.CreatePen(PS_SOLID,2,RGB(255,0,0));//创建画笔

font.CreatePointFont(int(atoi(m_csHeight)*10/m_nRato),m_csFaceName,pDC);

pOldFont=pDC->SelectObject(&font);//将字体选入
pOldPen=pDC->SelectObject(&pen);//将画笔选入
pDC->SetBkMode(OPAQUE);//设置位图背景模式为不透明
pDC->SetBkColor(RGB(255,255,255));//设置位图背景颜色为白色

//填充位图
pDC->FillSolidRect(previewRect->left-1,previewRect->top-1,previewRect->Width()+2,previewRect->Height()+2,RGB(25,25,25));
pDC->FillSolidRect(previewRect->left,previewRect->top,previewRect->Width(),previewRect->Height(),RGB(255,255,255));

//设置文字显示颜色
pDC->SetTextColor(RGB(0,0,0));

//打印预览字体
for (int j=0;j<POINT_COUNT;j++)
{
CString str;
str.Format("%s[%d]",m_pPrintInfo[m_nCurPage-1].text[j],j+1);
pDC->TextOut(previewRect->left+m_pPrintPoint[j].x,previewRect->top+m_pPrintPoint[j].y,str);
}

font.DeleteObject();
pen.DeleteObject ();
}

void CDlgReportPrintPreview::OnBnPre()
{
if (m_nCurPage == 1)
{
AfxMessageBox("已经是第一页了");
}
else
{
m_nCurPage--;
UpdateData(FALSE);
Invalidate(FALSE);
}

}

void CDlgReportPrintPreview::OnBnNext()
{
if (m_nCurPage == m_nMaxPage)
{
AfxMessageBox("已经是最后一页了");
}
else
{
m_nCurPage++;
UpdateData(FALSE);
Invalidate(FALSE);
}
}

void CDlgReportPrintPreview::OnOK()
{
m_pParent->Print(FALSE);

//CDialog::OnOK();
}


void CDlgReportPrintPreview::OnBnSetPos()
{
UpdateData(FALSE);
int index = m_ctrlNodes.GetCurSel();
((m_pPrintPoint[index])).x = (GetDlgItemInt(IDC_EDIT_X));
((m_pPrintPoint[index])).y = (GetDlgItemInt(IDC_EDIT_Y));
int i = m_pPrintPoint[m_ctrlNodes.GetCurSel()].x;
int j = m_pPrintPoint[m_ctrlNodes.GetCurSel()].y;
UpdateData(TRUE);
Invalidate(FALSE);
}

void CDlgReportPrintPreview::OnSelchangeComboNode()
{
int index = m_ctrlNodes.GetCurSel();
if (index == -1)
{
index =0;
m_ctrlNodes.SetCurSel(0);
}
m_nPosX = m_pPrintPoint[index].x;
m_nPosY = m_pPrintPoint[index].y;
CString csPosX;
csPosX.Format("%d",m_nPosX);
CString csPosY;
csPosY.Format("%d",m_nPosY);
SetDlgItemText(IDC_EDIT_X,csPosX);
SetDlgItemText(IDC_EDIT_Y,csPosY);
UpdateData(TRUE);
}

void CDlgReportPrintPreview::OnChangeEditX()
{
m_nPosX = GetDlgItemInt(IDC_EDIT_X);
}

void CDlgReportPrintPreview::OnChangeEditY()
{
m_nPosY = GetDlgItemInt(IDC_EDIT_Y);
}


打印预览对话框


分享到:
评论

相关推荐

    VC6.0 MFC 报表批量打印程序

    总之,这个VC6.0 MFC报表批量打印程序展示了如何绕过文档视图框架,使用纯代码绘制技术实现报表的打印预览和批量打印。通过对问题文本的分析和代码类的探索,我们可以学到如何优化打印过程,解决可能出现的问题,并...

    vc报表(MFC)

    在IT行业中,Visual C++(简称VC)是一种广泛使用的C++编程环境,由Microsoft开发,它支持MFC(Microsoft Foundation Classes)库,这是一个面向对象的类库,用于简化Windows应用程序的开发,包括创建报表。MFC是...

    基于MFC对话框的报表打印和预览功能

    在MFC(Microsoft Foundation Classes)框架中,实现对话框(Dialog)上的报表打印和预览功能涉及多个步骤和关键组件。下面将详细解释这个过程。 首先,为了在对话框上集成打印和预览功能,我们需要引入四个核心...

    VC报表打印程序源码(重点)

    总的来说,VC报表打印程序源码的学习涵盖了数据处理、界面设计、打印控制等多个方面,对于希望在Windows环境下开发高效报表应用的程序员来说,是极其宝贵的学习材料。通过研究和实践,开发者能够掌握如何利用VC++...

    VC报表打印程序源码.7z

    "VC报表打印程序源码.7z"这个压缩包文件显然包含了使用C/C++语言编写的一个报表打印程序的完整源代码。让我们深入探讨一下这个主题,了解C/C++中的报表打印涉及到哪些关键知识点。 首先,报表打印程序的核心在于...

    VC报表打印程序源码.rar

    【标签】同样强调了"VC报表打印程序源码",意味着这个压缩包内容的核心是关于如何在VC++环境中实现报表的打印功能。开发者或学习者可以通过研究源代码来理解如何利用VC++的MFC(Microsoft Foundation Classes)或...

    MFC调用C#报表

    在IT行业中,尤其是在Windows应用程序开发领域,MFC(Microsoft Foundation Classes)和C#是两种常见的编程框架。...通过遵循上述步骤,并结合提供的详细文档,开发者可以成功地在MFC应用中实现C#报表的功能。

    Visual-CPP.rar_MFC 报表_MFC数据库报表_VC++数据库报表_edgerj2_报表 MFC

    通过MFC,我们可以将这些报表集成到我们的VC++项目中,实现与数据库的交互,从而动态地展示和打印数据。 1. **水晶报表集成**: - 创建一个新的MFC工程,选择ActiveX控件容器类(如CFormView或CDialog)作为基类。...

    archive_VC报表打印程序源码.zip.zip

    【描述】"archive_VC报表打印程序源码.zip.zip" 的描述简洁,暗示了这是一个用Visual C++(VC)编写的项目,可能利用了MFC(Microsoft Foundation Classes)库,这是微软为Windows平台提供的C++类库,用于简化...

    VC报表打印预览源码

    压缩包中的"VC报表打印程序"可能包含多个文件,如源代码文件(.cpp和.h)、资源文件(.rc)、配置文件(.vcproj或.sln)等。通过分析这些文件,开发者不仅可以学习到报表打印预览的实现,还能了解VC++项目的基本结构...

    87902756MFC应用程序框架打印预览功能分析与扩展.zip

    MFC应用程序框架打印预览功能分析与扩展,自绘报表,用doc/view框架打印

    用MFC类定制的打印Printing with MFC Made Easy

    在Windows应用程序开发中,Microsoft Foundation Class (MFC)库提供了一种高效且便捷的方式来实现打印功能。"用MFC类定制的打印Printing with MFC Made Easy"是一个专题,旨在帮助开发者理解和利用MFC库中的打印功能...

    dlgprint.rar_vc 打印_vc 打印 程序_vc 报表_打印_报表

    "dlgprint.rar_vc 打印_vc 打印 程序_vc 报表_打印_报表"这个压缩包提供了一个关于VC++实现打印功能的实例,特别针对报表的输出。这对于初学者来说是一个很好的学习资源,可以帮助他们理解如何在VC++中处理复杂的...

    Visual C++源码 制作打印报表

    在报表打印中,OnDraw()会被调用来绘制报表的每一部分,如表格、文本和图像。 5. CDC类:Device Context(设备上下文)是MFC中用于图形绘制的核心类。通过CDC对象,开发者可以访问打印机的特性,并进行精确的图形...

    VC++对话框程序打印及打印预览的实现

    在VC++编程环境中,开发基于对话框的应用程序时,我们经常需要实现打印和打印预览功能,以便用户能够将程序中的数据或结果显示在纸上。本文将深入探讨如何在VC++中实现这一目标。 首先,我们需要了解打印和打印预览...

    打印报表源代码

    在IT行业中,报表打印是企业应用中的重要组成部分,主要用于数据可视化和信息传递。"打印报表源代码"这个主题涵盖了报表的设计、窗口的构建、打印设置以及与OLE(Object Linking and Embedding)技术的交互等多个...

    对话框自制打印报表预览

    通过对这些文件的深入研究和学习,开发者可以掌握如何在MFC环境下实现自己的报表预览和打印功能。 总之,利用MFC进行报表预览和打印的开发是一项复杂但重要的任务。通过理解MFC的打印机制,结合数据库操作,以及...

    网格报表,可以轻松实现VC的打印报表

    总的来说,通过使用特定的网格报表控件并结合打印控件,开发者可以在VC项目中实现高效且灵活的报表打印功能。这不仅可以提高开发效率,还可以为用户提供更友好的交互体验。了解并熟练掌握这些工具和技术,对于提升...

    vc++同学做的宏图报表打印和打印预览。功能还有很多。

    本项目标题提到的“宏图报表打印和打印预览”,是VC++应用程序的一个常见功能,涉及到图形用户界面(GUI)设计、数据处理以及打印技术。下面将详细讲解这些知识点。 1. **VC++ 6.0**: VC++ 6.0 是Microsoft在1998...

    易于报表打印类

    在"Mfc报表打印类 易于报表打印类.zip"这个压缩包中,包含两个主要文件:EasyReportsDemo.zip和EasyReports.zip。EasyReportsDemo可能是一个演示程序,它展示了如何使用EasyReports类进行报表打印,而EasyReports....

Global site tag (gtag.js) - Google Analytics