Visual C++ 环境下轻松实现报表处理

Visual C++ 环境下轻松实现报表处理
浙江省温岭电信局 王骏

本文适合读者层次:初级、中级

前言
  数据库在企业软件系统中应用广泛,而报表的显示与打印成为此类软件必备的功能。可惜VC++并没有集成报表处理工具,但其强大的功能再加上市面上功能完备的报表处理工具使这一工作变得容易,本文介绍了在VC++环境中利用Seagate公司的Crystal report(水晶报表)来实现报表的显示与打印,并提供示例代码

一、准备工作
(1)安装Crystal Report软件
Crystal Report 4.6是一个免费的报表工具,可以在VB5或WINDOWS NT 4.0 BackOffice等光盘上找到,Crystal report4.6中包含了报表设计工具与报表打印控件。程序的发行只需要安装打印控件相关部分即可。
无法找到此软件的网友可以到VC知识库站点下载,网址为http://www.vckbase.com/ocx/report
(2)设计报表
我们生成一个名为sample.rpt的报表,这一过程可以参考 Crystal report自带的帮助文档,本文不作详细介绍。
本文示例代码中已经包含了此文件,您也可以直接下载已经做好的sample.rpt,点这里下载

二、创建VC工程添加报表控件

  在VC集成环境中用AppWizard新建一个MFC单文档工程,其余选项都为默认。菜单中选择Project->Add To Project->Components and Controls...弹出组件、控件选择对话框,进入Registered ActiveX Controls,选中Crystal Report Control 4.6 ,单击Insert按钮,确认后进入类配置对话框,按默认即可。关闭控件选择对话框完成控件的添加。

三、实现报表的显示与打印
下面我们将在对话框中演示控件的静态创建过程,在主视图中演示控件的动态创建过程。

3.1在对话框中打印出报表

在资源编辑器中打开ID为IDD_ABOUTBOX的对话框模板,在Controls工具条中我们可以找到刚加入到工程中的Crystal Report Control 4.6控件按钮,把它插入到对话框合适的位置处。
右键单击对话框中的控件,选择属性,此时可以设置控件的许多属性。我们在Control选项页ReportFileName中输入报表文件名sample.rpt(可以加上完整路径),在Print Window选项页中设置控件的合适位置,回到对话框模板中按住Ctrl键,双击鼠标左键,弹出Add Member Variable对话框,我们将成员变量命名为m_CrystalReport,打开ClassWizard,为CAboutDlg对话框添加WM_INITDIALOG消息的处理函数:BOOL OnInitDialog(),并在函数中做如下处理

BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
/此行设置控件的父窗口,你也可以去掉该行看看运行效果/
m_CrystalReport.SetWindowParentHandle((long)(this->m_hWnd));
/打印报表到窗口中/
m_CrystalReport.PrintReport();
return TRUE;
}

至此,程序的第一部分编写完成,编译运行,打开About对话框看看效果吧!


哦!还不错!
假如您并没有显示出报表,有如下可能原因:
(1)控件没有放置在合适的位置或尺寸不对。
(2)报表文件本身存在诸如数据源不可用等错误。
控件窗口中的工具条提供了缩放、打印等功能,您也可以试试在打印机上打印出来的效果。

3.2 在程序主视窗中显示报表


打开ClassWizard增加对ID_FILE_OPEN和ID_FILE_PRINT的处理函数,代码如下


void CMyReportView::OnFileOpen()
{
char Filter[] = "Crystal Report files(*.rpt)|*.rpt|All files(*.*)|*.*||";
CRect rect;
CFileDialog OpenDlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,(LPCTSTR)Filter,NULL);
if(OpenDlg.DoModal()!=IDOK) ///显示文件对话框
return;
CString m_fName=OpenDlg.GetPathName(); ///取得文件名
if(m_CrystalReport)
m_CrystalReport.DestroyWindow();
GetClientRect(rect);
///创建控件///
if (!m_CrystalReport.Create(AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),WS_CHILD|WS_VISIBLE,rect,this,IDC_CRYSTALREPORT1))
{
AfxMessageBox("控件创建失败!");
return ;
}
m_CrystalReport.SetWindowParentHandle((long)(this->m_hWnd));///设置父窗口
m_CrystalReport.SetWindowBorderStyle(0); ///设置为没有边框
m_CrystalReport.SetWindowLeft(0); ///左空间
m_CrystalReport.SetWindowTop(0); ///顶部空间
m_CrystalReport.SetWindowControls(FALSE); ///不显示工具条
m_CrystalReport.SetReportFileName(m_fName); ///设置报表文件
m_CrystalReport.SetWindowWidth(rect.Width()); ///设置窗口宽度
m_CrystalReport.SetWindowHeight(rect.Height()); ///设置窗口高度
m_CrystalReport.SetFormulas(0, "Company=/"VC知识库/""); ///将报表中的Company变量的值设置为VC知识库
m_CrystalReport.SetDestination(0); ///设置输出对象是屏幕
m_CrystalReport.PrintReport(); ///显示报表
}

