Com interface microsoft word

  • Download demo project- 37.6 KB
  • Download demo executable- 167 KB

Introduction

“MS Office Automation using C++” — this is what I started searching over the internet a few weeks back to plot a graph in an Excel sheet through my program. Fortunately, I got a few — actually very few — inputs from the cyber world, might be because I am a poor searcher in the internet. This article is for those who are still searching the internet with the same keywords.

OLEAutoWord.JPG

OLEAutoExcel.JPG

Object Linking and Embedding

In early days, I wondered how much easier it was to use Visual Basic than any other programming language. Create a media player just by including the Media Player component with our project, create a web browser just by including the Web Browser component to the project etc. When I tried the same with Visual C++, I realized it is not as easy as in VB. I met with lot of linker errors as I was a newbie. The above story is eight years old. Object Linking and Embedding, popularly called as OLE, is a COM based architecture which provides flexibility and reusability while developing software applications. As I said, if you need to develop a media player application, there is not much to do with code. Include the needed components which are already developed by experts. With OLE, we are linking to the component and embedding it to our application. OLE in Windows is everywhere, you can copy paste images, videos, or music files to a Word document, you can open a PDF, Excel, or Word file in Internet Explorer, and so on…

ComponentesInterfacesClients.JPG

You can find lots of registered components of different applications under HKEY_CLASSES_ROOTCLSID{<___CLSID___>}, where {<___CLSID___>} is variant (unique class ID for each registered component).

COM and Interfaces

I won’t be able to say anything new about COM and interfaces here. A COM object, as its name suggests, is a component which can be easily attached to any application using its interfaces. A COM component may have any number of interfaces, and it is not necessary for an application to use all its interfaces. An interface is nothing but a pure virtual class. It has no implementation code, and is used only for communication between applications with a COM object.

Let’s start with what Microsoft has to say about “MS Office Automation using C++”:

“Automation (formerly OLE Automation) is a technology that allows you to take advantage of an existing program’s functionality and incorporate it into your own applications.”

  • With MFC, use the Visual C++ ClassWizard to generate «wrapper classes» from the Microsoft Office type libraries. These classes, as well as other MFC classes, such as COleVariant, COleSafeArray, and COleException, simplify the tasks of Automation. This method is usually recommended over the others, and most of the Microsoft Knowledge Base examples use MFC.
  • #import, a new directive that became available with Visual C++ 5.0, creates VC++ «smart pointers» from a specified type library. It is very powerful, but often not recommended because of reference-counting problems that typically occur when used with the Microsoft Office applications.
  • C/C++ Automation is much more difficult, but sometimes necessary to avoid overhead with MFC, or problems with #import. Basically, you work with such APIs as CoCreateInstance(), and COM interfaces such as IDispatch and IUnknown.

The above statements are purely taken from the Microsoft website Office Automation Using Visual C++. This article is all about the third point mentioned above, i.e., C/C++ Automation using COM interfaces, and the article only takes MS Word to explain in detail. Refer to the demo source code for similar MS Excel stuff.

Initialize an MSWord Application

CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);

IDispatch *pWApp;
if(SUCCEEDED(hr))
{
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, 
                          IID_IDispatch, (void **)&pWApp);
}

Call CoInitialize() to initialize the COM library for the current thread, i.e., the current thread will be loaded with COM library DLLs. Later, we need to call CoUnInitialize() to unload the loaded COM DLLs from memory. As I mentioned earlier, all registered components can be found under “HKCRCLSID” in the Registry. You can also find the PROGID (program ID) for the component. Use the CLSIDFromProgID() API to get the class ID for the component, since we can get the COM object only by using the CLSID. For MS Word, “Word.Application.xx” is the version dependent PROGID, where xx is version of the MS Word installed in the system. For our convenience, to write code independent of the version, MSWord provides another PROGID “Word.Application”, which is under “VersionIndependentProgID”. Call CoCreateInstance() with the MS Word CLSID to get an instance of an MS Word application. pWApp (IDispatch interface) should receive a valid MS Word component interface object.

IDispatch Interface

IDispatch is an interface derived from IUnknown (the base interface), using which applications will expose methods and properties to other applications (our program) to make use of its features. Simply, the IDispatch pointer we got using CoCreateInstance() for MS Word is the interface object which will help us to use MS Word methods and properties through our program. In addition to the IUnknown members, IDispatch has four more member functions to support OLE Automation.

  • GetTypeInfoCount()
  • GetTypeInfo()
  • GetIDsOfNames()
  • Invoke()

The client application (our program) will use the IDispatch::Invoke() method to call MS Word (or any other component) methods and properties. But, IDispatch::Invoke() cannot receive or understand the actual method names or property names of the MS Word component. It can understand only the DISPID. A DISPID is a 32-bit value which represents the actual methods or properties of a component. GetIDsOfName() is the function we can use to get the DISPID for a method or property of the component. For example, refer to the following code which sets the “Visible” property of an MS Word object:

DISPID dispID;
VARIANT pvResult;
LPOLESTR ptName=_T("Visible");
hr = pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if(SUCCEEDED(hr))
{
    VARIANT x;
    x.vt = VT_I4;
    x.lVal =1;     DISPID prop=DISPATCH_PROPERTYPUT;

    DISPPARAMS dp = { NULL,NULL,0,0 };
    dp.cArgs =1;
    dp.rgvarg =&x;
    dp.cNamedArgs=1;
    dp.rgdispidNamedArgs= ∝
    hr = pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, 
                          &dp, &pvResult, NULL, NULL);
}

Get the DISPID of “Visible”, use the DISPID with Invoke() to set the “Visible” property to true. ptName will be the actual name of a method or a property, used with the GetIDsOfNames() method to get an equivalent DISPID. DISPPARAMS has the parameters for the DISPID (including the method parameter or the property value), used with the Invoke() method which is the actual call for the method or property.

To make the code easier to use, following is the generic function to call an OLE method or to set/get an OLE property:

HRESULT OLEMethod(int nType, VARIANT *pvResult, 
                  IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
    if(!pDisp) return E_FAIL;

    va_list marker;
    va_start(marker, cArgs);

    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    char szName[200];

        WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

        HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, 
                             LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        return hr;
    }
        VARIANT *pArgs = new VARIANT[cArgs+1];
        for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

        dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

        if(nType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
                       nType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) {
        return hr;
    }

        va_end(marker);
    delete [] pArgs;
    return hr;
}

The above function is actually named as AutoWrap() in a Microsoft support article. Nothing new to explain about the function as I have already explained about the GetIDsOfName() and Invoke() calls, except that they are separated to a function. Additionally, the function uses variable arguments to handle different number of parameters for different methods/properties. Now, to set the Visible property of the MS Word object, it is more simpler to use this generic function:

VARIANT x;
x.vt = VT_I4;
x.lVal = 1;        hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pWApp, L"Visible", 1, x);

