圖文混排FormView
打印預覽項目技術(shù)文檔
在VC6里,CFormView的外觀和對話框CDialog差不多,上面可以直接放置各類子控件窗口,交互形式是以窗口模式進行。這和其它視圖風格完全不一樣??蛻繇椖渴且活愥t(yī)院的項目,想把CFormView子窗口里的圖片和文字內(nèi)容進行合理的預覽和打印。
所見即所得預覽和打印是窗體應(yīng)用程序開發(fā)里經(jīng)常用到的功能,也是一個不太容易掌握的功能,我們靈活使用了codeproject上提供的EasyReport開源項目,進行功能擴展,下面是實現(xiàn)特點:
u 實現(xiàn)了圖文混排的預覽和打印。
u 實現(xiàn)了根據(jù)打印紙寬度自適應(yīng)的預覽和打印。
u 預覽框架和原有的CFormView不沖突。
u 系統(tǒng)地解決了CDC映射模式問題。
u 預覽窗口功能完整。
下面是CFormView的顯示截圖:
下面是預覽的截圖:
1. 找到3張bmp格式圖片放到當前工程目錄下,其圖片名分別為bitmap1.bmp, bitmap2.bmp,bitmap3.bmp.
2. 移植過程:把CSampleReportView類,CMyFrame類,CEasyReport類添加到你想要的工程里,注意包含頭文件?!垂こ蹋?/span>>添加到工程->文件->選擇類的頭文件和源文件,點添加即可?!?/span>
3. 假如你的工程名是Test,在應(yīng)用程序類(就是CTestApp類的源文件里)的CSampleReportApp theApp;下面加入這2句CSingleDocTemplate* m_pTemplate;
BOOL m_bPrintPreview;
在CTestApp類的頭文件里加入
extern CSingleDocTemplate* m_pTemplate;
extern BOOL m_bPrintPreview;在你的打印預覽按鈕的響應(yīng)函數(shù)所在類的頭文件里加入函數(shù)BOOL OnPreviewCreate();源文件中加入
BOOL CMainFrame::OnPreviewCreate()
{
CFrameWnd* pOldFrame=(CFrameWnd*)AfxGetThread()->m_pMainWnd;
if (!m_pTemplate)
{
m_pTemplate = new CSingleDocTemplate(
IDR_MENU1,
NULL,
RUNTIME_CLASS(CFrameWnd),
RUNTIME_CLASS(CSampleReportView));
AfxGetApp()->AddDocTemplate(m_pTemplate);
}
CFrameWnd * pFrameWnd =(CFrameWnd*) m_pTemplate->CreateNewFrame( NULL, NULL );
m_bPrintPreview=TRUE;
m_pTemplate->InitialUpdateFrame( pFrameWnd, NULL);
CSampleReportView* pView=(CSampleReportView*)pFrameWnd->GetActiveView();
//pView->m_pCtrl=this;byLB
pView->m_pOldFrame=pOldFrame;
AfxGetApp()->m_pMainWnd=pFrameWnd;
pFrameWnd->SetWindowText(_T("OilManager Print Preview"));
pFrameWnd->ShowWindow(SW_SHOWMAXIMIZED);
pView->OnFilePrintPreview();
return TRUE;
}
在打印預覽的響應(yīng)函數(shù)里加入:OnPreviewCreate()即可。
4. 實現(xiàn)機制:子框架里用單文檔模板創(chuàng)建視圖的方法實現(xiàn)了基本打印框架。
5. 打印預覽內(nèi)容的實現(xiàn)主要靠CEasyReport這個類提供的方法來實現(xiàn)的。
6. 在CSampleReportView類的InitEasyReport函數(shù)里加預覽內(nèi)容定制
7. 首先CSampleReportView類里添加一個CEasyReport的對象名為m_Report.通過個對象調(diào)用CEasyReport類提供的外部方法
8. CEasyReport里的函數(shù)簡介
(1)SetCompanyName(const char *inStr)設(shè)置預覽時標題的名字,
使用方法:傳入一個字符串即可。
例如:m_Report.SetCompanyName(”xyz”);就把預覽時的標題名字設(shè)置成xyz了
(2)Start()函數(shù)指示了預覽開始,在這個函數(shù)里做一些初始化工作,m_Report.Start()|這樣就調(diào)用了。
(3) void SetDataCols(CColInfo *inCols = NULL, int nCols=0,bool bHideColName=false); 設(shè)置列的數(shù)目和寬度,第一個參數(shù)是一個結(jié)構(gòu)體的指針,此結(jié)構(gòu)體的初始化形式如下:
static CEasyReport::CColInfo s_ColsA[] = {
{"edit1", 27, CEasyReport::CColInfo::eLeft},
{"Edit1", 27, CEasyReport::CColInfo::eLeft},
{"edit2", 27, CEasyReport::CColInfo::eLeft},
{"Edit2", 27, CEasyReport::CColInfo::eLeft}
};
"edit1"這個代表的是列名,27代表的是列的寬度,CEasyReport::CColInfo::eLeft指的是左對齊。SetDataCols的第2個參數(shù)指的是結(jié)構(gòu)體里項的數(shù)目。第3個參數(shù)是指 是否隱藏列名。當為TURE時隱藏列名,FALSE不隱藏列名。
使用示例:m_Report.SetDataCols(s_ColsA,4,TRUE);
(4)void AtTab(int,const char *,bool bHIdeBox=false,int iCustomHeight=0);
功能:設(shè)置某列的文本內(nèi)容
參數(shù)簡介:
第1個參數(shù)指的是要加入的列的索引(指的是CColInfo結(jié)構(gòu)體里的項的索引值。)
第2個參數(shù)指的是要加入此列下的內(nèi)容字符串。
第3個參數(shù)指是否顯示文本外的矩形框,TRUE時不顯示,FALSE顯示。
第4個參數(shù)指此項的高度
int AtTab(int,CStringArray&);
功能:為預覽添加子列
參數(shù)簡介:
第1個參數(shù)指的是要加入的列的索引(指的是CColInfo結(jié)構(gòu)體里的項的索引值。)
第2個參數(shù)指的是子列的內(nèi)容
void AtTab(int,CString strPath,CWnd *pRc);
功能:為打印預覽添加圖片
參數(shù)簡介:
第1個參數(shù)是指的是要加入的列的索引(指的是CColInfo結(jié)構(gòu)體里的項的索引值。)
第2個參數(shù)是指圖片的路徑。
第3個參數(shù)是一個為了實現(xiàn)重載區(qū)分的指針(備用指針可為以后要獲得某些控件的指針做準備)
9. void NextRow(int iAdjustHeight=0,BOOL Showline=FALSE);
功能:移到下一行
參數(shù)簡介:
第1個參數(shù)指的是移動的高度
第2個參數(shù)指是否顯示橫線,TRUE顯示橫線,FALSE不顯示橫線。
8.void GetGroupTopLeft(int index);
功能:獲得某一時刻矩形左上角的坐標
參數(shù)簡介:
CEasyReport類里的數(shù)據(jù)成員m_gRect矩形數(shù)組的中某一元素的索引
void GetGroupRightBottom(int index,BOOL bAdd=TRUE);
功能:獲得某一時刻矩形右下角的坐標
參數(shù)簡介:
第1個參數(shù)指CEasyReport類里的數(shù)據(jù)成員m_gRect矩形數(shù)組的中某一元素的索引
第2個參數(shù)指 是否獲得右下角坐標 如果為FALSE 則不獲得,反之,則獲得。
int GetLastObjectRect(CRect & rectGet);
功能:獲得最后對象一個矩形的值
參數(shù)簡介:要獲得的矩形的值
9. void End();
功能:預覽結(jié)束
使用示例:m_Report.End();
10. void GotoPage(int inPage);
功能:預覽界面跳轉(zhuǎn)
參數(shù)簡介:
要跳轉(zhuǎn)到的頁面的索引,為0時,跳轉(zhuǎn)到第1個頁面。
使用示例:m_Report.GotoPage(0);
(注意:當m_Report.SetCompanyName(”xyz”);調(diào)用后再調(diào)用m_Report.Start();
表示打印預覽定制開始,m_Report.End();表示打印預覽定制結(jié)束,在這2個函數(shù)(start和End函數(shù))之間調(diào)用AtTab,NextRow等這些函數(shù),在m_Report.End();語句后加m_Report.GotoPage(0);就可以了)
此打印預覽構(gòu)架靈活,擴展能力強,歡迎相關(guān)單位進行報表相關(guān)外包項目合作。