在C++Builder中自定义预览窗口

来源:网络时间:2011-06-27 18:06:30

  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.
  
  再新建一个窗体,设其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(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:9145908@qq.com