zoukankan      html  css  js  c++  java
  • OpenOffice:在sw模块中插入OLE对象,并调整其大小

    接口:::rtl::OUString SAL_CALL SwXTextDocument::InsertOLERetNameSize(const ::rtl::OUString& aPathName, const float fOleWidth, const float fOleHeight)throw (::com::sun::star::uno::RuntimeException)


    1.当aPathName的值为NULL时,插入的是空白的OLE,插入方法为:

    (1)首先获取插入对象的ID, 然后直接调用CreateEmbeddedObject();

    
    
    svt::EmbeddedObjectRef xObj;
    				uno::Reference < embed::XStorage > xStor = comphelper::OStorageHelper::GetTemporaryStorage();
    				comphelper::EmbeddedObjectContainer aCnt(xStor);
    				::rtl::OUString aName = aCnt.CreateUniqueObjectName();
    				bool bInsert = false;
    
    				uno::Reference < embed::XEmbeddedObject > m_xObj;
                                    //获取插入对象的ID
    				String aServerName = String( ::rtl::OStringToOUString( ::rtl::OString("病历通 3.0 绘图"),RTL_TEXTENCODING_GBK ) ); 
    				SvObjectServerList aServerList;
    				aServerList.FillInsertObjects();
                                    aServerList.Remove( SwDocShell::Factory().GetClassId() );
    				const SvObjectServer* pS = aServerList.Get( aServerName );
                                    //生成一个对象
    				m_xObj = aCnt.CreateEmbeddedObject( pS->GetClassName().GetByteSequence(), aName );
    
    				if ( m_xObj.is() )
    				{
                                        xObj.Assign( m_xObj, embed::Aspects::MSOLE_CONTENT );
    				    bInsert = rSh.InsertOleObject( xObj );
                                    }        
    

     (2) 获取插入对象的ID,然后通过embed::XEmbedObjectCreator对象来生成embed::XEmbeddedObject;

    svt::EmbeddedObjectRef xObj;
    				uno::Reference < embed::XStorage > xStor = comphelper::OStorageHelper::GetTemporaryStorage();
    				comphelper::EmbeddedObjectContainer aCnt(xStor);
    				::rtl::OUString aName = aCnt.CreateUniqueObjectName();
    				bool bInsert = false;
    
                                    //获取插入对象的ID
    				String aServerName = String( ::rtl::OStringToOUString( ::rtl::OString("病历通 3.0 绘图"),RTL_TEXTENCODING_GBK ) ); 
    				SvObjectServerList aServerList;
    				aServerList.FillInsertObjects();
                                    aServerList.Remove( SwDocShell::Factory().GetClassId() );
    				const SvObjectServer* pS = aServerList.Get( aServerName );
                                    uno::Sequence < sal_Int8 > aClass( pS->GetClassName().GetByteSequence() );
    
                                    //生成对象
                                    uno::Reference < embed::XEmbedObjectCreator > xFactory( ::comphelper::getProcessServiceFactory()->createInstance(
                                                    ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.embed.EmbeddedObjectCreator")) ), uno::UNO_QUERY );
                                    uno::Reference < embed::XEmbeddedObject > m_xObj = uno::Reference < embed::XEmbeddedObject >( xFactory->createInstanceInitNew(
                                                                                            aClass, ::rtl::OUString(), xStor, aName,
                                                                                            uno::Sequence < beans::PropertyValue >() ), uno::UNO_QUERY );
    				if ( m_xObj.is() )
    				{
    				    xObj.Assign( m_xObj, embed::Aspects::MSOLE_CONTENT );
    				    bInsert = rSh.InsertOleObject( xObj );
                                    }
    

         总结:其实,通过断点调试可以看出,第一种方法还是通过第二种方法实现的,只是把第二种方法封装了一下。

     2. 调整插入OLE的大小

      (1) 调用sw\source\filter\xml\xmltexti.cxx中的函数: void lcl_setObjectVisualArea( const uno::Reference< embed::XEmbeddedObject >& xObj,
                                                                                                                            sal_Int64 nAspect, const Size& aVisSize,   const MapUnit& aUnit )

      (2)m_xObj->setVisualAreaSize( ...)

       (3)xObj->setVisualAreaSize( ...)

        总结:说到底,以上三个调用函数最终调用的还是OCommonEmbeddedObject类 中的函数
    virtual void SAL_CALL setVisualAreaSize( sal_Int64 nAspect, const ::com::sun::star::awt::Size& aSize )
            throw ( ::com::sun::star::lang::IllegalArgumentException,
                    ::com::sun::star::embed::WrongStateException,
                    ::com::sun::star::uno::Exception,
                    ::com::sun::star::uno::RuntimeException );

  • 相关阅读:
    SPRINGMVC整合SOLR
    solr 嵌套entity 高亮查询
    solr 高级进阶,解决问题
    Solr的主从模式Master-Slave
    Solr8.0速成系列 | Solr客户端常用操作和查询语法 08
    solr 的全量更新与增量更新
    solr8.0.0和tomcat8.5.40的整合,完整版
    设置 Tomcat 的JVM运行内存
    mongo主库地址变更,从库修改数据源IP
    mysql数据表如何导入MSSQL中
  • 原文地址:https://www.cnblogs.com/luow/p/2719462.html
Copyright © 2011-2022 走看看