VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > C/C++语言编程 >
  • c语言入门之在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所示: 
  
图1 自定义快速报表的预览窗口 
再新建一个窗体,设其Name为Form2, 在该窗体上添加TQuickRep控件,设其Name为QuickRep1,其PrinterSetting中的Units属性设为mm(以毫米为计量单位),然后建立报表。 
编程实现 
1.在Form2上选择QuickRep1,在其事件中选择OnPreview,输入以下代码: 
Form1->QRPreview1->QRPrinter=Form2->QuickRep1->QRPrinter; 
2.在Form1的头文件中找到对象TForm1的定义,在其中添加以下的代码: 
int OldPaperSize; 
int OldOrientation; 
int OldTop; 
int OldBottom; 
int OldLeft; 
int OldRight; 
void RefreshPanel(); 
3.选择Form1的Activate事件,输入以下代码: 
//初始化 
OldPaperSize=Form2->QuickRep1->Page->PaperSize; 
OldOrientation=Form2->QuickRep1->Page->Orientation+1; 
OldLeft=Form2->QuickRep1->Page->LeftMargin*100; 
OldRight=Form2->QuickRep1->Page-> 
RightMargin*100; 
OldTop=Form2->QuickRep1->Page->Top 
Margin*100; 
OldBottom=Form2->QuickRep1->Page-> 
BottomMargin*100; 
Form2->QuickRep1->Prepare(); 
RefreshPanel(); 
Form2->QuickRep1->Preview(); 
4.在Form1中添加更新提示代码: 
void TForm1::RefreshPanel() 
{ //更新提示信息 
Panel2->Caption=“第”+IntToStr(Form1->QRPreview1->PageNumber)+“页”+“共” + IntToStr(Form2->QuickRep1->PageNumber)+“页”; 

5.从Form1中选择QRPreview1,在其事件中选择OnProgressUpdate,输入以下代码: 
//显示报表装载进度 
ProgressBar1->Position=Progress; 
RefreshPanel(); 
6.打印: 
Form2->QuickRep1->Print(); 
7.打印设置: 
DEVMODE *pDev; 
LPPAGESETUPDLG mylp=new PAGESETUPDLG; 
memset((void *)mylp,0,sizeof 
(PAGESETUPDLG)); 
mylp->lStructSize=sizeof(PAGESETUPDLG); 
mylp->hwndOwner=this->Handle; 
mylp->Flags=PSD_RETURNDEFAULT; 
PageSetupDlg( mylp ); 
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); 
mylp->Flags=PSD_MARGINS| 
PSD_INHUNDREDTHSOFMILLIMETERS; 
 if(PageSetupDlg(mylp)){ 
  pDev=(DEVMODE *)GlobalLock 
(mylp->hDevMode); 
  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  
=OldPaperSize; 
Form2->QuickRep1->Page->LeftMargin =OldLeft/100; 
Form2->QuickRep1->Page->RightMargin =OldRight/100; 
Form2->QuickRep1->Page->TopMargin =OldTop/100; 
Form2->QuickRep1->Page->Bottom 
Margin=OldBottom/100; 
 GlobalUnlock(mylp->hDevMode); 

 GlobalFree(mylp->hDevMode); 
 } 
delete mylp; 
QRPreview1->PageNumber=1; 
Form2->QuickRep1->Prepare(); 
Form2->QuickRep1->Preview(); 
8.向上翻页: 
//上一页 
if(QRPreview1->PageNumber > 1) 
 QRPreview1->PageNumber--; 
RefreshPanel(); 
9.向下翻页: 
//下一页 
if(QRPreview1->PageNumber < Form2-> 
QuickRep1->PageNumber) 
QRPreview1->PageNumber++; 
 RefreshPanel(); 
10.放大处理: 
//放大 
if(QRPreview1->Zoom< 200) 
 QRPreview1->Zoom+=5; 
11.缩小处理: 
//缩小 
if(QRPreview1->Zoom>5) 
 QRPreview1->Zoom-=5; 
小 结 
该方法的核心是使用了Win32 API函数PageSetupDlg(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。
相关教程