锐英源软件,图文混排FormView打印预览项目介绍

来源:百度文库 编辑:神马文学网 时间:2024/04/29 13:09:46
图文混排FormView
打印预览项目技术文档
1.简介
在VC6里,CFormView的外观和对话框CDialog差不多,上面可以直接放置各类子控件窗口,交互形式是以窗口模式进行。这和其它视图风格完全不一样。客户项目是一类医院的项目,想把CFormView子窗口里的图片和文字内容进行合理的预览和打印。
所见即所得预览和打印是窗体应用程序开发里经常用到的功能,也是一个不太容易掌握的功能,我们灵活使用了codeproject上提供的EasyReport开源项目,进行功能扩展,下面是实现特点:
u       实现了图文混排的预览和打印。
u       实现了根据打印纸宽度自适应的预览和打印。
u       预览框架和原有的CFormView不冲突。
u       系统地解决了CDC映射模式问题。
u       预览窗口功能完整。
下面是CFormView的显示截图:
下面是预览的截图:
2.代码移植说明
1.       找到3张bmp格式图片放到当前工程目录下,其图片名分别为bitmap1.bmp, bitmap2.bmp,bitmap3.bmp.
2.       移植过程:把CSampleReportView类,CMyFrame类,CEasyReport类添加到你想要的工程里,注意包含头文件。〈工程->添加到工程->文件->选择类的头文件和源文件,点添加即可。〉
3.       假如你的工程名是Test,在应用程序类(就是CTestApp类的源文件里)的CSampleReportApp theApp;下面加入这2句CSingleDocTemplate* m_pTemplate;
BOOL m_bPrintPreview;
在CTestApp类的头文件里加入
extern CSingleDocTemplate* m_pTemplate;
extern BOOL m_bPrintPreview;在你的打印预览按钮的响应函数所在类的头文件里加入函数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;
}
在打印预览的响应函数里加入:OnPreviewCreate()即可。
4.       实现机制:子框架里用单文档模板创建视图的方法实现了基本打印框架。
5.       打印预览内容的实现主要靠CEasyReport这个类提供的方法来实现的。
6.       在CSampleReportView类的InitEasyReport函数里加预览内容定制
7.       首先CSampleReportView类里添加一个CEasyReport的对象名为m_Report.通过个对象调用CEasyReport类提供的外部方法
8.       CEasyReport里的函数简介
(1)SetCompanyName(const char *inStr)设置预览时标题的名字,
使用方法:传入一个字符串即可。
例如:m_Report.SetCompanyName(”xyz”);就把预览时的标题名字设置成xyz了
(2)Start()函数指示了预览开始,在这个函数里做一些初始化工作,m_Report.Start()|这样就调用了。
(3) void    SetDataCols(CColInfo *inCols = NULL, int nCols=0,bool bHideColName=false);  设置列的数目和宽度,第一个参数是一个结构体的指针,此结构体的初始化形式如下:
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个参数指的是结构体里项的数目。第3个参数是指   是否隐藏列名。当为TURE时隐藏列名,FALSE不隐藏列名。
使用示例:m_Report.SetDataCols(s_ColsA,4,TRUE);
(4)void   AtTab(int,const char *,bool bHIdeBox=false,int iCustomHeight=0);
功能:设置某列的文本内容
参数简介:
第1个参数指的是要加入的列的索引(指的是CColInfo结构体里的项的索引值。)
第2个参数指的是要加入此列下的内容字符串。
第3个参数指是否显示文本外的矩形框,TRUE时不显示,FALSE显示。
第4个参数指此项的高度
int   AtTab(int,CStringArray&);
功能:为预览添加子列
参数简介:
第1个参数指的是要加入的列的索引(指的是CColInfo结构体里的项的索引值。)
第2个参数指的是子列的内容
void    AtTab(int,CString strPath,CWnd *pRc);
功能:为打印预览添加图片
参数简介:
第1个参数是指的是要加入的列的索引(指的是CColInfo结构体里的项的索引值。)
第2个参数是指图片的路径。
第3个参数是一个为了实现重载区分的指针(备用指针可为以后要获得某些控件的指针做准备)
9.       void NextRow(int iAdjustHeight=0,BOOL Showline=FALSE);
功能:移到下一行
参数简介:
第1个参数指的是移动的高度
第2个参数指是否显示横线,TRUE显示横线,FALSE不显示横线。
8.void GetGroupTopLeft(int index);
功能:获得某一时刻矩形左上角的坐标
参数简介:
CEasyReport类里的数据成员m_gRect矩形数组的中某一元素的索引
void GetGroupRightBottom(int index,BOOL bAdd=TRUE);
功能:获得某一时刻矩形右下角的坐标
参数简介:
第1个参数指CEasyReport类里的数据成员m_gRect矩形数组的中某一元素的索引
第2个参数指 是否获得右下角坐标 如果为FALSE 则不获得,反之,则获得。
int GetLastObjectRect(CRect & rectGet);
功能:获得最后对象一个矩形的值
参数简介:要获得的矩形的值
9. void        End();
功能:预览结束
使用示例:m_Report.End();
10.     void GotoPage(int inPage);
功能:预览界面跳转
参数简介:
要跳转到的页面的索引,为0时,跳转到第1个页面。
使用示例:m_Report.GotoPage(0);
(注意:当m_Report.SetCompanyName(”xyz”);调用后再调用m_Report.Start();
表示打印预览定制开始,m_Report.End();表示打印预览定制结束,在这2个函数(start和End函数)之间调用AtTab,NextRow等这些函数,在m_Report.End();语句后加m_Report.GotoPage(0);就可以了)
3.前景
此打印预览构架灵活,扩展能力强,欢迎相关单位进行报表相关外包项目合作。