第一个问题:
我需要在vc程序中使用水晶报表,但是我不能打开现有的报表,代码如下:
变量定义:
//水晶报表变量IApplicationPtr m_Application;IReportPtr m_Report;//水晶报表控件变量,在对话框中加入该控件CCrystalReportViewer9 m_CRViewer1; 
程序执行
this->m_Application.CreateInstance(__uuidof(Application));
m_Report=m_Application->OpenReport("C:\\Report1.rpt");
     但是我在open 一个rpt文件的时候发现了错误!不知道怎么解决,编译的时候没有任何错误,但是执行的时候就是由非法操作,该rpt文件存在,并且可使用、打开。为什么在这里不能用?请帮忙!
第二个问题:
      我的代码不能进入消息处理函数。
   RESOURCE.H
        #define ID_STARTBUT                     10000
        #define ID_ENDBUT                       10010    
   testdlg.h
        afx_msg void OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult);
   testdlg.cpp
         消息响应部分
         BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
ON_NOTIFY_RANGE( NM_DBLCLK, ID_STARTBUT, ID_ENDBUT,OnFileMenuItems )
         END_MESSAGE_MAP()  
         动态按钮的产生部分
         for (int i=10000;i<=10010;i++)
{ str.Format("%d",i);

DWORD dwStyle = WS_CHILDWINDOW | WS_VISIBLE | BS_PUSHBUTTON;

m_hButton = ::CreateWindow("BUTTON",TEXT(str),dwStyle,
100*j,0,70,40,this->m_hWnd,NULL,AfxGetInstanceHandle(),(LPVOID)i);
j++;
::ShowWindow(m_hButton,SW_SHOW);
}
         按钮的id和ID_STARTBUT,ID_ENDBUT是对应的,而且在按钮的cation上可以看到了
                消息处理部分:
        void CTestDlg::OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult)
{ CString temp;
temp.Format("%d",nID);
AfxMessageBox(temp);
}          
           就是这一部分,怎么也不能进行处理,不知道是哪里出了问题
           难道我在定义的时候资源的时候,一定要连续的存在的?如果我需要定义30个按钮,就要定义30个资源变量?

解决方案 »

  1.   

    水晶报表在VC++6.0中的简单使用方法(转载)水晶报表是一个报表设计开发的强大工具,功能强大,设计灵活,在水晶报表光盘中只提供了一个完全动态生成报表的例子,使用繁琐。现介绍其在VC++6.0中的简单使用方法。编译环境:VC++6.0 sp5 、Windows 2000 Server sp3 (en)。
    一、导入水晶报表使用的动态联接库:根据实际修改文件路径。
    #import "C:\Documents and Settings\Administrator\桌面\cr\craxdrt9.dll" no_namespace二、定义接口指针变量
    //水晶报表变量
    IApplicationPtr m_Application;
    IReportPtr m_Report;//水晶报表控件变量,在对话框中加入该控件
    CCrystalReportViewer9    m_CRViewer1;三、具体实现步骤
    //实例化m_Application
    m_Application.CreateInstance (__uuidof(Application));//获取m_Report变量
    //staff.rpt为通过向导建立的报表文件,数据库采用SQL Server 7.0
     m_Report =m_Application->OpenReport ("C:\\Documents and Settings\\Administrator\\桌面\\cr\\debug\\staff.rpt");//设置报表标题
    m_Report->put_ReportTitle (_bstr_t("Title"));//设置数据库连接变量
    //数据库服务器(local),数据库名staff,用户名sa,密码sa
    m_Report->Database ->Tables ->Item [1]->SetLogOnInfo("(local)","staff","sa","sa");//设置检索SQL命令
    m_Report->put_SQLQueryString ((_bstr_t)"select * from person where id<'4' order by id");//不显示重复字段
     m_Report->PutEnableSelectDistinctRecords (TRUE);//设置检索条件,采用水晶报表语法,功能同设置检索SQL命令
    m_Report->PutRecordSelectionFormula ((_bstr_t)"{person.id}='1'");//设置报表作者
    m_Report->PutReportAuthor ("xiaojin");//将m_Report与报表控件连接
    m_CRViewer1.SetReportSource(m_Report);//显示报表工具条
    m_CRViewer1.SetDisplayToolbar (TRUE);//不显示报表左边的分组树
    m_CRViewer1.SetDisplayGroupTree (FALSE);//不显示控件边框
    m_CRViewer1.SetDisplayBorder (FALSE);//刷新数据
    m_CRViewer1.Refresh ();//显示报表内容
    m_CRViewer1.ViewReport(); 这样,漂亮的水晶报表就显示出来了。程序异常处理部分省略,请自行加入。用的是水晶报表8.0,需做一些改动。craxdrt9.dll改为craxdrt.dll,m_CRViewer1.Refresh ();去掉。另外9.0的OpenReport与8.0的有些不同。代码如下:
    IApplicationPtr m_Application;
    IReportPtr m_Report;
              VARIANT dummy;
    VariantInit (&dummy);
    dummy.vt = VT_EMPTY;
    m_Application.CreateInstance (__uuidof(Application));
    m_Report = m_Application->OpenReport("d:\\my document\\ip.rpt", dummy);
    m_view.SetReportSource(m_Report);
    // m_view.Refresh();
    m_view.ViewReport();
      

  2.   

    难道我的按钮不能动态生成吗?如果按照你的说法,我的窗体上有几个按钮在程序设计的时候就要计划好,这个怎么可能呀?而且在我的代码中,id并不是没有,而是createwindows的时候指定的,这样也不行?一定要写道resource.h中?