void CMyReportView::OnFilePrint()
{
if(m_CrystalReport && m_CrystalReport.GetReportFileName() != "")
{
m_CrystalReport.SetDestination(1); ///设置输出对象是打印机
m_CrystalReport.PrintReport(); ///打印
}
}


程序运行效果如下图


点这里下载示例代码

后记:我们利用Crystal Report 4.6在VC++环境下实现了报表处理,但Crystal Report 4.6报表控件的功能及可控性能可能无法满足
您的要求,Seagate公司此款软件的最新版本是Crystal Report 8.0,各方面表现都非常出色,但此款软件的免费版本并不包括报表设计器,可喜的是8.0中的报表显示控件兼容以前版本的报表格式,所以笔者建议用4.6版本来设计报表,依靠8.0中的报表显示控件来显示、打印。

--- www.vckbase.com ---

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
1,indicator.ZIP数据棒图控件(200KB)2,xjtpripr.ZIP 打印预览控件(257KB) 3,trend.ZIP趋势控件可用于科学,工业监控,数据采集,股市分析等领域的数据显示、分析、打印(305KB) 4,dxcontrol.ZIP API 函数控件,包含输入、声音、图形等(358KB)5,gauge.ZIP 控件支持多数据处理和鼠标控制操作(232KB)6,meter.ZIP 圆盘仪表控件(240KB) 7,percent.ZIP 百分比控件的应用范围非常广泛,既适用于通用的软件系统,也可用于科学、统计、工业监控等多种实时数据领域(192KB)8,slider.ZIP Slider 控件不但可生成通用的滑块控制,而且内置了大量的指针、刻度、数据棒风格用于组合生成各式各样的线形控制(246KB)9,imgctls.ZIP 该控件包含两个控件,ImgListBox和ImgComboBox(56KB)10,nslock15.ZIPSheridan Soft出品Outlook风格的工具栏控件(97KB)11,CDrom.ZIP 控制光驱的东东(5KB)12,ActiveSkin.ZIP界面美化(69KB)13,FOXHWND.ZIP 一个比MCI32更出色的多媒体控件(14KB)14,ACTIVEXSQL.ZIP SQL接口控件(29KB)15,Big2GB.ZIP 简繁体转换(41KB) 16,ACTIVEZIPPER.ZIP 高效率的压缩控件(11KB)17,BOOKMARK.ZIP BOOKMARK控件(20KB)18,AresButtonPro.ZIP 任意形状立体动态按钮(306KB)19,SysTray.ZIP 托盘控件(9KB) 20,Recorder.ZIP 录音控件(15KB)21,CRESCENT2.ZIP crescent公司的internet 编程套件2.0(2,642KB)22,XCEEDZIP.ZIP XCEEDZIP解压缩控件(987KB) 23,ZIP_ACTOCX.ZIP ZIP_ACT解压缩控件(26KB)24,Dssocket.ZIP Dssocket是用来设计TCP/IP软件的VBX/OCX控件(781KB)25,ZIPOCXCMP.ZIP ZIPOCXCMP解压缩控件(83KB)26,DYNACUBE.ZIP DynamiCube 32-bit数据库控件(1,282KB)27,DYNAZIP30.ZIP DynaZIP解压缩控件(299KB)28,f[1].ZIP 使你的程序提供打印和打印预览功能控件(59KB)29,b[1].ZIP 使你的应用程序能够通过internet连接在线检查更新版本(511KB)30,c[1].ZIP 可以清晰朗读汉字,英文字母和数字的ActiveX控件(3,768KB) 31,cdnotiy.ZIP 当光盘被放进光驱或光驱里有光盘时便触发了这个控件(38KB)32,Mp3play.ZIP MP3PLAY 1.4 新版, 播放MP3的控件(181KB)33,mp3dll.ZIP 又一个简单播放MP3的控件(82KB)34,Zcg_3DLabel.ZIP 一个3D标签控件(15KB)<b

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

ren20

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值