精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
在VC6里,CFormView的外观和对话框CDialog差不多,上面可以直接放置各类子控件窗口,交互形式是以窗口模式进行。这和其它视图风格完全不一样。客户项目是一类医院的项目,想把CFormView子窗口里的图片和文字内容进行合理的预览和打印。
所见即所得预览和打印是窗体应用程序开发里经常用到的功能,也是一个不太容易掌握的功能,我们灵活使用了codeproject上提供的EasyReport开源项目,进行功能扩展,下面是实现特点:
下面是CFormView的显示截图:
下面是预览的截图:
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()即可。
(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个参数是一个为了实现重载区分的指针(备用指针可为以后要获得某些控件的指针做准备)
功能:移到下一行
参数简介:
第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);就可以了)
此打印预览构架灵活,扩展能力强,欢迎相关单位进行报表相关外包项目合作。