如何在VC++下動態調整水晶報表圖片的大小

        我用的是VS2005中的內嵌水晶報表,在採用拉模式下,我們可以將數據庫中的大字段(Access是ole,Oracle是blob,SQL Server是image)直接拉至水晶報表相應位置並顯示出來。但是這種方法有一個很嚴重的缺陷,那就是預設大小是無法改變的。在對象格式中,“圖片大小”選項卡中圖片寬、高是沒有公式可以編輯的,這樣如果數據庫中保存的圖片和預設大小不相同,就產生變形,爲了解決這個問題,我在網上找了很長時間,也沒有好的簡單辦法,在運行時動態改變圖片大小看來是唯一解決途徑了。

       軟件環境:WinXP/VS2005 VC++/內嵌水晶報表/SQL Server

       解決步驟:
       一、VC++中使用水晶報表的一般步驟,如不會請看:http://blog.csdn.net/memory_xj/archive/2008/04/16/2296970.aspx

       二、再增加一個類成員變量:
      ISectionsPtr m_Sections;       //水晶報表的節接口

       三、增加一個類成員函數:
ISectionPtr CRptDialog::GetReportSection(int SectionNum)
      // 函數名:GetReportSection
      //用途:通過節下標,得到相應的節接口ISectionPtr
      //SectionNum爲節下標,從1(報表布眉)開始,以此類推,得到節接口
      //作者:青蛙王子
{
   ISectionPtr pSection = NULL;

    VARIANT var;
    VariantInit (&var);
    var.vt = VT_I2;
    var.lVal = SectionNum;

    HRESULT hr = m_Sections->get_Item(var, (ISection**) &pSection);

    ASSERT(SUCCEEDED(hr));
    VariantClear(&var);
    return pSection;
}

      四、添加以下代碼,我們的目標是動態改變第3節(即詳細資料a節)中的一個對象名爲xjaaagzimage1的數據庫圖片的寬和高。
      try{
  this->m_Application.CreateInstance(__uuidof(Application));
  m_Report = m_Application->OpenReport("d://zjA4.rpt");
  //m_Report->SetReportVariableValue(_bstr_t("xjID"), _variant_t((m_pView->GetDocument()->ReadXjID()))); //這種方法無效,控件不能顯示

  //向水晶報表中傳遞參數xjID
  m_Report->ParameterFields->GetItemByName("xjID")->AddCurrentValue(_variant_t((short)10));   
  
  //因爲小結管柱圖是直接從數據庫圖像字段中顯示,長寬是設計時預設固定的,也沒有公式編輯,沒有天理哪!
  HRESULT hr = m_Report->get_Sections((ISections**) &m_Sections);
  ASSERT(SUCCEEDED(hr));
  ISectionPtr pSection = GetReportSection(3);  //得到第三節(即詳細資料a)的接口指針
  IReportObjectsPtr pReportObjects = NULL;
  IReportObjectPtr pReportObject = NULL;
  hr = pSection->get_ReportObjects((IReportObjects**)&pReportObjects); //得到詳細資料a節內所有對象接口
  ASSERT(SUCCEEDED(hr));

  VARIANT var;
  VariantInit(&var);
  var.vt = VT_I2;

  long objCount = 0;
  pReportObjects->get_Count(&objCount); //得到對象數目
  for (long i = 1; i <= objCount; i++)  //水晶報表對象數組下標是從1開始(應該是普遍現象),不能想當然地從0開始,否則會有異常
  {
   var.lVal = i;
   pReportObjects->get_Item(var, (IDispatch**)&pReportObject);
   //得到對象名稱,如果是管柱圖xjaaagzimage1,就將長寬進行設置
   BSTR objNameBSTR;
   pReportObject->get_Name(&objNameBSTR);  //得到對象名稱
   CString sObjName(objNameBSTR);
   SysFreeString(objNameBSTR);
   if (sObjName == "xjaaagzimage1")      //找到對象(用CompareNoCase是否更好?),就設置其寬和高,注意它好象是用VC++編寫的,模式是MM_HIMETRIC即1mm=100水晶報表的度量單位是緹,緹(1釐米=567緹,1英寸=1440緹,1磅=20緹,1像素=15緹)
   {
    pReportObject->put_Width(576);   //1cm寬
    pReportObject->put_Height(576); //1cm高
   }
   else
   {
    continue;
   }
  }
 //設置完畢,繼續水晶報表操作的一般步驟

//設置數據源,注意jbServer是我的ODBC中的DSN名稱。  
m_Report->Database->Tables->Item[1]->SetLogOnInfo("jbServer","jianbong","jb_designer","zcgys");
  m_Report->put_ReportAuthor((_bstr_t)"青蛙王子");
  m_pRptViewer.put_ReportSource(m_Report);
  m_pRptViewer.put_EnableGroupTree(FALSE);
  m_pRptViewer.Refresh();
  m_pRptViewer.ViewReport(); 
 }
 catch(...)
 {
 }

好了,按下F5運行一把吧,祝你成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章