当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++Builder中自界说预览窗口

C++Builder中自界说预览窗口

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:448

副标题#e#

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,输入以下代码:


#p#副标题#e#

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();

#p#副标题#e#

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;

小 结

#p#分页标题#e#

该要领的焦点是利用了Win32 API函数PageSetupDlg(),操作该函数可以获取页面配置的缺省值,包罗纸张巨细、打印偏向以及上下阁下空缺边的巨细等,也可以弹出页面配置对话框来修改这些值。

 

    关键字:

天才代写-代写联系方式