本文转自:http://blog.csdn.net/memory_xj/archive/2008/04/24/2322071.aspx ,原作者:青蛙王子


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

【转】如何在VC++下动态调整水晶报表图片的大小相关推荐

  1. 如何在VC++下动态调整水晶报表图片的大小

    我用的是VS2005中的内嵌水晶报表,在采用拉模式下,我们可以将数据库中的大字段(Access是ole,Oracle是blob,SQL Server是image)直接拉至水晶报表相应位置并显示出来.但 ...

  2. 水晶报表自定义纸张大小打印 (转)

    水晶报表自定义纸张大小打印 (Crystal Report Print with custom paper size) 水晶报表查看器CrystalReportViewer自带打印功能,调用当前系统默 ...

  3. VC下加载多种格式图片的方法总结

    From: http://www.cnblogs.com/Daywei/archive/2011/03/19/1988848.html 尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元 ...

  4. 动态更改水晶报表背景图片

    水晶报表是没有什么属性可以直接对其背景图片进行设置的,更别说对其动态改变了,下午受一同事启发,我们可以通过更新数据源的方式来间接的对水晶报表背景图片进行动态设置. 还是采用PUSH模式(这种情况估计也 ...

  5. 如何动态创建水晶报表

    现在很多xdjm在问这个问题,其实网上也有相关的这样的文章. 比人不才,弄各简单的例子,工大家参考.从报表想到建的就不说了,只说一下用dataset动态生成数据集再关联到报表的情况. 假设我要现在美国 ...

  6. Opencv调整运行窗口图片的大小

    Opencv在运算时显示图片问题 总结在opencv中,图片显示的问题.简要解决图片窗口和图片大小的问题. namedWindow("窗口名",1);//创建窗口 imshow(& ...

  7. opencv笔记(三)——调整运行窗口图片的大小

       总结在opencv中,图片显示的问题.简要解决图片窗口和图片大小的问题. namedWindow("窗口名",1);//创建窗口imshow("窗口名", ...

  8. 水晶报表设置纸张大小

    附 自定义纸张的设置方法: 点开始-→点"设置"中的"控制面板"-→选择"打印机和传真"-→点主菜单中的"文件" -→选 ...

  9. python窗口大小动态变化_如何在tkinter中动态调整窗口大小以“自动调整”其内容?...

    我目前正在使用tkinter开发一个GUI,它允许用户在不同的框架之间导航.我的代码结构基于this user response.在 我现在的问题是在框架发生变化时自动调整tkinter的窗口以适应其 ...

最新文章

  1. ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
  2. Linux-find命令
  3. 视频讲解——零基础玩转微信小程序
  4. linux初始化root密码
  5. 图神经网络(一)图信号处理与图卷积神经网络(5)图卷积神经网络
  6. Java 8中的instanceof运算符和访客模式替换
  7. MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...
  8. 2018第二届河北省大学生程序设计竞赛题解
  9. stream+springmvc实现文件断点续传
  10. 小说搜索站快速搭建:2.内容页解析
  11. Cowrie 部署 SSH 蜜罐
  12. android调试+及JNI相关
  13. ?php if ($modules) { ?,phpStudy安装鲶鱼CMS怎样开启伪静态
  14. 132.Function Handing 函数
  15. 华为c199刷android原生,华为C199刷机教程(强刷官方固件rom包)
  16. 计算机课英语怎么读音标,【英语课堂】48个国际音标表及发音详解图
  17. 【工艺】 CNC(数控机床)加工工艺
  18. mybatis学习4
  19. dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐
  20. 使用unity3D实现全景图像查看器

热门文章

  1. 词向量模型之CBOW
  2. C++剑指offer:[POJ]2631 Roads in the North - 用树形DP的方式求出一棵树的直径
  3. Xcode5提示模拟器未安装此应用程序
  4. 财务rpa机器人 快速实现企业财务自动化
  5. 09花冠钥匙计算机电路图,丰田花冠轿车中控集成ECU故障导致中控无法上锁的故障检修案例...
  6. 如何用C#求两数组的交集和并集
  7. ROS2放弃指南3:webots简单使用
  8. 电脑上的Eclipse自动提示功能突然消失
  9. c++成员函数的调用——常成员函数
  10. CC2640R2F BLE5.0 蓝牙协议栈信道选择算法#2(CSA#2)