最近项目中需要使用到水晶报表,在Win32工程中使用Direct2D来呈现,百度谷歌查找了很多资料发现水晶报表在VC中应用的相关资料不多,所以这里共享下给有需要的朋友。
首先导入水晶报表控件,因为VS2010开始就不再自带水晶报表控件,所以需要自己去下载安装crystal reports for visual studio 2010,百度一下应该就能找到,在VS2012中照样能用。安装之后找到安装目录下的craxddrt.dll,根据路径导入。因为使用的ADO连接的数据库,这里一并写上代码:
#import "..\\CrystalReports\SAP BusinessObjects Enterprise XI 4.0\win32_x86\craxddrt.dll" no_namespace rename ("FindText" , "FindMyText" ) rename ("EnumFontFamilies" , "MyEnumFontFamilies" )
using namespace CrystalActiveXReportViewerLib13;
#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename ("EOF" , "EndOfFile" )
在这里我使用了ATL窗口来当容器导入和打开水晶报表,然后通过抓取ATL窗口DC生成D2DBitmap在我的工程中呈现,第一步创建ATL窗口打开*.rpt文件,并使用ADO连接现有数据库,
private
CAxWindow m_WindowContainer;
CComPtr<CrystalActiveXReportViewerLib13::ICrystalReportViewer12> m_pCrytalReporterViewer;
IApplicationPtr m_Application;
IReportPtr m_Report;
RECT m_rcAxWindow;
HWND m_hwndAtlAxWinMain;
_ConnectionPtr m_ADOConnectionPtr;
_RecordsetPtr m_ADORecordsetPtr;
_CommandPtr m_ADOCommandPtr;
HRESULT hr = S_FALSE ;
try
{
m_rcAxWindow.left = 0 ;
m_rcAxWindow.top = 0 ;
m_rcAxWindow.right = m_rcAxWindow.left + ::GetSystemMetrics (SM_CXSCREEN )* 0.57 f;
m_rcAxWindow.bottom = m_rcAxWindow.top + ::GetSystemMetrics (SM_CYSCREEN )* 0.57 f;
AtlAxWinInit ();
RECT rcClient = { m_rcAxWindow.left, m_rcAxWindow.top, m_rcAxWindow.right - m_rcAxWindow.left,m_rcAxWindow.bottom - m_rcAxWindow.top};
LPCTSTR p=L "CrystalReports13.ActiveXReportViewer.1" ;
m_hwndAtlAxWinMain = m_WindowContainer.Create (g_hViewWindow, rcClient, p, WS_POPUP |WS_VISIBLE );
if (!m_hwndAtlAxWinMain)
return FALSE ;
MoveWindow (m_hwndAtlAxWinMain,m_rcAxWindow.left-1000 , m_rcAxWindow.top, m_rcAxWindow.right - m_rcAxWindow.left,m_rcAxWindow.bottom - m_rcAxWindow.top,FALSE );
hr = m_WindowContainer.QueryControl (__uuidof(ICrystalReportViewer12 ),(void**)&m_pCrytalReporterViewer);
char tempRptPath[ARRAY_MAX ] = {
0 };
WCHAR tempSrcFile[ARRAY_MAX ]= {
0 };
WCHAR tempDBIP[ARRAY_MAX ] ={
0 };
WCHAR tempDBName[ARRAY_MAX ] ={
0 };
WCHAR tempDBUser[ARRAY_MAX ] ={
0 };
WCHAR tempDBPWD[ARRAY_MAX ] ={
0 };
strca