精华内容
下载资源
问答
  • 创建新word文档五大方法.docx
  • 手动创建新文档方法

    手动创建新文档的方法

    	CWinApp* pApp = AfxGetApp();
    	POSITION curTemplatePos = pApp->GetFirstDocTemplatePosition();
    	if (curTemplatePos != NULL)
    	{
    		CDocTemplate* curTemplate = pApp->GetNextDocTemplate(curTemplatePos);
    		curTemplate->OpenDocumentFile(NULL);
    	}


     

     各个窗体的位置信息被保存在注册表中,名称是通过XXXX.cpp中的SetRegistryKey方法定义的。

    展开全文
  • Qt使用已有模板创建新Word文档

    千次阅读 2018-07-14 22:07:03
    本文主要介绍如何Qt下操作Word

    在这篇帖子中我将详细讲述如何在Qt环境下使用已有Word模板文件创建新的文档,并对模板文档内容填充。目前,我只对替换文字和对表格进行操作进行了介绍,如何在文档插入图片未在本文中提及。

    开发环境

    本文中使用的开发环境是Qt5.10.0。由于本文中的实现方式是通过COM组件操作Word,需要在.pro文件中添加QT += axcontainer,在Qt4的版本中与Qt5是有点区别的,在Qt4中添加CONFIG += qaxcontainer。

    从代码中看过程

    多余的就不说了,具体过程看注释吧。

    WordEngine.h

    #ifndef WORDENGINE_H
    #define WORDENGINE_H
    
    #include <QObject>
    #include <QAxObject>
    #include <QAxWidget>
    
    class WordEngine : public QObject
    {
        Q_OBJECT
    public:
        explicit WordEngine(QObject *parent = 0);
    
    public slots:
        bool open(const QString &file);//打开文档
        void save(const QString &savePath);//保存并关闭文档
    
        void replaceText(const QString &label,const QString &text);//替换文档中标签出的文字
        void alterTableRowCount(const QString &tabel, const int rowCount);//在表个中添加新行
        void fillTableCell(const QString &tabel,const QList<QStringList> &data);//填充表格内容
    
    private:
        QAxWidget *_word;//word主程序
        QAxObject *_workDocument;//工作簿
        bool _isOpen;//文档打开状态
    
        QMap<QString,int> _tabelIndex;//文档中的表格索引,注意word中表格的索引值是从1开始的,这里根据不同的情况单独实现
    };
    
    #endif // WORDENGINE_H
    

    WordEngine.cpp

    #include "WordEngine.h"
    #include "qt_windows.h"
    #include <QMessageBox>
    
    WordEngine::WordEngine(QObject *parent) : QObject(parent)
    {
        _word = NULL;
        _workDocument = NULL;
        _isOpen = false;
    
        /// 初始化表格索引,在word中可以直接获取表格的索引而不是书签来编辑表格内容,
        /// 所以,这里的索引是需要用户手动进行维护的
        _tabelIndex["table1"] = 1;
        _tabelIndex["table2"] = 2;
    }
    
    /// Summary:根据传入的模板文件地址创建新的word文档并打开
    /// parameters:
    ///     file:.dot模板文件的绝对地址,这里只能使用绝对地址,否则找不到文件,并且建议使用QDir::toNativeSeparators()将地址中的'/'转换成'\'
    /// return:
    ///     文档是否打开
    bool WordEngine::open(const QString& file)
    {
        _word = new QAxWidget("word.Application");
        QAxObject *document = _word->querySubObject("Documents");//获取所有打开的文档
        if (!document)
            return false;
    
        document->dynamicCall("Add(QString)",file);//使用模板文件创建新的文档
        _workDocument = _word->querySubObject("ActiveDocument");//激活文档
    
        if (_workDocument)
            _isOpen = true;
        else
            _isOpen = false;
    
        if (!_isOpen)
        {
            QMessageBox box(QMessageBox::Information,QString("提示"),QString("未找到模板文件:%0").arg(file));
            box.addButton(QString("确定"),QMessageBox::AcceptRole);
            box.exec();
        }
    
        return _isOpen;
    }
    
    /// Summary:将文档保存到指定地址,并关闭word程序
    /// parameters:
    ///     savePath:word的保存地址
    void WordEngine::save(const QString &savePath)
    {
        //保存
        if (_isOpen && _workDocument)
        {
            _workDocument->dynamicCall("SaveAs (const QString&)",savePath);
        }
    
        if (_word)
        {
            _word->setProperty("DisplayAlerts",true);
        }
    
        //关闭文档
        if (_workDocument)
        {
            _workDocument->dynamicCall("Close(bool)",true);
            delete _workDocument;
            _workDocument = NULL;
        }
    
        //推出word程序
        if (_word)
        {
            _word->dynamicCall("Quit()");
            delete _word;
            _word = NULL;
        }
    
        _isOpen = false;
    }
    
    /// Summary:替换指定书签处的内容
    /// parameters:
    ///     label:书签名称,这里的书签对应的是在word中的插入->书签
    ///     text:内容
    void WordEngine::replaceText(const QString &label, const QString &text)
    {
        if (!_workDocument)
            return ;
    
        //查找书签
        QAxObject *bookmark = _workDocument->querySubObject("Bookmarks(QString)",label);
        if (bookmark)
        {
            //选定书签,并替换内容
            bookmark->dynamicCall("Select(void)");
            bookmark->querySubObject("Range")->setProperty("Text",text);
            delete bookmark;
        }
    }
    
    /// Summary:调整表格行数,目前只能插入不能删除,在word模板中,在表格中至少需要有一行内容空行,否则在插入新行的时候,数据内容会跟随表头行的格式,有时候导出结果会非常难看
    /// parameters:
    ///     tabel:表格名称
    ///     rowCount:行数
    void WordEngine::alterTableRowCount(const QString &tabel, const int rowCount)
    {
        if (NULL == _workDocument) return;
        QAxObject *table = _workDocument->querySubObject("Tables(int)",_tabelIndex.value(tabel));//获取表格
        if (NULL == table) return;
    
        //获取表格目前的行数
        QAxObject *rows = table->querySubObject("Rows");
        qint32 count = rows->dynamicCall("Count").toInt();
    
        //插入行
        for (int i = count - 1; i < rowCount; ++i)
        {
            rows->querySubObject("Add()");
        }
    }
    
    /// Summary:填充表格内容
    /// parameters:
    ///     tabel:表格名称
    ///     data:内容
    void WordEngine::fillTableCell(const QString &tabel, const QList<QStringList> &data)
    {
        if (NULL == _workDocument) return;
        QAxObject *table = _workDocument->querySubObject("Tables(int)",_tabelIndex.value(tabel));//获取表格
        if (NULL == table) return;
    
        //获取表格目前的行数
        QAxObject *rows = table->querySubObject("Rows");
        qint32 rowCount = rows->dynamicCall("Count").toInt();
    
        //获取表格目前的列数
        QAxObject *columns = table->querySubObject("Columns");
        qint32 columnCount = columns->dynamicCall("Count").toInt();
    
        //当前表格行数小于数据的行数,调整到数据的行数
        if (data.size()>rowCount)
        {
            alterTableRowCount(tabel,data.size());
        }
    
        //填充表格内容
        for (int row = 0; row < data.size(); ++row)
        {
            for (int column = 0; column < data.at(row).size() && column < columnCount; ++column)
            {
                QAxObject *cell=table->querySubObject("Cell(int,int)",row+2,column+1);//获取单元格,注意word中的索引是从1开始的,再加上表头row应该+2
                if(!cell) return;
                cell->dynamicCall("Select(void)");
                cell->querySubObject("Range")->setProperty("Text",data.at(row).at(column));
                delete cell;
            }
        }
    }                       
    

    不足之处

    这种方法读写文档的效率非常低,但是在Qt中Qwidget的派生类都无法在子线程中运行,所以当文件内容比较多的时候我们能做的只有等……或许你有更好的方法,请一定告诉我(_ _)。゜zzZ

    以上就是如何在Qt中创建Word文档并修改word文档内容。如有不明白的地方欢迎留言或通过下面的邮件地址交流,若帖子中有错误的地方同样欢迎留言批评指正,在此谢过路过的各位大神。

    展开全文
  • 如何MFC单文档中创建多视图 基本步骤如下: 1.首先创建一个MFC单文档应用程序。 2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基类为CView。 3.添加一个MFC类CControlForm,...

    如何在MFC单文档中创建多视图


    基本步骤如下:


    1.首先创建一个MFC单文档应用程序。


    2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基类为CView。


    3.添加一个MFC类CControlForm,基类为CFormView,对话框ID默认。


    4.创建一个切分类,如MySplitter,基类为CSplitterWnd(默认基类选项中无此类,自己添加即可)。


    5.在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作)。


    6.重写框架类Cmainframe的OnCreateClient函数,如下:


    //第一次静态切分CreateStatic,一行两列


    if (!m_wndSplitter.CreateStatic(this,1,2)) 


       return FALSE;


    //第二次静态切分(将第一次切分后的第二列再分为2*2)及所有的子视图创建(CreateView函数)。


    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) || 
       !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1))||  !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) || 
       !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) || 
       !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) || 
       !m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240), pContext)) 

       m_wndSplitter.DestroyWindow(); 
       return FALSE; 

    }

    // return CFrameWnd::OnCreateClient(lpcs, pContext);      //注释掉原有的响应函数


    注意:记得在Mainfrm.h中添加以上五个视图类的头文件:


    #include "CControlForm.h"
    #include "TopLView.h"
    #include "TopRView.h"
    #include "BottomLView.h"
    #include "BottomRView.h"


    6. 切分视图完成,结果如下:




    其中,最左的视图为FormView类型,操作类似对话框(可以在Resource-Dialog看到其对应的对话框资源);右边四个的操作则类似普通视图。


    补充内容:


    a. 此时创建的各个子视图之间的分割条可以拖动,以改变视图其大小。如果想固定分割条,则需要重载MySplitter类的鼠标响应函数。可以通过一个Bool型变量来控制是否可以拖动分割条:


    if (Isvisable) //Isvisable在构造函数中已被初始为FALSE
    {
       CSplitterWnd::OnLButtonDown(nFlags, point);
    }


    b. 还可以通过重载MySplitter类的OnDrawSplitter函数来改变分割条的样式。以下为该函数代码:





    #define LP RGB(128,128,128)
    #define RB RGB(192,192,192)


    //如果pDC 为 NULL则仅使分割窗口区域无效
    if (pDC == NULL)
    {
       RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
       return;

    }
    ASSERT_VALID(pDC);


    CRect rc = rect;


    switch(nType) 

    case splitBorder:
      //重画分割窗口边界
       pDC->Draw3dRect(rc,LP,LP);
       rc.InflateRect(-1,-1); 
       pDC->Draw3dRect(rc,RB,RB); 
       return; 
    case splitBox:
       pDC->Draw3dRect(rc,LP,LP);
       rc.InflateRect(-1,-1); 
       pDC->Draw3dRect(rc,LP,LP);
       rc.InflateRect(-1,-1);
       pDC->FillSolidRect(rc,RGB(128,128,128)); 
       pDC->Draw3dRect(rc,RB,RB);
       return; 
    case splitBar: 
       //重画分割条 
       pDC->FillSolidRect(rc,RGB(192,192,192));
       rc.InflateRect(-1,-1); 
       pDC->Draw3dRect(rc,RB,RB);  
       return; 
    default: 
       ASSERT(FALSE); 

    //填充中间的部分
    pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));





    http://hi.baidu.com/mplsfec/blog/item/025b1c63d939fad4e7113ad4.html


    深入分析MFC文档视图结构
    2008-10-16 19:40
    文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过Windows SDK Programming 的学习和经历就直接进行MFC Programming的学习和开发,更是面对一堆的代码不知所措。 


    之于Document/View Architecture,侯捷先生的《深入浅出MFC》一书确实进行了很深入的分析和研究,网络上也有很多在侯捷先生著述的基础上的进一步的文章出现,但是个人觉得这里面有一点瑕疵(仅代表k_eckel浅见):太过深入,这些分析和研究都最终会定位到Windows SDK中窗口的创建过程、MFC中对Document/View Architecture支持所提供的复杂无序的宏等对于没有Windows SDK Programming 经验和经历的学习者和对于MFC不是很熟悉的学习者无异于是徒增烦恼,一个本来就很复杂的问题更加地复杂化了。我的观点是这个过程是必要的,然而不是每个人所必需的,或者说不是每个人在初期学习和绝大多数项目开发中所必需的。我向来对众多的仅仅学会了拖拉点拽就以为会了MFC(侯捷先生在《深入浅出MFC》一书中对这个群体有一个照面,这里不罗嗦)不以为然,但是我依然认为轻量级学习成本是重要的,容易上手,易于接受是一门技术成功或者说有价值的一个很大的决定性因素。因此提供一个轻量级的学习过程对于学习来说是很有必要性的,本系列文章就遵循这样一个理念,对MFC中Document/View Architecture进行一个分析(姑且也可以称之为深入),尽量将对Document/View Architecture的理论研究(侯捷先生书中很多内容)和实际的项目开发结合起来,最后提供一个简单但是全面的Document/View Architecture项目开发(主要是界面框架设计和开发)的实际例子,供参考。 


    1 必备基础知识概述 
    1.1 MFC文档视图结构程序结构总揽 
    当我们使用MFC AppWizard生成一个MFC程序,选用所有默认的设置(当然也是Multiple Documents,本文讨论主要基于Multiple Documents,对于Single Document情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。),假设你的程序名称为A ,则你会得到CMainFrame、CChildFrame、CAboutDlg、CADoc、CAView、CAApp 6个类(Single Document 仅少一个CChildFrame类,其余均同)。这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App)的主要组成: 


    u        一个App(对应类CAApp)可以包含多个文档模版(CDocTemplate),但是MFC AppWizard(无论是SDI还是MDI)都只是默认生成一个。但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。这个结构是通过MFC中CWinApp的成员变量CDocManager* m_pDocManager实现的,我们的CAApp正是继承自MFC提供的CWinApp类。 


    u        CDocManager类则拥有一个指针链表CPtrList m_templateList来维护这些文档模版。这些文档模版都是在CAApp::InitInstance()中通过AddDocTemplate(pDocTemplate)。 


    u        CDocTemplate拥有3个成员变量,分别保存着Document、View、Frame的CRuntimeClass指针,另外持有成员变量m_nIDResource,用来指定这个Document显示时候采用的菜单资源。这4份数据都在CAApp::InitInstance()中CDocTemplate的构造函数中指定。在Document中拥有一个回指CDocTemplate的指针(m_pDocTemplate)。


    一个文档可以有多个视图,由Document中成员变量CPtrList m_ViewList维护。 


    u        CFrameWnd拥有一个成员变量CView* m_pActiveView指向当前活动的View。 


    u        CView中拥有一个成员变量CDocument* m_pDocument指向该视图相关的Document。 


    [注解]:①MFC SDI/MDI程序默认都默认生成了一个文档模版,并将这个文档模版Add到其文档模版的链表中,由于这是MFC默认提供的,因此这个文档模版会被插入到文档模版的第一个位置,而MFC也是通过这个文档模版的特定位置可以确定的。默认情况下,当我们点击File(Open)/ File(New)的时候,这个文档模版会被启用。 


              除了侯捷先生在《深入浅出MFC中列出的以上的深入分析,我们还应该(很大程度上更加重要)掌握以下的关于MFC SDI/MDI的知识: 


    u        文档的本质:文档是用来保存数据以及关于数据的处理的,每当MFC SDI/MDI响应File(Open)/ File(New)的时候都会打开一份文档。文档可以拥有多个视图。文档和视图的关系可以这样理解:文档是被视图观察的对象。 


    u        视图本质:视图在Windows中就是一个窗口,也就是一个可视化的矩形区域。视图是用来表示文档的数据的。但是每个视图必需依附于一个框架(SDI中是MainFrame,MDI是ChildFrame)。当然你可以自己去Create一个视图,并且去显示它。 


    u        框架的本质:框架实际是也是一个Windows窗口。但是在框架上可以放置菜单、工具栏、状态栏等。而视图则放在框架的客户区。因此MFC中我们看到的窗口实际上Frame和View共同作用的结果。 


    u        在某一时刻,程序中只有一个活动的文档、框架和视图,即当前的文档、框架、视图。 


    1.2 MFC SDI/MDI各个类之间的互访 
            在实际项目开发中用的最多就是各个类之间的互访问,这里将网络上和书籍中提到的做了一个总结,也是笔者在实际开发中都用到过的。 


            访问对象 
    访问位置 
    访问实现 


    应用程序App 
    任何位置 
    ①      AfxGetApp(); 


    ②      在要使用应用程序App的文件中加入: 


    extern CAApp theApp,然后直接使用全局的theApp变量。 


    主框架窗口 
    任何位置 
    ①AfxGetMainWnd(); 


    ②AfxGetApp()->m_pMainWnd; 


    视图 
    框架类中 
    GetActiveView();   //当前的活动视图 


    文档类中 
    GetFirstViewPosition();//可以获取全部视图 


    GetNextView(); 


    文档 
    文档类中 
    GetDocument(); 


    文当模版类中 
    GetFirstDocPosition(); //该文档模版对应全部文档 


    GetNextDoc(); 


    框架类中 
    GetActiveDocument(); //当前活动文当 


    子框架类(MDI中) 
    主框架类中 
    ①MDIGetActive(); 


    ②GetActiveFrame(); 


    视图类中 
    GetParentFrame(); 


    文档模版 
    文档类中 
    GetDocTemplate(); 


    应用程序App中 
    GetFirstDocTemplatePosition(); 


    GetNextDocTemplate(); 




            说明:1)以上给出的都是方法,实际访问中可能还要进行以下简单的处理,如类型转换,循环遍历等; 


                     2)可能没有列举完所有可能位置的互访问,但可以通过他们的组合得到。 


    2 文档、视图、框架之间的关联 
            MFC SDI/MDI中的核心就在于文档、视图、框架之间的关联,形成了一个有机的可运作的整体。MFC提供了默认的关联关系,但是在实际的项目开发中很多时候需要动态进行他们的之间的关联。 


    2.1 文档和视图间的关联 
            使用MFC AppWizard声称MFC SDI/MDI程序,在App类的InitInstance()方法中有如下代码(假设Project名称均为Test): 


    u        SDI中 


    CSingleDocTemplate* pDocTemplate; 


    pDocTemplate = new CSingleDocTemplate( 


                   IDR_MAINFRAME, 


                   RUNTIME_CLASS(CTestDoc), 


                   RUNTIME_CLASS(CMainFrame),        // main SDI frame window



    RUNTIME_CLASS(CTestView)); 


            AddDocTemplate(pDocTemplate); 




    u        MDI中 


    CMultiDocTemplate* pDocTemplate; 


    pDocTemplate = new CMultiDocTemplate( 


                   IDR_TESTTYPE, 


                   RUNTIME_CLASS(CTestDoc), 


                   RUNTIME_CLASS(CChildFrame), // custom MDI child frame 


                   RUNTIME_CLASS(CTestView)); 


            AddDocTemplate(pDocTemplate); 




    这里通过CDocTemplate(无论是SDI中的CSingleDocTemplate还是MDI中的CMultiDocTemplate)的构造函数,将文当、视图和框架(SDI中与主框架,MDI中与自框架)关联在一起了,形成了一个整体。 


    手工实现文当和视图的关联 


    在实际的项目开发时候仅仅依靠MFC AppWizard生成的文当和视图、框架是不够的,因此我们需要掌握手工进行这种关联。手工进行文当和视图的关联可以有以下两种实现方式: 


    l          模仿MFC AppWizard实现,使用CDocTemplate的构造函数:在上面的分 


    析中我们可以看到通过CDocTemplate(无论是SDI中的CSingleDocTemplate还是MDI中的CMultiDocTemplate)的构造函数我们可以获得文档、视图和框架的关联。因此可以通过模拟这种方式进行关联。具体实现方法如下: 


    1)   创建新的文档、视图和框架类,方法是使用VC中的Insert MFC Class 


    实现。注意到框架类选择CMDIChildWnd作为基类,文档类选择CDocument作为基类,而视图类则可以根据需要选择CView或其子类(CEditView)等作为基类。 


    2)   为该框架添加菜单资源,方法是在VC资源窗口Menu菜单下添加新的菜 


    单,当然可以通过复制VC提供默认菜单进行修改。 


    3)   在App类的InitInstance()中添加如下类似代码: 


    CMultiDocTemplate* m_pDocTemplate; 


    m_pDocTemplate = new CMultiDocTemplate( 


                   IDR_TESTTYPE,                //改为你新建的菜单资源ID 


                   RUNTIME_CLASS(CTestDoc),    //改为你新建的文档类 


                   RUNTIME_CLASS(CChildFrame), //改为你新建的框架类 


                   RUNTIME_CLASS(CTestView));   //改为你新建的视图类 


            AddDocTemplate(m_pDocTemplate); 




    4)   为了记录这个文档模版,你可以在App类中添加一个CMultiDocTemplate* 


    类型变量来维持这个文档模版。 


    l          上面给出了通过CDocTemplate的构造函数将文档、视图、和框架关联起来,但 


    是有时候我们并不想创建一个新的文档模版,我们只是想给同一个数据提供不同的结果显示,或者说是为同一个文档添加一个新的视图,并提供他们之间的一个切换。我在《VC项目开发之单文档多视图实现》一文给出了这样的一个实现。还有一种可能就是我们本来不是一个文档视图结构支持的程序,想为视图添加一个文档,更好进行业务逻辑和表示层的一个分离。因此我们给出了第二种视图和文档关联的方法:我们使用CCreateContext类进行他们之间的关联,具体实现为: 


            m_pAnotherView = new CAnotherView(); //new 一个新的视图,可以改为你新建的视图 


     //获取一个已有的文档,可以是你新建的文档 


            CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument(); 


            


    //文档和视图关联 


    CCreateContext context; 


            context.m_pCurrentDoc = m_pDoc; 


            //创建视图 


            UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1; //创建视图的ID号,你可以自己设置 


            CRect rect; 


            m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,m_IDFORANOTHERVIEW,&context); 




    l          在框架和视图关联的时候进行设置,具体见一下框架和视图关联部分。


    2.2 框架和视图的关联 
            在第一部分分析我们知道,框架和视图其实都是windows窗口,不过框架提供了菜单、标题栏、状态栏等资源,而视图则只是一个矩形区域。MFC程序中视图决定大多数时候要依附于一个框架(SDI中的MainFrame和MDI中的子框架窗口),可以这样理解,框架相当于一个窗口容器(当然它本身也是一个windows窗口),而视图则正好是放置在框架内客户区域的内容。 


            框架和视图的关联也可以通过模仿MFC AppWizard实现,使用CDocTemplate的构造函数实现,即和2.1中文档和视图间的关联方式相同,这里就不再给出,参看上面的详细实现即可。 


            同上面的分析,在很多的时候我们并不是需要提供一个新的文档模版,我们只是需要显示一个新的窗口(MDI程序),例如我们在作MIS系统界面管理的时候,经常出现的情况就是用户点击一个菜单选项,即弹出一个处理窗口。而要显示一个新的窗口,我们可以通过我在《VC 多文档用户界面设计》一文中给出的方法(通过CDocTemplate的OpenDocumentFile()方法打开一个文档实现),这样就建立一套的文档、视图和框架的体系。上面已经分析到,我们看到MFC的窗口实际上框架和视图的一个结合体,我们并不一定要提供文档、视图、框架的整个体系,我们只需要框架和视图的结合即可实现窗口的显示,这就要经过两个步骤实现:第一步将视图和框架关联,第二步显示框架(也就是一个windows窗口的显示)。以下给出框架和视图关联的具体实现: 


    CChildFrame* pFrm = new CChildFrame();    //框架可以是你新建或者定制的框架类 


            CCreateContext context; 


            context.m_pNewViewClass = RUNTIME_CLASS(CDemoView);   //视图可以是你想显示的视图 


            pFrm->LoadFrame(IDR_TEST2TYPE,WS_CHILD | 


    WS_OVERLAPPEDWINDOW,this,&context);   //菜单资源你可以修改 


            pFrm->ShowWindow(SW_SHOW);            //显示窗口 


            pFrm->InitialUpdateFrame(NULL,true);         //调用视图的OnInitialUpdate()和框架的ActiveFrame(),你可以在这里设置窗口的标题 




            当然你可以在这里添加视图和文档的关联,具体实现是添加以下代码: 


    context.m_pCurrentDoc = m_pDoc;    // m_pDoc就是你要关联到的文档对象

    展开全文
  • 文档在 es 是不可变的——我们不能修改他们。如果要更新已经存在的文档,我们可以使用《索引文档》章节提到的API重建索引(reindex)或者替换掉它。 curl -X PUT "localhost:9200/website/blog/123" -H ...

    更新整个文档

    文档在 es 中是不可变的——我们不能修改他们。如果要更新已经存在的文档,我们可以使用《索引文档》章节提到的API重建索引(reindex)或者替换掉它。

    curl -X PUT "localhost:9200/website/blog/123" -H 'Content-Type: application/json' -d'
    {
        "title":"My first blog entry",
        "text":"I am starting to get the hang of this...",
        "date":"2014/01/02"
    }
    '
    

    在响应中,我们可以看到 es 把 _version 增加了。

    {"_index":"website","_type":"blog","_id":"123","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"created":false}
    

    created 标识为 false,因为同索引、同类型下面已经存在相同 id 的文档。

    在内部,es 已经标记为旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。 es 会在你继续索引更多数据的时候清理被删除的文档。

    创建一个新文档

    当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已存在的?

    请记住 _index, _type, _id 三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式就是使用POST方法,es 自动生成唯一的 _id:

    POST /website/blog/
    {...}
    

    然而,如果想使用自定义的 _id,我们必须告诉 es 应该在 _index、 _type、 _id 三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:

    第一种方法是使用 op_type 查询参数:

    PUT /website/blog/123?op_type=create
    {...}
    

    第二种方法是在URL后加 /_create 作为端点

    PUT /website/blog/123/_create
    {...}
    

    如果请求成功创建了一个新文档, es 将返回正常的元数据而且响应码是 201 created。

    另一方面,如果包含相同的 _index,_type 和 _id 的文档已经存在,es 将返回 409 Conflict 响应状态码,错误信息类似如下:

    展开全文
  • pythondocx库的使用一 创建word文档,并添其中插入文字及图片 docx库,可以用来创建docx文档,包含段落、分页符、表格、图片、标题、样式等几乎所有的word文档中能...用代码创建一个简单的word文档,并在文档中...
  • 用VC++文档界面中创建多视图

    千次阅读 2005-11-17 18:30:00
    一个单文档界面存在多个视图,并且可以根据需要进行视图的动态切换,这是当前比较流行的界面风格,它可以满足许多用户操作和显示方面的需要。这种界面风格的主要代表软件是Outlook Express。而用VC++实现这种...
  • VS2015创建一个基于单文档视图的MFC项目,该项目的名称为MFCApplication。通过向导成功创建项目之后发现,自动生成了很多文件。这些文件,MFCApplicationDoc.cpp和MFCApplictionDoc.h对应的是项目的文档类...
  • 快速创建HTML文档的三种方法

    千次阅读 2020-06-14 20:08:35
    有时需要使用或不使用JavaScript 即时创建HTML文档 。 无论目标是显示确认页面还是包含整个页面的iframe,如果文档足够简单,则可以轻松地将其放在一起... 您可能会对我将下面显示的某些方法感兴趣,其中第一种甚...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    javax.sound.sampled.spi 提供音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...
  • 首先创建一个空白的脚本文档,并保存硬盘上某个位置。 接着输入脚本代码: //定义一个变量[Width],表示新文档的宽度。 var width = 560; //定义一个变量[height],表示新文档的高度。 var height = 560; //...
  • C# 创建PDF文档

    千次阅读 2018-05-22 11:38:43
    下面的示例将介绍如何C#中创建PDF文档,工具/原料Free Spire.PDF for .NETVS2013(版本可自选)方法/步骤下载安装该类库(安装完成后,注意项目引用Spire.Pdf.dll,dll可以安装路径下的Bin文件夹获取。...
  • js创建元素:document.createElement(" 创建的元素"); //“创建的元素”指:p ,h1,div,span........ jQuery创建元素:$(""); //" "引号内的必须是闭合标签,或者是"" js插入元素:document.body.appendChild...
  • ArcGIS Engine+C#实例开发教程 By Daniel 实习四调用新创建类封装方法实现Mxd 文档操作 1新建类库 1.1 打开实习2-3 所建项目解决方案管理器右击选择 MyForm.cs|添加|新建项 1.2 弹出对话框点击 Visual C#...
  • 使用elasticsearch-head创建新文档

    千次阅读 2017-08-02 11:21:30
    1、RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口。  RESTful接口URL的格式: http://localhost:9200///[] 其中index、type是必须提供的。
  • 众所周知,PHP的fopen函数可以创建一个新文档,但如果你创建的这个文档,以中文来命名,并且你使用的是windows系统的话,会发现文档名的中文部分会乱码。下面来做一下实验:PHP脚本(UTF-8编码) $fileName = __DIR__ ...
  • 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写入数据和向外导出数据并且保存到数据库这些类似的操作,由于业务上的需要需要利用POI去读取word的图片,并且去把图片去保存为一个file文件。...
  • 创建 ActiveX 文档

    千次阅读 2004-12-14 22:28:00
    1.使用方法 NavigateTo 时,必须包含 URL 的协议部分。例如,缺省情况下,上面的代码将定位至 txtURL TextBox 控件的 Text 属性的属性值:“http://www.microsoft.com”。2.请记住下面的重要事实:作为 ...
  • 相信我们企业内部的环境已经部署了微软最新的OS平台,Windows 7和Windows 2008 R2,这些OS平台上使用IRM功能时,您有可能遇到创建、打开RMS文档非常缓慢的情况,据测试,office程序会停滞大概1到2分钟才...
  • 目的 这篇教程将教会你使用 CorelDRAW VBA代码来创建和打开文档,演示 Document 对象的使用方法创建文档 Application 对象有两个...Application.CreateDocument 方法基于默认的页面大小、方向和样式创建了...
  • VS 2005 使用 XmlWriter类创建xml文档

    千次阅读 2006-03-23 10:29:00
    visual Studio 2003,最常用的方法是使用XmlTextWriter来创建Xml文档,但Visual Studio 2005的技术描述的说明, 尽管.net Framework 2.0版,Microsoft .net Framework包括XmlTextWriter类,该类是Xml...
  • Python-docx 模块读写 Word 文档基础(一):创建文档、段落格式、字体格式设置方法前言:1、创建 Word 文档及基础用法:2、段落格式设置:3、字体格式设置:结尾:【Python与Word文档】专栏 前言: 从这篇博客开始...
  • 创建空白文档失败的原因

    万次阅读 2010-09-03 17:09:00
    创建空白文档失败的原因
  • 某些应用程序需要创建新(空)文档,而不需要强迫用户选择file->new菜单命令,例如:当用户应用程序的窗口执行某个特定的命令时将创建一个文档;或者执行另外的菜单命令时,间接的创建文档,下面的技术解释了如何...
  • 使用Doxgen创建Xcode文档

    万次阅读 2011-03-03 17:58:00
    文档集为Xcode开发者提供了一个查找各种文档的便捷方式,包括:API、指南、教程、Q/A、示例代码及其他。 许多开发者都用过苹果文档
  • 文档模板和文档/视图的创建过程

    千次阅读 2005-06-09 17:28:00
    为管理创建文档及其关联的视图和框架窗口的复杂过程,框架使用两个文档模板类:用于 SDI 应用程序的 CSingleDocTemplate 和用于 MDI 应用程序的 CMultiDocTemplate。CSingleDocTemplate 一次只能创建和存储一种类型...
  • 利用Dom4j创建xml文档

    千次阅读 2013-05-22 15:35:49
    DocumentHelper是使用Dom4j的辅助类的集合,利用它我们可以创建xml文档,接下来我们就使用它来创建一个简单的xml文档。 // //创建文档 第一种方式 // Document document=DocumentHelper.createDocument(); // /...
  • 如何Web页面上直接打开、编辑、创建Office文档 有朋友询问如何Web页面上做到像SharePoint的效果一样,能直接激活客户端的Word来打开.doc文件,而不是类似直接点击.doc文档链接时WordIE被打开那样。想想这...
  • VB.NET 创建WORD文档

    千次阅读 2011-01-02 13:46:00
    1、添加引用->COM->Microsoft Word 11.0 Object Library... ''' 创建word文档 ''' ''' Public Sub CreateDoc() Dim docApp As New Word.Application Dim doc As Word.Document Dim miss As Object = Sys
  • Word文档的使用过程,我们可以轻松的向文档中插入图片信息,那么,怎样使用C#向Word文档中插入图片呢?本实例将会介绍一种方法,可以方便的实现上述功能。实例运行效果如图1所示。 图1 Word文档中插入图片 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 791,922
精华内容 316,768
关键字:

如何在文档中创建新样式