程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++Builder中自定義預覽窗口

C++Builder中自定義預覽窗口

編輯:關於C++

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(),利用該函數可以獲取頁面設置的缺省值,包括紙張大小、打印方向以及上下左右空白邊的大小等,也可以彈出頁面設置對話框來修改這些值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved