用戶: 密碼:     忘記密碼 | 會員註冊
  

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

9.0
出處:2345軟件大全 時間:2011-06-27 人氣:1363

核心提示:Borland C++ Builder是基於C++語言的可視化編程環境,它提供了可重用組件庫和一系列RAD設計工具

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