新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 在VC中调用WORD(显示,修改,存盘,运行宏) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5515 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 在VC中调用WORD(显示,修改,存盘,运行宏) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 在VC中调用WORD(显示,修改,存盘,运行宏)

    在VC中调用WORD(显示,修改,存盘,运行宏)
      


    (1)使用AppWizard创建一个新的MFC AppWizard(EXE)工程,命名为"office"  
    (2)选择单文档视图(SDI)结构,在第3步中需要选中Container,以提供容器支持,并且选中active document container 其它都为默认

    (3)在View菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 在Office目录中选中Microsoft Word 97/2000 类型库Word8.olb或Word9.olb,选中application,document,_document。单击ok

    (4)给COfficeCntrItem添加一方法。GetIDispatch()

    其源码如下:

      ASSERT_VALID(this);  
    ASSERT(m_lpObject != NULL);   
    LPUNKNOWN lpUnk = m_lpObject;   
    Run();   
    LPOLELINK lpOleLink = NULL;  
    if (m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink) == NOERROR)   
    {   
      ASSERT(lpOleLink != NULL);   
      lpUnk = NULL;       
      if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)    
      {    
       TRACE0("Warning: Link is not connected!/n");    
       lpOleLink->Release();    
       return NULL;    
      }   
      ASSERT(lpUnk != NULL);   
    }    
    LPDISPATCH lpDispatch = NULL;  
    if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)!=NOERROR)   
    {
        TRACE0("Warning: does not support IDispatch!/n");   
      return NULL;
      
    }
    ASSERT(lpDispatch != NULL);  
    return lpDispatch;
    (5)。在officeView.h添加#include "msword8.h"

    (6)。修改void COfficeView::OnInsertObject(),源码如下:

    BeginWaitCursor();

    COfficeCntrItem* pItem = NULL;
    TRY
    {
      // Create new item connected to this document.
      COfficeDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      pItem = new COfficeCntrItem(pDoc);
      ASSERT_VALID(pItem);

      // Initialize the item from the dialog data.
    /* if (!dlg.CreateItem(pItem))
       AfxThrowMemoryException();  // any exception will do
      ASSERT_VALID(pItem);*/
       CLSID clsid; //
      if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))
       AfxThrowMemoryException();
      
      if(!pItem->CreateNewItem(clsid))
      /*if(!pItem->CreateFromFile (filename,clsid)) */
       AfxThrowMemoryException();
      ASSERT_VALID(pItem);
      
      pItem->Activate (OLEIVERB_SHOW,this);
      

      ASSERT_VALID(pItem);
             m_pSelection = pItem;   // set selection to last inserted item
      pDoc->UpdateAllViews(NULL);
      // As an arbitrary user interface design, this sets the selection
      //  to the last item inserted.

      // TODO: reimplement selection as appropriate for your application

      m_pSelection = pItem;   // set selection to last inserted item
      pDoc->UpdateAllViews(NULL);
    }
    CATCH(CException, e)
    {
      if (pItem != NULL)
      {
       ASSERT_VALID(pItem);
       pItem->Delete();
      }
      AfxMessageBox(IDP_FAILED_TO_CREATE);
    }
    END_CATCH

    EndWaitCursor();

    (7)重载ID—FILE—SAVE,

    void COfficeView::OnFileSave()
    {
    // TODO: Add your command handler code here
      TRY{
         LPDISPATCH lpDisp;
      
      lpDisp = m_pSelection->GetIDispatch();

        Documents docs;
      
      _Application app;
      
      _Document mydoc;
      Documents my;

      mydoc.AttachDispatch (lpDisp,TRUE);
      app=mydoc.GetApplication ();
        /*   app.Run ("Macro3");*/
         mydoc.Activate ();
      BOOL password=mydoc.GetHasPassword ();
      mydoc.SetPassword ("love");
      password=mydoc.GetHasPassword ();  
      COleVariant vFalse((short)FALSE);
      mydoc.SaveAs (COleVariant("c://love.doc"),vFalse,vFalse, COleVariant(""),vFalse,
       COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
      
    }
    CATCH(CException, e)
    {
            }
    END_CATCH
    }

    bulid,click insert object,and edit ,and save.maybe run macro.


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/25 13:26:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    去掉word的常用,格式工具栏

    在View菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 在Office目录中选中Microsoft Word 97/2000 类型库MSO9.DLL,选中_CommandBars,CommandBar。单击ok

    在officeView.h添加#include "mso9.h"

    添加方法:

    int CQsofficeView::hidetoolbar(BOOL hide)
    {
       TRY{
      LPDISPATCH lpDisp;   
      lpDisp = m_pSelection->GetIDispatch();   
      Documents docs;  
      _Application app;   
      _Document mydoc;
      _CommandBars mybars;
            CommandBar  mybar;
      mydoc.AttachDispatch (lpDisp,TRUE);
      app=mydoc.GetApplication ();       
      mydoc.Activate ();

      mybars.AttachDispatch (mydoc.GetCommandBars (),TRUE);
         mybar.AttachDispatch (mybars.GetItem (COleVariant(/*(short)1)*/"Standard")),TRUE);
      mybar.SetVisible (hide);
       mybar.AttachDispatch (mybars.GetItem (COleVariant(/*(short)2*/"Formatting")),TRUE);
      mybar.SetVisible (hide);
      CMDIFrameWnd * pwnd=(CMDIFrameWnd *)AfxGetMainWnd();
            pwnd->GetActiveFrame ()->UpdateWindow ();

    }
    CATCH(CException, e)
    {
        TCHAR errormsg[255];
      e->GetErrorMessage (errormsg,255,NULL);
    }
    END_CATCH
    return 0;
    }

    bulid,insert object后,便可以调用hidetoolbar了。

    我的经验:先用WORD的宏录制功能录制好宏后,选择工具下宏下VB编辑器看它的源码然后再根据msword.h和mso*.h的相应类来实现。

    在VC中调用WORD(显示,修改,存盘,运行宏)一在这儿。

    http://www.csdn.net/develop/article/10/10570.shtm

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/25 13:28:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    调用word的各种对话框翻页等

    有了这个,可以替换掉word的菜单了:)也就是说,你可以完全不把word框架显示出来就可以完全实现WORD的功能了。

    在View菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 在Office目录中选中Microsoft Word 97/2000 类型库Word8.olb或Word9.olb,选中Dialog,Dialogs,Selection。单击ok

    调用word的对话框如下:

       TRY{
      LPDISPATCH lpDisp;  
      if (m_pSelection)
      {
       lpDisp = m_pSelection->GetIDispatch();   
       Documents docs;  
       _Application app;   
       _Document mydoc;  
       mydoc.AttachDispatch (lpDisp,TRUE);
       app=mydoc.GetApplication ();       
       mydoc.Activate ();  
       Dialogs mydialogs;
       Dialog  mydialog;
       mydialogs.AttachDispatch (app.GetDialogs (),TRUE);
         mydialog.AttachDispatch (mydialogs.Item (112),TRUE);

    /*112是查找替换*/
        mydialog.Show  (COleVariant((short)0));
        mydialog.Execute ();
        mydialog.DetachDispatch ();

       
      }
      }
    CATCH(CException, e)
    {
            /*your pleaser to display error message*/
      TCHAR errormsg[255];
      e->GetErrorMessage (errormsg,255,NULL);
    }
    END_CATCH
    return 0;

    /*在WORD中录制新宏,输入Dialogs(这时会自动出现智能填充随便选择一个然后在其下右键单击定义。可以查看其详细信息。像新建文件是79,打开文件是80,页面设置是178 等等具体的吗?看字面意思了。再不成,就一个一个地试吧。把上面的112替换成你想要的就成了。show(COleVariant((short)0)就是一直显示,直到用户做出选择可以设成你想要的毫秒数。*/

    下面是翻页的具体代码(带COPY&PASTE):

    int CQsofficeView::adjustpage(int oldstartpage, int totalpages,int nowstartpage,BOOL downorup)
    {
       TRY{
      LPDISPATCH lpDisp;  
      if (m_pSelection)
      {
       lpDisp = m_pSelection->GetIDispatch();   
       Documents docs;  
       _Application app;   
       _Document mydoc;  
       mydoc.AttachDispatch (lpDisp,TRUE);
       app=mydoc.GetApplication ();       
       mydoc.Activate ();  
       Selection myselection;
          myselection.AttachDispatch (app.GetSelection (),TRUE);
       myselection.GoTo (COleVariant((short)1),COleVariant((short)2),COleVariant((short)0),COleVariant((short)oldstartpage));
       myselection.MoveDown (COleVariant((short)7),COleVariant((short)totalpages),COleVariant((short)2));            
       myselection.Cut ();
       myselection.GoTo (COleVariant((short)1),COleVariant((short)2),COleVariant((short)0),COleVariant((short)nowstartpage));     
       myselection.Paste ();
       
      }
      }
    CATCH(CException, e)
    {
          /*your pleaser to display error message*/
      TCHAR errormsg[255];
      e->GetErrorMessage (errormsg,255,NULL);
    }
    END_CATCH
    return 0;

    }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/25 13:33:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:26:30

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms