在C ++
Builder中自定义预览窗口 装备指挥技术学院 林华君 鲜思德
|
| Borland C++
Builder是基于C++语言的可视化编程环境,它提供了可重用组件库和一系列RAD设计工具,使得编程者只需用少量的手工代码就可以创建出高效的Windows应用程序,尤其是复杂的数据库访问应用程序,因此深受软件开发人员的喜爱。 |
| 在开发数据库访问应用程序时,会经常涉及到报表的打印问题。C++ Builder中提供了Quick
Report(快速报表)组件供编程人员设计报表。Quick Report是挪威的QuSoft AS公司专门为C++
Builder设计的用于制作报表的一组控件,在C++ Builder中关于Quick Report的帮助文档不是很详细。另外它与C++
Builder的其他控件的风格也不太一致。直接使用Quick
Report的报表预览功能总是不能达到令人满意的效果,因此有必要自定义快速报表的预览窗口。 |
| 新建工程,在Form1窗体上添加一个ToolBar控件,并在其上添加以下按钮:“打印”、“打印设置”、 |
| “上一页” 、“下一页”、“放大”、“缩小”和“关闭”。
在Form1窗体上添加一个Panel控件,对齐方式设为alBottom,再在此Panel控件上添加一个ProgressBar控件(对齐方式设为alLeft)和一个Panel控件(Name
为Panel2,对齐方式设为alRight,BevelOuter设为bvLowered),这两个控件分别用来显示报表装载进度和其他提示信息。在Form1窗体上添加一个QRPreview控件,对齐方式设为alClient。Form1窗体的外观如图1所示: |
| 再新建一个窗体,设其Name为Form2,
在该窗体上添加TQuickRep控件,设其Name为QuickRep1,其PrinterSetting中的Units属性设为mm(以毫米为计量单位),然后建立报表。 |
| 1.在Form2上选择QuickRep1,在其事件中选择OnPreview,输入以下代码: |
| Form1->QRPreview1->QRPrinter=Form2->QuickRep1->QRPrinter; |
| 2.在Form1的头文件中找到对象TForm1的定义,在其中添加以下的代码: |
| 3.选择Form1的Activate事件,输入以下代码: |
| OldPaperSize=Form2->QuickRep1->Page->PaperSize; |
| OldOrientation=Form2->QuickRep1->Page->Orientation+1; |
| OldLeft=Form2->QuickRep1->Page->LeftMargin*100; |
| OldRight=Form2->QuickRep1->Page-> |
| OldTop=Form2->QuickRep1->Page->Top |
| OldBottom=Form2->QuickRep1->Page-> |
| Form2->QuickRep1->Prepare(); |
| Form2->QuickRep1->Preview(); |
| void TForm1::RefreshPanel() |
| Panel2->Caption=“第”+IntToStr(Form1->QRPreview1->PageNumber)+“页”+“共”
+
IntToStr(Form2->QuickRep1->PageNumber)+“页”; |
| 5.从Form1中选择QRPreview1,在其事件中选择OnProgressUpdate,输入以下代码: |
| ProgressBar1->Position=Progress; |
| Form2->QuickRep1->Print(); |
| LPPAGESETUPDLG mylp=new
PAGESETUPDLG; |
| memset((void *)mylp,0,sizeof |
| mylp->lStructSize=sizeof(PAGESETUPDLG); |
| mylp->hwndOwner=this->Handle; |
| mylp->Flags=PSD_RETURNDEFAULT; |
| if (mylp->hDevMode!=NULL){ |
| pDev=(DEVMODE
*)GlobalLock(mylp->hDevMode); |
| pDev->dmPaperSize
=OldPaperSize; |
| pDev->dmOrientation
=OldOrientation; |
| mylp->rtMargin.left =OldLeft; |
| mylp->rtMargin.right
=OldRight; |
| mylp->rtMargin.top =OldTop; |
| mylp->rtMargin.bottom=OldBottom; |
| GlobalUnlock(mylp->hDevMode); |
| PSD_INHUNDREDTHSOFMILLIMETERS; |
| pDev=(DEVMODE *)GlobalLock |
| OldPaperSize
=pDev->dmPaperSize; |
| if(OldPaperSize>28)OldPaperSize=9;//A4 |
| OldOrientation=pDev->dmOrientation; |
| OldLeft =mylp->rtMargin.left; |
| OldRight =mylp->rtMargin.right; |
| OldTop =mylp->rtMargin.top; |
| OldBottom
=mylp->rtMargin.bottom; |
| Form2->QuickRep1->Page->Orientation
=OldOrientation-1; |
| Form2->QuickRep1->Page->PaperSize
|
| Form2->QuickRep1->Page->LeftMargin
=OldLeft/100; |
| Form2->QuickRep1->Page->RightMargin
=OldRight/100; |
| Form2->QuickRep1->Page->TopMargin
=OldTop/100; |
| Form2->QuickRep1->Page->Bottom |
| GlobalUnlock(mylp->hDevMode); |
| GlobalFree(mylp->hDevMode); |
| QRPreview1->PageNumber=1; |
| Form2->QuickRep1->Prepare(); |
| Form2->QuickRep1->Preview(); |
| if(QRPreview1->PageNumber >
1) |
| QRPreview1->PageNumber--; |
| if(QRPreview1->PageNumber <
Form2-> |
| QRPreview1->PageNumber++; |
| if(QRPreview1->Zoom< 200) |
| 该方法的核心是使用了Win32
API函数PageSetupDlg(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。 | |