Note that, OLEMethod receives variable parameters. I.e., you can pass any number of parameters depending on the property/method. Following is a summary of the OLEMethod() parameters,

  • nType – Type of call to make, which can be any of the following values:
    • DISPATCH_PROPERTYPUT — Set property value
    • DISPATCH_PROPERTYGET — Get property value
    • DISPATCH_METHOD — Call a method
  • pvResult – Return value for the call made; it can be another IDispatch object, or an integer value, or a boolean, or so on..
  • pDispIDispatch interface object for which the call is to be made.
  • ptName – Property or method name.
  • cArgs – Number of arguments followed after this parameter.
  • … parameters in reverse order for the call (it can be values of a property, or parameters of a method for the IDispatch object).

Methods and Properties

The MS Word application has a number of properties and methods, and everything cannot be explained here. I will explain a couple of functions here; refer to the source code for more functions, because the code for all the method/property calls will look similar. At the end of this section, I will tell you how to find a method name or property name and its parameters or values whenever needed.

To open a word document:

HRESULT CMSWord::OpenDocument(LPCTSTR szFilename, bool bVisible)
{
    if(m_pWApp==NULL) 
    {
        if(FAILED(m_hr=Initialize(bVisible)))
            return m_hr;
    }
    COleVariant vFname(szFilename);
    VARIANT fname=vFname.Detach();
        {
        VARIANT result;
        VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pWApp, 
                       L"Documents", 0);
        m_pDocuments= result.pdispVal;
    }
        {
        VARIANT result;
      VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, 
                       L"Open", 1, fname);
        m_pActiveDocument = result.pdispVal;
    }
    return m_hr;
}

To open a new document, replace “Open” with “Add” and change the parameters count to 0. Note that, “result” is the output parameter which holds the IDispatch object for “Documents” and “Open” (active document) in the above code.

To close all the opened Word documents:

HRESULT CMSWord::CloseDocuments()
{
    if(m_pWApp==NULL) return E_FAIL;
    {
        VARIANT result;
            VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, 
                       L"Close", 0);
        m_pDocuments=NULL;
        m_pActiveDocument=NULL;
    }
    return m_hr;
}

The following code will set the font for the selected text in the active document:

HRESULT CMSWord::SetFont(LPCTSTR szFontName, int nSize, 
                 bool bBold, bool bItalic,COLORREF crColor)
{
    if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  m_pActiveDocument, L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pFont;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  pSelection, L"Font", 0);
        pFont=result.pdispVal;
    }
    {
        COleVariant oleName(szFontName);
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, 
                       L"Name", 1, oleName.Detach());
        VARIANT x;
        x.vt = VT_I4;
        x.lVal = nSize;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Size", 1, x);
        x.lVal = crColor;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Color", 1, x);
        x.lVal = bBold?1:0;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Bold", 1, x);
        x.lVal = bItalic?1:0;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Italic", 1, x);
    }
    pFont->Release();
    pSelection->Release();
    pDocApp->Release();
    return m_hr;
}

To insert a picture into the active document:

HRESULT CMSWord::InserPicture(LPCTSTR szFilename)
{
    if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, 
                  L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pInlineShapes;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"InlineShapes", 0);
        pInlineShapes=result.pdispVal;
    }
    {
        COleVariant varFile(szFilename);
        COleVariant varLink((BYTE)0);
        COleVariant varSave((BYTE)1);
        OLEMethod(DISPATCH_METHOD,NULL,pInlineShapes,L"AddPicture",3, 
                  varSave.Detach(),varLink.Detach(),varFile.Detach());
    }
    return m_hr;
}

How can we identify a method/property which we need for an MS Word application? The answer is simple, look at the above functions, they can be simply explained as:

Application.Documents.Open(szFilename)
Documents.Close()
ActiveDocument.Application.Selection.Font.Name=szFontName
ActiveDocument.Application.Selection.Font.Size=nSize
ActiveDocument.Application.Selection.Font.Color=crColor
ActiveDocument.Application.Selection.Font.Bold=bBold
ActiveDocument.Application.Selection.Font.Italic=bItalic
ActiveDocument.Application.Selection.InlineShapes.AddPicture(szFilename,false,true)

Does this resemble something familiar to us? Yes, we used to see this often when creating macros in MS Word or MS Excel. These are VBA scripts. So, don’t you think it is much easier to get a method or property name you need for your application?

What to do when you need to know how to insert a picture into a Word document?

  • Open MS Word
  • Open a new document
  • Go to Tools->Macro->Record New Macro
  • Choose a keyboard macro and assign a key for the macro
  • After the macro recording has been started, go to Insert->Picture->From File
  • Choose an image file
  • Stop macro
  • Go to Tools->Macro->Visual Basic Editor (F11)
  • Under “NewMacros”, you can see your recorded macro at the end
  • Look at the code:
  • Selection.InlineShapes.AddPicture FileName:=<your-image>, 
                           LinkToFile:=False, SaveWithDocument=True

Now, compare this with the above InsertPicture() function so that you can understand how it is being coded in C++.

So, whatever the task you want to do with MS Word through automation, first do that with a sample macro in MS Word itself, and you will get to know the methods and their parameters, the property names, and their values. The job will be easy then with the OLEMethod() call.

Points to Note

  • VARIANT is a structure union which means literally “not sure”. Yes, we are not sure about the data type, so it can be anything. Using VARIANT, we can get a BYTE value or an unsigned long value, or an IUnknown object, or whatever is needed in the case. Those who are already familiar with COM should know about this.
  • Make sure about the DISPATCH_METHOD, DISPATCH_PROPERTYPUT, and DISPATCH_PROPERTYGET usage in OLEMethod() or in the Invoke() call. We need to decide which needs to be used where, depending on the method or property we use with OLEMethod().
  • Try to understand GetIDsOfNames() and Invoke() explained in the «IDispatch Interface» section of this article, which are more important than other information provided here.
  • COleVariant is the class version of the VARIANT structure (union), which makes our job easier to initialize a variant with a value.
  • The OLEMethod() function receives variable parameters in reverse order. For example, the AddPicture parameters are actually <filename, > in order, whereas in OLEMethod, call <savewithdocument, />
  • If your Word or Excel application remains in memory (check with Task Manager) after closing your client application, make sure you have released all the used IDispatch objects.

Conclusion

