《在c++builder中自定义预览窗口》由会员分享,可在线阅读,更多相关《在c++builder中自定义预览窗口(4页珍藏版)》请在金锄头文库上搜索。
1、在 C+Builder 中自定义预览窗口Borland C Builder 是基于 C语言的可视化编程环境,它提供了可重用组件库和一系列 RAD 设计工具,使得编程者只需用少量的手工代码就可以创建出高效的 Windows 应用程序,尤其是复杂的数据库访问应用程序,因此深受软件开发人员的喜爱。 在开发数据库访问应用程序时,会经常涉及到报表的打印问题。C Builder 中提供了 Quick Report(快速报表)组件供编程人员设计报表。Quick Report 是挪威的 QuSoft AS 公司专门为 C Builder 设计的用于制作报表的一组控件,在 C Builder 中关于 Quick
2、 Report 的帮助文档不是很详细。另外它与 C Builder 的其他控件的风格也不太一致。直接使用 Quick Report 的报表预览功能总是不能达到令人满意的效果,因此有必要自定义快速报表的预览窗口。 设置预览窗口 新建工程,在 Form1 窗体上添加一个 ToolBar 控件,并在其上添加以下按钮:“打印” 、 “打印设置” 、 “上一页” 、 “下一页” 、 “放大” 、 “缩小”和“关闭” 。 在 Form1 窗体上添加一个 Panel 控件,对齐方式设为 alBottom,再在此 Panel 控件上添加一个 ProgressBar 控件(对齐方式设为 alLeft)和一个 P
3、anel 控件(Name 为 Panel2,对齐方式设为 alRight,BevelOuter 设为 bvLowered),这两个控件分别用来显示报表装载进度和其他提示信息。在 Form1 窗体上添加一个 QRPreview 控件,对齐方式设为 alClient。再新建一个窗体,设其 Name 为 Form2, 在该窗体上添加 TQuickRep 控件,设其 Name 为 QuickRep1,其 PrinterSetting 中的 Units 属性设为 mm(以毫米为计量单位) ,然后建立报表。 编程实现 1.在 Form2 上选择 QuickRep1,在其事件中选择 OnPreview,输入
4、以下代码: Form1QRPreview1QRPrinter=Form2QuickRep1QRPrinter; 2.在 Form1 的头文件中找到对象 TForm1 的定义,在其中添加以下的代码: int OldPaperSize; int OldOrientation; int OldTop; int OldBottom; int OldLeft; int OldRight; void RefreshPanel(); 3.选择 Form1 的 Activate 事件,输入以下代码: /初始化 OldPaperSize=Form2QuickRep1PagePaperSize; OldOrien
5、tation=Form2QuickRep1Page Orientation1; OldLeft=Form2QuickRep1PageLeftMargin 100; OldRight=Form2QuickRep1Page RightMargin100; OldTop=Form2 QuickRep1Page Top Margin 100; OldBottom=Form2QuickRep1Page BottomMargin100; Form2QuickRep1Prepare(); RefreshPanel(); Form2QuickRep1Preview(); 4.在 Form1 中添加更新提示代码
6、: void TForm1:RefreshPanel() /更新提示信息 Panel2 Caption=“第”IntToStr(Form1QRPreview1 PageNumber)“页”“共” IntToStr(Form2QuickRep1PageNumber)“页”; 5.从 Form1 中选择 QRPreview1,在其事件中选择 OnProgressUpdate,输入以下代码: /显示报表装载进度 ProgressBar1Position=Progress; RefreshPanel(); 6.打印: Form2QuickRep1Print(); 7.打印设置: DEVMODE pDe
7、v; LPPAGESETUPDLG mylp=new PAGESETUPDLG; memset(void )mylp,0,sizeof (PAGESETUPDLG); mylplStructSize=sizeof(PAGESETUPDLG); mylphwndOwner=this Handle; mylpFlags=PSD_RETURNDEFAULT; PageSetupDlg( mylp ); if (mylp hDevMode!=NULL) pDev=(DEVMODE )GlobalLock(mylphDevMode); pDevdmPaperSize =OldPaperSize; pDe
8、vdmOrientation =OldOrientation; mylprtMargin.left =OldLeft; mylprtMargin.right =OldRight; mylprtMargin.top =OldTop; mylprtMargin.bottom=OldBottom; GlobalUnlock(mylphDevMode); mylpFlags=PSD_MARGINS| PSD_INHUNDREDTHSOFMILLIMETERS; if(PageSetupDlg(mylp) pDev=(DEVMODE )GlobalLock (mylphDevMode); OldPape
9、rSize =pDevdmPaperSize; if(OldPaperSize28)OldPaperSize=9;/A4 OldOrientation=pDevdmOrientation; OldLeft =mylprtMargin.left; OldRight =mylprtMargin.right; OldTop =mylprtMargin.top; OldBottom =mylprtMargin.bottom; Form2QuickRep1PageOrientation =OldOrientation1; Form2QuickRep1PagePaperSize =OldPaperSize
10、; Form2QuickRep1PageLeftMargin =OldLeft/100; Form2QuickRep1PageRightMargin =OldRight/100; Form2QuickRep1PageTopMargin =OldTop/100; Form2QuickRep1PageBottom Margin=OldBottom/100; GlobalUnlock(mylphDevMode); GlobalFree(mylphDevMode); delete mylp; QRPreview1PageNumber=1; Form2QuickRep1Prepare(); Form2Q
11、uickRep1Preview(); 8.向上翻页: /上一页 if(QRPreview1PageNumber 1) QRPreview1PageNumber; RefreshPanel(); 9.向下翻页: /下一页 if(QRPreview1PageNumber QuickRep1PageNumber) QRPreview1PageNumber; RefreshPanel(); 10.放大处理: /放大 if(QRPreview1ZoomZoom=5; 11.缩小处理: /缩小 if(QRPreview1Zoom5) QRPreview1Zoom=5; 小 结 该方法的核心是使用了 Win32 API 函数 PageSetupDlg(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。