我们想在word中插入ActiveX控件,以显示一个图片,比如一个公章。公章不同,图片肯定就不同了,所以肯定不能当资源加入到控件中。那么这个公章图片如何随这个控件插入word中,并且如何在控件的OnDraw函数中绘制出来那?

解决方案 »

  1.   

    可以在ActiveX里面从你的网站下载图片么?
      

  2.   

    需要整理思路:1.图片的存储
    ATL存储说明:ATL控件是有存储机制的,请查看流存储部分。所有数据包括变量、图片等所有可以二进制的东西都可以转换为流,然后在ATL控件保存时将流保存。
    图片转换为流:取图片的二进制存储为流。
    注意:此过程需要重载ATL的保存方法Save(LPSTREAM pStm, BOOL fClearDirty),在此方法中运行类似下面的代码:
    //得到图片流
    ..........
    //存储流,CSignCtrl为控件类名,pStm为流LPSTREAM
    hRet = IPersistStreamInitImpl<CSignCtrl>::Save(pStm,fClearDirty);
    2.显示
    说明:其实这个过程中将流解析还原成原数据的过程。解析完成后,还原成原来的图片。
    注意:此过程需要重载ATL的Load(LPSTREAM pStm)方法,在此方法中实现类似下面的代码:
    //解析流为图片
    .....
    //加载
    hRet = IPersistStreamInitImpl<CSignCtrl>::Load(pStm);

    CImage可以实现流和图片之间的相互转换。希望提供的信息对你有用!
      

  3.   

    补充一点:在下次重新打开WORD文件时,由于在控件加载时已经将流转换为图片,所以真正的图片显示过程是在OnDraw中。
    在第一次盖章时,是直接将图片加载在CImage中,然后调用下面的方法://触发控件重绘事件,会自动调用OnDraw。
    void CSignCtrl::InvalidData(bool bDataDirty, bool bViewDirty)
    {
    if (bViewDirty)
    {
    FireViewChange();
    SendOnDataChange();
    }
    if (bDataDirty)
    {
    SetDirty(TRUE);
    }
    }