近來我在用VC開發一套MIS時沒有用MFC的文檔視圖模板,所以在打印這上面就只好自己寫了一套,用起來感覺還可以,所以寫出來大家一起修正一下吧,也許能給大家起點作用吧! 系統UI是基於對話框的,大家如果感覺不錯可以進行自我修正! 我們先來看看程序界面:
其中的學生數據現在我們已從數據庫取出放在,ListCtrl控件中了,這樣就為我們在打印時提供了方便,不需要再去數據重新提取數據了。 在點了打印按鈕後,打印預覽界面:
在預覽界面中,提供了鼠標上下左右滾動功能。好了來說代碼吧,在此共用了兩個繼承 Cdialog 的類:
1、CpreParent
2、CpreView
CpreParent 作為最外面的控制窗口, CpreView作為真正的預覽窗口。
CpreParent窗口內包括一個平面打印控制工具欄及一個預覽窗口CpreView
按鈕左右順序功分別為:
1、報表第一頁
2、報表上一頁
3、跳轉到報表頁
4、報表下一頁
5、報表最後頁
6、退出
7、打印
我們來看在對話框打印按鈕中的代碼是如果來調用 CpreParent 的:在此我們要用到這樣一個結構:
//打印結構
typedef struct
{
int nMaxLine; //ClistCtrl中的最大行數
int nCountPage; //一共頁數
int nCurPage; //當前頁碼
BOOL IsPrint; //是否打印,false 表示預覽
HWND hWnd; //窗口句柄
HWND hListView; //列表控件句柄
TCHAR szTag[256]; //其它數據
int nTag; //其它數據
LPVOID lpVoid; //其它數據
}PRNINFO, *PPRNINFO;
//打印按鈕代碼
void CXJWH::OnPrint() //注這裡的 CXJWH 為數據管理窗口即打印類的調用窗口
{
if(CLtv。GetItemCount()<= 0) //CLtv 為ClistCtrl, 這裡檢測是否有數據在列表中
return;
PRNINFO PrnInfo = {0}; //此為用到的一個結構, 見下面定義
PrnInfo。hListView = CLtv。m_hWnd; //ClistCtrl的句柄
PrnInfo。hWnd = this->m_hWnd; //當前窗口句柄
PrnInfo。IsPrint = FALSE; //當前為預覽
PrnInfo。nCurPage = 1; //當前頁為第一頁
PrnInfo。nMaxLine = CLtv。GetItemCount(); //ClistCtrl中的數據行數
CPreParent DlgPreView; //聲明打印類
DlgPreView。SetCallBackFun(DrawInfo, PrnInfo); //在這裡給它設定我們自己的打印函數
DlgPreView。DoModal(); //預覽
}
注: 這裡的 DlgPreView.SetCallBackFun(DrawInfo,PrnInfo);
DrawInfo 是我們在 CXJWH 定義好的靜態打印函數。
static void DrawInfo(CDC &memDC,PRNINFO PrnInfo);
由於本人寫作水平有限,所以還是請大家看代碼吧!
本文配套源碼