All the concepts explained above are same for Excel as well. Refer to the demo source code for Excel usage. The aim of this article is not to give you the complete set of methods and properties for MS Word and MS Excel Automation, but to give you a hand to help you do the Automation yourself. All the best.

    Naren started coding during 1999 with FORTRAN, then COBOL, PASCAL, C, C++, VC++ ….. C#, Java, ASP so on, till today. He claims himself as techie who loves coding, but he is not even sure which technology or platform he loves, most of the time Windows, some time WinCE, some time Linux, nowadays Android and embedded platforms. He can do some query stuffs with Oracle, SQL Server, MySQL. He strongly believes that C/C++ is a must for all programmers, «if you know C/C++, you can do programming on any language». He is an electronic gadget guy who likes to buy small gadgets all the time, at least he will do window shopping on a gadget shop. His interest always have been with Automation in any form, call it a little automated program sitting in his Laptop or a home automation program runs on his mobile. Apart from coding, he likes to do…???

    На чтение 3 мин Опубликовано 26.04.2015

    Word 2013 – это текстовый редактор, который позволяет создавать множество самых различных документов, к примеру письма, рекламные проспекты или отчеты. С введением в программу некоторых расширенных возможностей, включая возможность создания и совместной работы над документами онлайн, Word 2013 открывает совершенно новые возможности при работе с текстовыми файлами. В этом уроке мы познакомимся с базовыми элементами интерфейса Microsoft Word и узнаем их основное предназначение.

    Содержание

    1. Интерфейс Word
    2. Лента
    3. Панель быстрого Доступа
    4. Учетная запись Microsoft
    5. Группа команд
    6. Линейка
    7. Индикатор числа страниц
    8. Подсчет числа слов
    9. Режимы просмотра
    10. Масштаб
    11. Полоса прокрутки

    Интерфейс Word

    Word 2013 очень похож на Word 2010. Если Вы ранее работали с Word 2010, то освоить Word 2013 не составит большого труда. Однако, если Вы впервые знакомитесь с Word или работали преимущественно с более ранними версиями, освоение интерфейса Word 2013 займет некоторое время.

    При первом открытии Word появится Начальный экран. Здесь Вы можете создать новый документ, выбрать шаблон или открыть один из последних документов.

    Лента

    Лента содержит все команды, необходимые для выполнения наиболее распространенных задач в Word. Она содержит различные вкладки, состоящие из нескольких групп команд.

    Интерфейс Microsoft Word

    Панель быстрого Доступа

    Панель быстрого доступа позволяет получить доступ к основным командам независимо от того, какая вкладка Ленты в данный момент выбрана. По умолчанию она включает такие команды, как Сохранить, Отменить и Повторить. Вы всегда можете добавить любые другие команды по усмотрению.

    Интерфейс Microsoft Word

    Учетная запись Microsoft

    Здесь Вы можете получить доступ к Вашей учетной записи Microsoft, посмотреть профиль или сменить учетную запись.

    Интерфейс Microsoft Word

    Группа команд

    Каждая группа содержит блок различных команд. Для применения команды нажмите на соответствующий ярлычок. Некоторые группы содержат стрелку в правом нижнем углу, нажав на которую можно увидеть еще большее число команд.

    Интерфейс Microsoft Word

    Линейка

    Линейка расположена в верхней части и по левому краю документа. Она служит для выравнивания текста и установки параметров полей.

    Интерфейс Microsoft Word

    Индикатор числа страниц

    Индикатор числа страниц позволяет отслеживать общее количество страниц, содержащихся в документе.

    Интерфейс Microsoft Word

    Нажмите на индикатор числа страниц (Номер страницы в документе) для того, чтобы вызвать область навигации по документу. Здесь можно найти необходимую страницу по заголовкам, либо быстро прокрутить страницы.

    Интерфейс Microsoft Word

    Подсчет числа слов

    Счетчик слов отображает количество слов в документе.

    Интерфейс Microsoft Word

    Нажмите на значок Число слов, чтобы открыть диалоговое окно Статистика. В данном окне можно посмотреть сведения о количестве страниц, абзацев, строк и т.д.

    Интерфейс Microsoft Word

    Режимы просмотра

    Существует три основных режима просмотра. Для выбора необходимого режима просто нажмите соответствующий ярлычок.

    Интерфейс Microsoft Word

    • В Режиме чтения документ отображается в полноэкранном формате.
    • По умолчанию стоит режим Разметка страницы. В этом режиме документ отображается в том виде, в котором он будет выводиться на печать.
    • В режиме Веб-документ можно просмотреть, как будет выглядеть документ в качестве веб-страницы.

    Масштаб

    Нажмите, удерживайте и передвигайте ползунок для настройки масштаба. Цифры справа от регулятора отображают значение масштаба в процентах.

    Интерфейс Microsoft Word

    Полоса прокрутки

    Нажмите, удерживайте и передвигайте вверх или вниз полосу прокрутки для прокручивания страниц.

    Интерфейс Microsoft Word

    Оцените качество статьи. Нам важно ваше мнение:

    Модель модулей расширения Microsoft Office 2000

    Интерфейс IDTExtensibility2

    Внедрение в объектную модель Office

    COM Events

       Введение

       Базовый класс обработчика COM-событий

       Обработчик событий от CommandBarButton

    Регистрация модулей

    Пишем COM Add-In

       Библиотеки типов Office 2000

       Создаем COM-сервер

       Отладка модулей расширения

       Реализуем функциональность

       Написание надстроек, работающих с несколькими приложениями Office

    Модель модулей расширения Microsoft Office 2000

    В Office 2000
    Microsoft ввела единый API для написания
    подключаемых модулей, расширяющих
    функциональные возможности пакета. Теперь
    стало возможно написание модулей, которые
    интегрируются с
    любым из приложений пакета. Разработанный
    набор интерфейсов упрощает создание
    расширений, позволяя программисту
    сконцентрироваться на функциональности, а
    не на изучении особенности каждого из
    приложений.

    Новая модель подключаемых модулей была
    названа COM
    Add-Ins.
    Как следует из названия, модуль расширения (Add-In)
    представляет собой COM-сервер,
    который специальным образом
    зарегистрирован в операционной системе.
    При загрузке приложение пакета Office
    загружает
    зарегистрированные расширения и вызывает
    их методы, позволяя установить обработчики
    на необходимые для их дальнейшего
    функционирования события. По завершении
    работы приложение Office
    извещает об этом модули расширения,
    позволяя последним корректно освобождать
    ресурсы.

    Общение модулей расширения с загрузившим
    их приложением происходит с помощью
    объектной модели Microsoft
    Office.

    Использование COM Add-In позволяет в корне изменить подходы к интеграции приложений
    с Microsoft Office. Например, вместо того чтобы вызывать Word для генерации
    отчетов, можно, наоборот, встроить в него меню со списком отчетов, а по выбору
    пользователем нужного отчета  — запросить данные из базы данных и сформировать
    по ним документ.

    Интерфейс IDTExtensibility2

    Ключевым моментом в написании COM
    Add-In
    является реализация им интерфейса IDTExtensibility2,
    определенного следующим образом:

    type
       IDTExtensibility2 = interface(IDispatch)
         ['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']
         procedure OnConnection(const HostApp: IDispatch;
           ext_ConnectMode: Integer; const AddInInst: IDispatch;
           var custom: PSafeArray); safecall;
         procedure OnDisconnection(ext_DisconnectMode: Integer;
           var custom: PSafeArray); safecall;
         procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
         procedure OnStartupComplete(var custom: PSafeArray); safecall;
         procedure BeginShutdown(var custom: PSafeArray); safecall;
       end;  

    После загрузки зарегистрированного в
    качестве расширения COM-сервера
    Office
    запрашивает у него этот интерфейс и, если он
    реализован, вызывает соответствующие
    методы, позволяя расширению реализовать
    свою функциональность.

    Рассмотрим
    методы IDTExtensibility2 подробнее:

    procedure OnConnection(
       const HostApp: IDispatch;  
       ext_ConnectMode: Integer;
       const AddInInst: IDispatch;
       var custom: PSafeArray
     ); safecall;  

    Вызывается при загрузке модуля
    расширения. В этот момент
    можно произвести требуемую инициализацию,
    добавить или удалить необходимые
    интерфейсные элементы, установить
    обработчики событий и т.п.

    Параметры, передаваемые методу:

    HostApp

    Ссылка
    на интерфейс IDispatch вызывающего
    приложения. Если модуль расширения планирует в
    дальнейшем обращаться к его объектной
    модели, он должен сохранить ссылку в
    переменной

    ext_ConnectMode

    Константа,
    информирующая о том, по какой причине
    производится загрузка:

    ext_cm_AfterStartup
    — модуль расширения загружен после
    загрузки хотя бы одного документа Office

    ext_cm_External
    — модуль расширения загружен другим
    компонентом

    ext_cm_Startup
    — модуль расширения загружен до
    загрузки хотя бы одного документа Office

    ext_cm_CommandLine
    — не используется в Office 2000

    AddinInst

    Ссылка на интерфейс IDispatch
    загружаемого модуля расширения 

    Custom

    Здесь и далее — в Microsoft
    Office
    не используется

    procedure OnDisconnection(ext_DisconnectMode: Integer;
       var custom: PSafeArray); safecall;  

    Вызывается
    при выгрузке модуля расширения. Этот
    метод должен произвести освобождение
    занятых ресурсов и прочие процедуры по
    завершении работы COM-сервера.

    Параметр
    ext_DisconnectMode информирует о причине выгрузки
    COM-сервера и может принимать следующие
    значения:

    ext_dm_HostShutdown
    – приложение завершает работу;

    ext_dm_UserClosed
    – модуль расширения выгружен
    пользователем.

    procedure OnAddInsUpdate(var custom: PSafeArray); safecall;  

    Вызывается при изменении списка
    загруженных модулей расширений. COM-сервер
    может проанализировать коллекцию
    расширений приложения и предпринять
    необходимые действия, требующие
    взаимодействия с другими 
    модулями расширений.

    procedure OnStartupComplete(var custom: PSafeArray); safecall; 

    Вызывается по завершении инициализации приложения. Те модули расширений, которые
    должны предоставлять интерфейс пользователя при запуске приложения, должны делать
    это в методе OnStartupComplete, когда приложение полностью завершило этап инициализации.

    procedure BeginShutdown(var custom: PSafeArray); safecall; 

    Вызывается в начале процесса завершения приложения, позволяя расширениям предпринять
    в этот момент какие-либо действия.

    Внедрение в объектную модель Office

    Как было показано в предыдущем разделе, расширению доступен интерфейс IDispatch
    вызывающего приложения. Таким образом, оно может модифицировать интерфейс этого
    приложения, добавляя и удаляя необходимые интерфейсные элементы, создавать документы,
    вызывать различные методы для работы с ними. Однако, как правило, помимо этого
    необходимо обеспечить реакцию на различные события в вызывающем приложении (такие
    как изменение документа или нажатие кнопки на панели инструментов). Для этого
    Add-In должен установить обработчик соответствующего события. Прежде чем перейти
    к вопросам реализации, совершим небольшой экскурс по событиям COM и их обработчикам.

    COM Events

    Введение

    Если COM-объект
    хочет получать информацию о событиях в
    другом COM-объекте, то он должен уведомить об
    этом объект-источник событий,
    зарегистрировав себя в списке объектов-получателей
    уведомлений о событиях. Модель COM
    предоставляет для этого стандартный
    механизм.

    Объект-источник
    событий (в нашем случае – приложение Office,
    документ, кнопка на панели инструментов и т.п.)
    реализует интерфейс IConnectionPointContainer. Объект,
    нуждающийся в оповещении о событиях, должен
    запросить у источника этот интерфейс, затем
    при помощи метода FindConnectionPoint
    получить «точку подключения» – интерфейс IConnectionPoint
    и посредством вызова метода Advise
    зарегистрировать в этой точке подключения
    ссылку на свою реализацию интерфейса IDispatch,
    методы которого будут вызываться при
    возникновении тех или иных событий в
    источнике событий.

    Различные
    объекты Office определяют интерфейсы, которым
    должны соответствовать обработчики их
    событий. Так, например, для объекта CommandBarButton
    (кнопка на панели инструментов) определен
    интерфейс обработчика –

    type
         _CommandBarButtonEvents = dispinterface
           ['{000C0351-0000-0000-C000-000000000046}']
           procedure Click(const Ctrl: CommandBarButton;
             var CancelDefault: WordBool); dispid 1;
         end; 

    Это означает, что при нажатии кнопки будет вызван метод Invoke зарегистрированного
    интерфейса-обработчика, с параметром DispId, равным 1. При этом параметр pDispIds
    будет содержать указатель на вариантный массив из двух параметров — соответственно
    типов CommandBarButton и WordBool.

    Базовый класс обработчика COM-событий

    Реализуем базовый класс обработчика COM-событий.
    Реализация взята из модуля SinkObject.pas,
    написанного Бином Ли (Binh Ly, http://www.techvanguards.com/).

    type
         TBaseSink = class(TObject, IUnknown, IDispatch)
         protected
           { методы IUnknown }
           function QueryInterface(const IID: TGUID; out Obj): HResult;
             stdcall;
           function _AddRef: Integer; stdcall;
           function _Release: Integer; stdcall;
           { методы IDispatch }
           function GetIDsOfNames(const IID: TGUID; Names: Pointer;
             NameCount, LocaleID: Integer; DispIDs: Pointer):    HResult;
             virtual; stdcall;
           function GetTypeInfo(Index, LocaleID: Integer;
             out TypeInfo): HResult; virtual; stdcall;
           function GetTypeInfoCount(out Count: Integer): HResult;
             virtual; stdcall;
           function Invoke(DispID: Integer; const IID: TGUID;
             LocaleID: Integer; Flags: Word; var Params;
             VarResult, ExcepInfo, ArgErr: Pointer): HResult;
             virtual; stdcall; 
      private
         FCookie: Integer;
         FCP: IConnectionPoint;
         FSinkIID: TGuid;
         FSource: IUnknown;
         function DoInvoke(DispID: Integer; const IID: TGUID;
           LocaleID: Integer;  Flags: Word; var dps: TDispParams;
           pDispIds: PDispIdList;  VarResult, ExcepInfo,
           ArgErr: Pointer): HResult; virtual; abstract;  
      public
         destructor Destroy; override;
         procedure Connect(pSource : IUnknown);
         procedure Disconnect;
         property SinkIID: TGuid read FSinkIID;
         property Source: IUnknown read FSource;
       end;  

    Рассмотрим реализацию ключевых методов этого класса. Метод QueryInterface в
    дополнение к стандартной реализации проверяет, нет ли попыток запросить интерфейс
    обработчика событий. В этом случае возвращается IDispatch, позволяющий объекту-источнику
    событий вызвать метод Invoke:

    function TBaseSink.QueryInterface(const IID: TGUID;
         out Obj): HResult;
       begin
         Result := E_NOINTERFACE;
         Pointer(Obj) := NIL;
         if GetInterface(IID, Obj) then
           Result := S_OK;
         // если запрашивается интерфейс SinkIID -
         // возвращаем свой IDispatch
         if not Succeeded(Result) then
           if IsEqualIID(IID, FSinkIID) then
             if GetInterface(IDispatch, Obj) then
               Result := S_OK;
       end; 

    Метод Connect регистрирует COM-объект в качестве обработчика событий COM-объекта
    pSource. Обращаю внимание, что переменная FCP объявлена как поле класса, поскольку
    он должен удерживать счетчик ссылок на «точку подключения», пока она используется.
    Если объявить FCP как локальную переменную — по завершении метода Connect произойдет
    неявный вызов FCP._Release, что приведет к неправильной работе.

    procedure TBaseSink.Connect(pSource: IUnknown);
       var
         pcpc: IConnectionPointContainer;
       begin
         Disconnect;
         try
           // Запрашиваем интерфейс IConnectionPointContainer у объекта-
           // источника событий
           OleCheck(pSource.QueryInterface(IConnectionPointContainer,
             pcpc));
           // Запрашиваем интерфейс IConnectionPoint.
           OleCheck(pcpc.FindConnectionPoint(FSinkIID, FCP));
           // Подключаемся к обработчику событий
           OleCheck(FCP.Advise(Self, FCookie));
           // Все прошло успешно - устанавливаем свойство Source
           FSource := pSource;
         except
           raise Exception.Create(Format('Unable to connect %s.'#13'%s',
             [ClassName, Exception(ExceptObject).Message]));
         end;
       end; 

    Метод Disconnect отключает обработчик событий от объекта-источника.

    procedure TBaseSink.Disconnect;
       begin
         if FSource = NIL then
           Exit;
         try
           OleCheck(FCP.Unadvise(FCookie));
           FCP := NIL;
           FSource := NIL;
         except
           Pointer(FCP) := NIL;
           Pointer(FSource) := NIL;
         end;
       end; 

    Метод Invoke вызывается при возникновении события в объекте-источнике. Он осуществляет
    предварительную обработку параметров и вызывает абстрактный метод DoInvoke,
    который должен быть перекрыт в наследниках, реализующих конкретные интерфейсы
    обработчиков событий. Реализация такого наследника будет рассмотрена ниже.

    Обработчик событий от CommandBarButton

    Наследуя
    функциональность от базового класса TBaseSink,
    обработчики событий конкретных COM-объектов
    реализуются перекрытием методов Create и DoInvoke.
    Создадим такой обработчик для кнопки на
    панели инструментов Office. Он должен
    реализовать интерфейс _CommandBarButtonEvents –

    type
         _CommandBarButtonEvents = dispinterface
           ['{000C0351-0000-0000-C000-000000000046}']
           procedure Click(const Ctrl: CommandBarButton;
             var CancelDefault: WordBool); dispid 1;
         end; 

    Объявим класс:

    type
       // Обработчик события нажатия на кнопку
       TOnCommandButtonClick = procedure (Button: CommandBarButton;
          var CancelDefault: WordBool) of object;
     
       
      TCommandButtonEventSink = class(TBaseSink)
       private
         FOnClick: TOnCommandButtonClick;
       protected
         procedure DoClick(Button: CommandBarButton;
           var CancelDefault: WordBool); virtual;
         function DoInvoke (DispID: Integer; const IID: TGUID;
           LocaleID: Integer; Flags: Word; var dps : TDispParams;
           pDispIds : PDispIdList; VarResult, ExcepInfo,
           ArgErr: Pointer): HResult; override;
       public
         constructor Create; virtual;
         property OnClick: TOnCommandButtonClick
           read FOnClick write FOnClick;
       end;  

    В конструкторе установим идентификатор интерфейса обработчика событий, который
    мы реализуем.

    constructor TCommandButtonEventSink.Create;
       begin
         inherited;
         FSinkIID := _CommandBarButtonEvents;
       end; 

    Метод DoClick просто вызывает назначенный классу обработчик события и нужен
    для более удобной работы с ним из Delphi.

    procedure TCommandButtonEventSink.DoClick(Button: CommandBarButton;
         var CancelDefault: WordBool);
       begin
         if Assigned(FOnClick) then
           FOnClick(Button, CancelDefault);
       end; 

    Ключевым методом является DoInvoke, который для каждого DispId, объявленного
    в интерфейсе _CommandBarButtonEvents, должен выполнить соответствующие действия.

    function TCommandButtonEventSink.DoInvoke(DispID: Integer;
         const IID: TGUID; LocaleID: Integer; Flags: Word;
         var dps: TDispParams; pDispIds: PDispIdList;
         VarResult, ExcepInfo, ArgErr: Pointer): HResult;
       begin
         Result := S_OK;
         case DispID of
           // Для этого DispId передаются 2 параметра – CommandBarButton
           // и WordBool
           1 : DoClick(IUnknown(dps.rgvarg^[pDispIds^[0]].unkval)
                 as CommandBarButton,    dps.rgvarg^[pDispIds^[1]].pbool^);
         else
           Result := DISP_E_MEMBERNOTFOUND;
         end;
       end; 

    Как видим, реализация конкретного обработчика является практически механической
    задачей и не должна вызвать проблем. Если в интерфейсе предусмотрено несколько
    методов, то следует подставить в оператор case все их DispId. От программиста
    требуется лишь аккуратность при отображении массива dps на параметры соответствующих
    обработчиков.

    Регистрация модулей

    COM Add-In — это COM-сервер, который должен быть зарегистрирован в системе,
    например, при помощи TRegSvr.exe или RegSvr32.exe. Однако требуется еще один
    шаг — регистрация его в Microsoft Office. Для этого необходимо создать в реестре
    раздел с именем.

    HKEY_CURRENT_USERSoftwareMicrosoftOffice<Имя приложения>AddIns<Имя>

    Здесь:

    <Имя приложения> — название приложения, к которому подключается Add-In

    <Имя> — имя, под которым
    зарегистрирован COM-сервер
    (название_проекта.имя_класса)

    В этом разделе необходимо создать два параметра:

    FriendlyName

    Строковый
    параметр, определяющий имя, под которым
    наше расширение будет видно в менеджере
    расширений приложений Microsoft Office

    LoadBehavior

    Параметр
    типа DWORD, определяющий, когда должен
    загружаться Add-In

    Параметр LoadBehavior может принимать одно из следующих значений:

    3

    Add-In
    загружается при старте приложения

    9

    Add-In
    загружается по требованию (когда его
    свойство Connected в колекции AddIns приложения
    будет установлено в TRUE)

    16

    Add-In
    загружается один раз при следующем
    запуске приложения

    Пишем COM Add-In

    Библиотеки типов Office 2000

    Для работы с объектной моделью Microsoft Office 2000 нам понадобятся библиотеки
    типов, описывающие доступные интерфейсы. Поскольку Delphi 5 поставляется с библиотеками
    типов от Office 97, необходимо импортировать нужные модули. В любом случае понадобится
    библиотека Office_TLB, остальные (Word_TLB, Excel_TLB и т.п.) могут потребоваться
    в зависимости от того, к какому приложению будет писаться модуль расширения.

    Для импорта воспользуемся меню Import
    TypeLibrary.

    После создания модулей с описаниями интерфейсов рекомендую вручную удалить
    из них ссылки на модули Graphics и OleCtrls, которые приводят к подключению
    к проекту модуля Forms, а при компиляции не нужны.

    Создаем COM-сервер

    Поскольку COM Add-In является COM-сервером, воспользуемся мастерами Delphi
    для его создания. Выберем команду New… -> ActiveX -> ActiveX Library.

    Затем добавим в созданную библиотеку Automation Object при помощи мастера New…
    -> ActiveX -> Automation Object.

    В поле
    CoClassName введем имя реализуемого интерфейса
    (DTExtensibility2). В
    принципе,  можно ввести любое имя, требуется
    только, чтобы этот интерфейс имел тот же GUID, что и IDTExtensibility,
    и аналогичный набор методов.

    После того как Delphi создаст новый объект автоматизации, запустим редактор
    библиотеки типов. Вначале мы имеем описание интерфейса без методов и со сгенерированным
    Delphi значением GUID.

    Перейдем на вкладку Text
    созданного интерфейса и введем там
    следующий текст:

    [
       uuid(B65AD801-ABAF-11D0-BB8B-00A0C90F2744),
       version(1.0),
       helpstring("Dispatch interface for Office2000ComAddIn Object"),
       dual,
       oleautomation
     ]  
    interface IDTExtensibility2: IDispatch
     {
       [id(0x00000001)]
       HRESULT _stdcall OnConnection(
         [in] IDispatch * HostApp,
         [in] long ext_ConnectMode,
         [in] IDispatch * AddInInst,
         [in] SAFEARRAY(VARIANT) * custom );
       [id(0x00000002)]
       HRESULT _stdcall OnDisconnection([in] long ext_DisconnectMode,
         [in] SAFEARRAY(VARIANT) * custom );
       [id(0x00000003)]
       HRESULT _stdcall OnAddInsUpdate(
         [in] SAFEARRAY(VARIANT) * custom );
       [id(0x00000004)]
       HRESULT _stdcall OnStartupComplete(
         [in] SAFEARRAY(VARIANT) * custom );
       [id(0x00000005)]
       HRESULT _stdcall BeginShutdown(
         [in] SAFEARRAY(VARIANT) * custom );
     };  

    Если вы назвали свой класс не DTExtensibility2, а как-то иначе — скорректируйте
    название интерфейса. Все остальное, включая uuid, должно быть введено точно
    так, как это было описано выше.

    Если все введено правильно — в окне Type Library Editor вы должны увидеть пять
    методов созданного интерфейса.

    Нажмите кнопку «Обновить» и закройте
    редактор библиотеки типов — больше он нам
    не понадобится. Теперь
    откомпилируйте полученный проект и
    зарегистрируйте его в Windows при помощи меню
    Run->Register COM Server.

    При
    помощи редактора реестра создайте в
    реестре Windows запись для регистрации Add-In с
    приложением Microsoft Office. COM Add-In готов!

    Отладка модулей расширения

    Для работы с модулями расширения
    необходимо добавить в меню Microsoft
    Office
    команду для вызова диспетчера дополнений.
    Для этого (на примере Word):

    • В меню Сервис выберите команду Настройка, а затем — вкладку Команды.
    • В списке Категории выберите категорию Сервис.
    • Перетащите команду Надстройки для модели COM… из списка Команды в меню
      Сервис. Когда в меню Сервис раскроется список команд, укажите, где в этом
      меню должна располагаться команда Надстройки для модели COM…, после чего
      отпустите кнопку мыши.
    • Нажмите кнопку «Закрыть».

    При помощи этой команды вызывается окно диспетчера дополнений. Загруженные
    дополнения помечены в списке галочкой. Чтобы загрузить надстройку — отметьте
    ее и нажмите OK, чтобы выгрузить — снимите отметку.

    !Если во время загрузки Add-In произошла ошибка — Office не будет загружать
    его при следующем запуске приложения автоматически. Чтобы надстройка снова начала
    загружаться — загрузите ее через диспетчер.

    Для отладки Com Add-Ins установите в качестве Host Application (меню Run —
    > Parameters) приложение Office, к которому подключена надстройка, например
    WinWord.exe. После этого установите точку прерывания в одном из методов своего
    объекта и запустите приложение. Загрузится Word, и при попадании на точку прерывания
    вы окажетесь в отладчике Delphi.

    Реализуем функциональность

    В
    настоящий момент наш Add In умеет только
    загружаться, но не может сделать ничего
    полезного. Для
    примера реализации функциональности
    добавим на панель инструментов Office
    кнопку, по нажатии которой в текущую
    позицию курсора будет вставляться список
    файлов выбранной папки.

    Для этого дополним наш объект
    автоматизации несколькими полями и
    методами.

    type
         TDirectoryList = class(TAutoObject, IDTExtensibility2)
         private
           Host: WordApplication;
           FButtonEventsSink: TCommandButtonEventSink;
           procedure ButtonClick(Button: CommandBarButton;
             var CancelDefault: WordBool);
         protected
           // Реализация IDTExtensibility2
           procedure BeginShutdown(var custom: PSafeArray); safecall;
           procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
           procedure OnConnection(const HostApp: IDispatch;
             ext_ConnectMode: Integer; const AddInInst: IDispatch;
             var custom: PSafeArray); safecall;
           procedure OnDisconnection(ext_DisconnectMode: Integer;
             var custom: PSafeArray); safecall;
           procedure OnStartupComplete(var custom: PSafeArray); safecall;
         end; 

    Поле Host будет хранить ссылку на интерфейс WordApplication, необходимый для
    работы с объектной моделью Word, поле FButtonEventsSink — ссылку на объект-обработчик
    событий от кнопки, реализация которого была рассмотрена в разделе «Обработчик
    событий от CommandBarButton», а метод ButtonClick будет вызываться для обработки
    нажатия на кнопку.

    Реализуем необходимую функциональность
    в методах класса TDirectoryList.

    const
         // Уникальный идентификатор кнопки. Можно задать любую уникальную
         // строку. Для ее генерации удобно воспользоваться средствами
         // Delphi по генерации GUID (Ctrl+Shift+G)
         // Этот идентификатор понадобится нам для того, чтобы после
         // создания кнопки иметь возможность ее найти.
         BUTTON_TAG = '{1A1552DC-9286-11D3-BCA0-00902759A497}';
       
     
    procedure TDirectoryList.OnConnection(const HostApp: IDispatch;
       ext_ConnectMode: Integer; const AddInInst: IDispatch;
       var custom: PSafeArray);
     var
       Bar: CommandBar;
       Button: CommandBarButton;
     begin
       // Сохраняем ссылку на WordApplication для
       // последующей работы с ней
       Host := HostApp as WordApplication;
       // Создаем обработчик событий для кнопки
       FButtonEventsSink := TCommandButtonEventSink.Create;
       FButtonEventsSink.OnClick := ButtonClick;
       // Получаем интерфейс панели инструментов "Форматирование"
       Bar := Host.CommandBars.Get_Item('Formatting');
       // Проверяем наличие на ней нашей кнопки
       Button := Bar.FindControl(msoControlButton, EmptyParam, BUTTON_TAG,
         EmptyParam, msoFalse) as CommandBarButton;;
       if not Assigned(Button) then
         // Если ее нет – создаем
         Button := Bar.Controls.Add(msoControlButton, EmptyParam,
           BUTTON_TAG, 1, EmptyParam) as CommandBarButton;
       // Подключаем обработчик и устанавливаем свойства кнопки
       FButtonEventsSink.Connect(Button);
       Button.Set_Style(msoButtonCaption);
       Button.Set_Tag(BUTTON_TAG);
       Button.Set_Caption('Dir');
     end;  
       
    procedure TDirectoryList.OnDisconnection(ext_DisconnectMode: Integer;
       var custom: PSafeArray);
     var
       Bar: CommandBar;
       B: CommandBarControl;
     begin
       // Уничтожаем обработчик событий кнопки
       FreeAndNil(FButtonEventsSink);
       // Ищем свою кнопку
       Bar := Host.CommandBars.Get_Item('Formatting');
       B := Bar.FindControl(msoControlButton, EmptyParam, BUTTON_TAG,
         EmptyParam, msoFalse) as CommandBarButton;
       // И удаляем ее
       if Assigned(B) then
         B.Delete(msoFalse);
     end;  
       
    procedure TDirectoryList.ButtonClick(Button: CommandBarButton;
       var CancelDefault: WordBool);
     var
       S: String;
       SR: TSearchRec;
       D: WordDocument;
       FindStatus: Integer;
     begin
       // Эта процедура вызывается при нажатии на созданную нами кнопку
       D := Host.ActiveDocument;
       // Проверяем наличие активного документа
       if Assigned(D) then begin
         // Функция BrowseForFolder возвращает путь к выбранной
         // в диалоге папке. Код функции приведен в модуле с примером
         // на сопровождающем диске. От использования аналогичной
         // функции VCL SelectDirectory пришлось отказаться, так как
         // модуль, в котором она находится, использует Forms
         if BrowseForFolder(S) then begin
           with TStringList.Create do
           try
             // Получаем список файлов
             FindStatus := FindFirst(S + '*.*', 0, SR);
             while FindStatus = 0 do begin
               Add(SR.Name);
               FindStatus := FindNext(SR);
             end;
             FindClose(SR);
             // И вставляем его в документ
             D.ActiveWindow.Selection.InsertAfter(S+#13#13+Text);
           finally
             // Освобождаем TStringList
             Free;
           end;
         end;
       end;
     end;  

    Пример работы этой надстройки изображен на рисунке.

    Написание надстроек, работающих с несколькими приложениями Office

    Поскольку все приложения Office
    реализуют одну и ту же модель COM
    Add-Ins,
    одно и то же расширение может быть
    зарегистрировано одновременно для
    нескольких приложений. В этом
    случае оно должно определять, из какого
    приложения оно загружено, и использовать
    соответствующую объектную модель.
    Определить приложение-владельца можно,
    запросив у него соответствующий интерфейс:

    procedure TDirectoryList.OnConnection(const HostApp: IDispatch;
       ext_ConnectMode: Integer; const AddInInst: IDispatch;
       var custom: PSafeArray);
     begin
       if HostApp is WordApplication then
       // Это Microsoft Word  

    Также возможно сохранение HostApp
    в переменной типа Variant
    и использование позднего связывания. В
    этом случае надстройка будет работать с
    любым приложением Office, имеющим подходящие
    по именам методы.

    КомпьютерПресс 7’2001

    Интерфейс Word
    Интерфейс Word

    Интерфейс Word выглядит следующим образом:

    Интерфейс Word 2016 включает в себя следующие элементы:

    Заголовок документа

    Заголовок документа отображает название открытого файла. Если создан новый документ, в заголовке будет указано “Документ 1”.

    Заголовок документа

    Лента

    Лента – поле, на котором располагаются элементы управления.

    word1_1_6

    Скрытие и отображение Ленты

    Для того, чтобы освободить место на экране для документа, ленту можно свернуть одним из следующих способов:

    1. Двойной щелчок по названию открытой вкладки.

    2. Щелчок правой кнопкой мыши по любому свободному месту на ленте откроет дополнительное меню, в котором необходимо выбрать команду “Свернуть ленту”.

    word2016-svernut-lentu-menu

    3. Нажать на кнопку “Свернуть ленту”, расположенную в правом нижнем углу ленты:

    word2016-svernut-lentu

    4. Нажать на клавиатуре сочетание клавиш Ctrl + F1.

    5. Нажать на кнопку “Параметры отображения ленты”, расположенную в правом верхнем углу документа:

    word2016-parametri-otobrazheniya-lenti

    И выбрать один из следующих вариантов:

    • “Автоматически скрывать ленту” – меню полностью будет скрыто. При необходимости воспользоваться лентой нужно кликнуть в верхней части экрана.
    • “Показывать вкладки” – лента будет скрыта, но останутся вкладки, при нажатии на которые будет появляться лента.
    • “Показывать вкладки и команды” – данная команда включена по умолчанию. Нажатие на нее вернет внешний вид ленты к исходному значению.

    Для того, чтобы снова отобразить ленту, необходимо воспользоваться теми же способами.

    Панель быстрого доступа

    Панель быстрого доступа позволяет настроить быстрый доступ к часто используемым командам и функциям.

    1_1_4

    Если вы часто используете какие-то конкретные команды Word, не обязательно каждый раз переходить на нужную вкладку. Для более быстрого доступа к таким командам воспользуйтесь панелью быстрого доступа, которая расположена в левом верхнем углу.

    Нажатие кнопки панели быстрого доступа

    word2016_panel-bistrogo-dostupa_sreda31

    приведет к открытию контекстного меню, в котором вы сможете поставить галочки у наиболее часто используемых опций.

    Кнопка Другие команды откроет окно, в котором можно будет выбрать из всех доступных команд.

    Необходимо выбрать в лево части окна команду и нажать кнопку Добавить.

    Выбранные вами команды будут доступны в левом верхнем углу каждого документа, независимо от того, какая вкладка открыта.

    Линейки

    Линейки помогают ориентироваться на странице.

    1_1_5

    Линейки могут быть вертикальными и горизонтальными.

    Для включения/выключения отображения линеек необходимо перейти на вкладку Вид и в группе Показатьпоставить соответствующую галочку:

    word2016_lineyki_sreda31

    Там же можно включить отображение сетки:

    word2016_setka_sreda31

    Вкладки

    Вкладки – основные разделы Word.

    1_1_3

    Основные вкладки:

    Вкладка Файл

    Вкладка Файл содержит команды, необходимые для работы с документом в целом (сохранение, печать и др.), а также параметры настройки программы Word.

    Раздел Сведения — сведения о файле (дата создания, автор и т.д.) и его защите.

    word2016_file-svedeniya_sreda31

    Раздел Создать — создание нового документа (пустого или из предложенных шаблонов).

    Раздел Открыть — открытие существующих документов Word, а также список последних открытых файлов.

    Раздел Сохранить и Сохранить как — сохранение открытого файла.

    Печать — отправка документа на печать.

    Общий доступ — настройка совместной работы с документом, а также его отправка по электронной почте и публикация.

    Экспорт — сохранение документа в формате PDF, XPS и других форматах.

    Закрыть — закрытие текущего документа без выхода из Word.

    Учетная запись — настройка учетной записи пользователя, подключение дополнительных аккаунтов (Facebook, OneDrive, YouTube и др).

    Параметры — настройки Word.

    Вкладка Главная

    Вкладка Главная — наиболее часто используемые команды, связанные с редактированием документа и форматированием текста.

    Вкладка Вставка

    Вкладка Вставка — команды для вставки в документ различных объектов (таблицы, колонтитулы, формулы, символы и прочие).

    Вкладка Дизайн

    Вкладка Дизайн — инструменты, используемые для оформления документа.

    Вкладка Макет

    Вкладка Макет — команды, используемые для изменения расположения тех или иных объектов на странице.

    Вкладка Ссылки

    Вкладка Ссылки — создание ссылок (в том числе оглавлений, списков литературы, сносок и т.д.).

    Вкладка Рассылки

    Вкладка Рассылки — инструменты для создания писем, конвертов, наклеек.

    Вкладка Рецензирование

    Вкладка Рецензирование — проверка орфографии и отслеживание изменений в документе.

    Вкладка Вид

    Вкладка Вид — позволяет настраивать внешний вид отображаемого документа.

    Вкладка Разработчик

    Вкладка Разработчик — работа с макросами и полями. По умолчания данная вкладка скрыта. Для ее отображения необходимо перейти:

    Файл — Параметры — Настроить ленту — Рецензирование (поставить галочку).

    word2016_vkladka-razrabotchik_sreda31

    Вкладки Конструктор и Макет

    Кроме основных вкладок в документе могут появляться дополнительные вкладки (при активации тех или иных функций): Конструктор и Макет, которые содержат дополнительные инструменты, используемые в рамках выбранной функции.

    Группы

    Инструменты на каждой вкладке объединены в Группы, в которых они группируются по тому или иному принципу.

    word1_1_7

    Строка состояния

    Строка состояния отображает различную текущую информацию о документе и обеспечивает доступ к некоторым функциям Word.

    Если указанной информации вам недостаточно, мы можете посмотреть статистику документа Word, нажать кнопку Статистика на вкладке Рецензирование в группе Правописание:

    word2016_statistika_sreda31

    В появившемся окне вы увидите статистику с количеством страниц, слов и знаков в документе.

    word2016_statistika-2_sreda31

    Настройка строки состояния

    Настройка строки состояния осуществляется нажатием по ней правой кнопкой мыши, которое откроет дополнительное диалоговое окно:

    Форматированный номер страницы — показывает номер, который стоит на этой странице.

    Раздел — порядковый номер раздела, в котором вы находитесь.

    Номер страницы — порядковый номер текущей страницы и общее количество страниц.

    Вертикальное положение на странице — расстояние от верхнего края, на котором находится курсор.

    Номер строки — порядковый номер строки, в которой установлен курсор.

    Столбец — порядковый номер столбца, в которой установлен курсор.

    Число слов — общее количество слов в документе.

    Проверка правописания — показывает, есть ли ошибки в документе.

    Язык — указывает, какая раскладка клавиатуры активна.

    Исправления — показывает, включен ли режим исправлений.

    Caps Lock — указывает, включен ли Caps Lock.

    Замена — смена режима между вставкой и заменой.

    Ярлыки режимов просмотра — позволяют переключаться между режимом чтения, разметкой страницы и веб-документом. Про режимы отображения мы написали ниже.

    Ползунок масштаба позволяет – увеличивать или уменьшат размер текста. Можно использовать кнопки «+» и «-«, а также просто передвигать ползунок вправо и влево.

    Масштаб — позволяет более детально настроить представление.

    Изменение масштаба

    При нажатии на кнопку с указанием процентов откроется диалоговое окно, в котором доступны следующие настройки:

    • Установка масштаба (как заданные варианты, так и произвольный);
    • Размещение окна на экране (по ширине страницы, по ширине текста, целая страница, несколько страниц);

    Режимы отображения документов

    Переключиться между режимами отображения документа Word можно на вкладке Вид:

    word2016_rezhimy-otobrazheniya-documentov_sreda31

    или в правой части строки состояния:

    word2016_rezhimy-otobrazheniya-documentov-2_sreda31
    • Разметка страницы — основной режим работы в Word. Отображаем содержимое документа в том виде, в котором оно будет напечатано.
    • Режим чтения — большинство элементов управления Word будут скрыты. Максимальную часть экрана займет текст. Режим предназначен для чтения текста. Редактирование в режиме чтения невозможно. Для выхода из режима чтения необходимо нажать на клавиатуре Esc.
    • Веб-документ — показывает документ в том виде, в котором он будет отображаться в браузере при работе в интернет.
    • Структура — В этом режиме отображается структура с уровнями документа (заголовки, основной текст…). Более удобный инструмент для внесения изменений в иерархию документа.
    • Черновик — отображаем содержимое документа в упрощенном виде (без картинок и некоторых элементов оформления). Режим предназначен для быстрого ввода и редактирования текста.

    Расписание ближайших групп:

    Загружаю…

    Понравилась статья? Поделить с друзьями:
  1. Combine one word or phrase
  2. Com addin for excel
  3. Combine one word from a and one word from b
  4. Com add in word
  5. Combine names to make a new word