我用的是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運行一把吧,祝你成功!