Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 在C++Builder中自定义预览窗口
【标  题】:在C++Builder中自定义预览窗口
【关键字】:C,窗口,ld,C++,Build,Builder,Builder
【来  源】:网络

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

Your Ad Here 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(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。
直接发送数据到打印机:【上一篇】
如何快速自动生成并定制报表:【下一篇】
【相关文章】
  • CB编程中动态更改自定义打印纸张
  • 用C++Builder实现Windows 2000的Messenger
  • 用CB动态改变显示器分辨率
  • 深入C++ Builder之编写自己的元件(1)
  • 深入C++ Builder之编写自己的元件(2)
  • 深入C++ Builder之编写自己的元件(3)
  • WIN95日志钩子(JournalRecord Hook)的使用
  • 初级 WINDOWS API C++语言版 编程(1)
  • BCB控件制作和消息处理
  • 罗云彬VxD教程--DeviceIoControl接口
  • 【随机文章】
  • 精灵抓图源代码
  • 快速排序、插入排序和选择排序
  • 在AutoCAD中做纯文本的导入导出
  • 初步解决Tomcat 的administration tool 和 连接池 的问题!
  • 多层边框的CSS制作------mozilla的CSS参考之 -moz-outline
  • 中间件帮助花旗银行追踪客户活动
  • C#锐利体验(7.2)
  • [rcp系列]使用JFace Viewer注意事项
  • 使用 J2EE 技术设计面向服务的体系结构框架
  • 查看开放端口判断木马的方法
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.