Microsoft Word 2007. Меняем интерфейс. Часть 3.
Введение в конструирование интерфейса
средствами Ribbon XML Editor

26.04.2007
Новиков Максим Глебович.

 
Простейшая замена

Создадим в Microsoft Word 2007 новый документ и сохраним его в новом формате docx. Закроем документ. Затем запустим Ribbon XML Editor, и откроем сохраненный файл в нём. Поскольку нового интерфейса в файле еще не было, окно редактора останется чистым. Теперь скопируем в него нижеприведённый фрагмент xml-текста и сохраним.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabHome">
<group idMso="GroupClipboard" visible="false"/>
<group idMso="GroupStyles" visible="false"/>
<group idMso="GroupEditing" visible="false"/>
<group idMso="GroupInsertTables"/>
<group idMso="GroupInsertSymbols"/>
<group idMso="GroupInsertPages"/>
<group idMso="GroupZoom"/>
</tab>
<tab id="TabStyles" label="Разное">
<group idMso="GroupClipboard"/>
<group idMso="GroupEditing"/>
<group idMso="GroupStyles"/>
</tab>
</tabs>
</ribbon>
</customUI>

Теперь, при последующем открытии этого документа в Word'е, оттуда считаются наши команды конфигурирования интерфейса, и он будет скорректирован согласно этим командам. В приведённом выше примере мы убрали три малоиспользуемые группы из вкладки «Главная» и скопировали вместо них четыре более нужные группы, расположенные на других вкладках. Убранные же вкладки мы разместили на вновь созданной вкладке «Разное».

Структура приведённого выше xml-текста проста, и, пользуясь справочником из предыдущей части статьи, вы без труда поймёте назначение каждого элемента этого текста.

Теперь надо сделать наш файл шаблоном документов по умолчанию. Для этого сохраняем его как шаблон в папке:

C:\Documents and Settings\Администратор\Application Data\Microsoft\Шаблоны

под любым именем кроме normal.dotm, так как это имя занято уже открытым шаблоном по умолчанию. После сохранения закрываем Word и переименовываем файл normal.dotm, например, в normal_old.dotm, а наш файл в normal.dotm. Теперь при запуске Word'а новый документ будет создаваться на основе именно нашего шаблона.

[Вернуться в начало]

Более сложный случай.

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

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

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

Откроем Word 2007 на основе стандартного шаблона и сохраним документ, созданный по умолчанию, под любым именем, например «__Новая лента». Закроем документ в Word'е и запустим редактор интерфейса Ribbon XML Editor.

Нажав на кнопку «Открыть документ» найдём сохранённый нами документ и откроем его. В правом информационном окне редактора интерфейса отобразится структура документа, а снизу — список элементов открытой справа папки структуры. Поскольку эта информация нужна нам сейчас только в познавательных целях, то изучив ради интереса содержимое информационных окон, закроем их нажатием на две самые правые кнопки верхней панели инструментов.

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

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

Следующим тегом, вложенным в корневой тег, будет тег ribbon, обозначающий Ленту — основу нашего интерфейса. Кроме тега Ленты в интерфейс входит тег Команд, позволяющий переопределять существующие в Word'е команды, но его мы пока не используем. Находим на левой панели кнопочку ribbon (расположена чуть ниже), и, нажав на неё, вставляем в текущую позицию курсора соответствующий тег. Обратите внимание, что после вставки тегов курсор становится между ними с левым отступом, и редактор сразу готов к вставке следующего вложенного тега.

Тег ribbon вставляется с параметром startFromScratch, имеющий значение по умолчанию false. Этот параметр либо отключает стандартный интерфейс совсем (true), позволяя написать нам его с нуля, либо не отключает (false), позволяя лишь слегка модифицировать имеющийся. Мы пока лишь добавим новую вкладку, поэтому оставим параметр со значением false.

Лента может включать 4 разных элемента — tabs (вкладки), contextualTabs (контектные вкладки), qat (панель быстрого доступа) и officeMenu (кнопка офисного меню). Поскольку мы собрались конфигурировать пока только вкладки, то вставляем тег tabs. Для этого нажимаем на соответствующую кнопку левой панели. Как и в случае с ribbon, кнопка позволяет выбрать одно из вышеописанных значений, но по умолчанию она уже установлена в нужное нам состояние. Обратите внимание, что группы кнопок левой панели редактора для удобства расположены сверху вниз в порядке иерархии вложенности друг в друга соответствующих тегов.

После нажатия на кнопку tabs в позицию курсора вставляется сразу три тега — tabs и единственно возможные вложенные теги tab и group, обозначающие соответственно вкладку и группу внутри вкладки. Теги tab и group имеют обязательные параметры id, в которые следует ввести символьные идентификаторы. Идентификаторы должны быть уникальны в текущем пространстве имён, написаны латинскими буквами и не начинаться с цифры. Дублирование идентификаторов вызовет ошибку, в результате которой модифицируемый нами интерфейс останется прежним. В текущей версии редактора пока нет валидатора, поэтому следите за правильностью ввода сами. Это не так сложно, учитывая возможность автоматической вставки тегов и автозавершения набора существующих идентификаторов. Замечу, что тип вставляемого по умолчанию идентификатора (пользовательский (id), существующий (idMso) или пользовательский для общего пространства имён (idQ)) определяется самой нижней кнопкой на левой панели, которая по умолчанию установлена в состояние id.

Вторым почти обязательным параметром вставленных нами элементов является параметр label, в котором указывается её название, отображающееся в интерфейсе. Замечу, что если переключатель типа идентификатора стоит в положении idMso, то параметр label не вписывается, поскольку встроенные вкладки уже имеют свои названия.

Итак, придумаем идентификатор для нашей вкладки, исходя для удобства из её названия. Назовём вкладку «Основная», а идентификатором будет слово, например, __TabMain. Наши идентификаторы будем начинать с двух знаков подчёркивания «__», чтобы отличать их от идентификаторов встроенных элементов, уже использованных в Word. Добавим в тег вкладки ещё один параметр: insertBeforeMso="TabHome". Он укажет Word'у, что наша вкладка будет помещена перед встроенной вкладкой с идентификатором TabHome (вкладка «Главная»). Нашу первую группу на этой вкладке назовём «Страница». Идентификатором будет слово __GroupPage.

Группы можно заполнить по-разному. Можно сразу накидать в них кнопок, но лучше сначала организовать в группе специальные невизуальные контейнеры (box), чтобы иметь возможность жёстко выстраивать кнопки вертикально или горизонтально и вставлять между контейнерами вертикальные разделительные линии (separator). Контейнер организовывается нажатием на кнопку box. Значения параметра boxStyle (horizontal или vertical) вставляем как и ранее, специальной кнопкой на верхней панели или посредством функции автозаполнения, набрав первую букву значения.

Далее в невизуальные контейнеры можно вставлять кнопки. Если вы хотите визуально обвести группы кнопок, то для этого служит ещё один, уже визуальный контейнер — buttonGroup. Однако, на мой взгляд, обводка кнопок хороша только в случае двухрядного заполнения группы. В случае трёх рядов линии обводки некрасиво слепляются и портят вид.

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

После того, как мы поместили в интерфейс первую кнопку, мы можем проверить её работу. В Ribbon XML Editor нажимаем кнопку «Сохранить документ» и открываем наш документ в Word 2007. Если изменений не произошло, значит, мы допустили ошибку. По своему опыту скажу, что вы наверняка перепутали где-то параметры id и idMso. Это самая частовстречающаяся ошибка. Для приблизительного определения ошибки можно воспользоваться валидатором единственного альтернативного редактора интерфейса Custom UI Editor Tool. В нём удобно проверять, но, к сожалению, неудобно создавать интерфейсы. К сожалению, он не покажет вам место ошибки, но, по крайней мере, сообщит её причину.

В процессе создания интерфейса для удаления совершенно лишних, на мой взгляд, подписей к кнопкам, которые только портят вид, используем свойство showLabel="false". Кроме того, не стоит придавать элементам управления увеличенный размер (size="large"), поскольку элементы такого размера смотрятся негармонично.

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

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

Код вкладки:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="__TabMain" label="Основная" insertBeforeMso="TabHome" >
<group id="__GroupPage" label="Страница">
<box id="__BoxPage1" boxStyle="horizontal">
<control idMso="PageSizeGallery" showLabel="false"/>
<control idMso="PageOrientationGallery" showLabel="false"/>
<control idMso="PageMarginsGallery" showLabel="false"/>
</box>
<box id="__BoxPage2" boxStyle="horizontal">
<control idMso="ZoomOnePage" showLabel="false"/>
<control idMso="ZoomTwoPages" showLabel="false"/>
<control idMso="ZoomPageWidth" showLabel="false"/>
</box>
<box id="__BoxPage3" boxStyle="horizontal">
<control idMso="TableColumnsGallery" showLabel="false"/>
</box>
<dialogBoxLauncher>
<button idMso="PageSetupDialog" />
</dialogBoxLauncher>
</group>
<group id="__GroupFormat" label="Формат">
<box id="__BoxIndents" boxStyle="horizontal">
<control idMso="IndentDecreaseWord" />
<control idMso="IndentIncreaseWord" />
</box>
<box id="__BoxNumbering" boxStyle="horizontal">
<control idMso="BulletsGalleryWord" />
<control idMso="NumberingGalleryWord" />
<control idMso="MultilevelListGallery" />
</box>
<box id="__BoxAlign" boxStyle="horizontal">
<control idMso="AlignLeft" />
<control idMso="AlignCenter" />
<control idMso="AlignRight" />
<control idMso="AlignJustify" />
</box>
<dialogBoxLauncher>
<button idMso="ParagraphDialog" />
</dialogBoxLauncher>
</group>
<group id="__GroupFont" label="Шрифт">
<box id="__BoxFontType1" boxStyle="horizontal">
<control idMso="Font" />
<control idMso="FontSize" />
</box>
<box id="__BoxFontType2" boxStyle="horizontal">
<control idMso="Bold" />
<control idMso="Italic" />
<control idMso="UnderlineGallery" />
<control idMso="Subscript" />
<control idMso="Superscript" />
</box>
<box id="__BoxFontFormat" boxStyle="horizontal">
<control idMso="FormatPainter" showLabel="false" />
<control idMso="ClearFormatting" />
<control idMso="ChangeCaseGallery" />
</box>
<dialogBoxLauncher>
<button idMso="FontDialog" />
</dialogBoxLauncher>
</group>
<group id="__GroupBorders" label="Границы">
<box id="__BoxBordtrs1" boxStyle="horizontal">
<control idMso="BorderNone" showLabel="false" />
<control idMso="BordersAll" showLabel="false" />
<control idMso="BorderInside" showLabel="false" />
<control idMso="BorderOutside" showLabel="false" />
</box>
<box id="__BoxBordtrs2" boxStyle="horizontal">
<control idMso="BorderBottomWord" showLabel="false" />
<control idMso="BorderTopWord" showLabel="false" />
<control idMso="BorderLeftWord" showLabel="false" />
<control idMso="BorderRightWord" showLabel="false" />
</box>
<box id="__BoxBordtrs3" boxStyle="horizontal">
<control idMso="BorderInsideHorizontal" showLabel="false" />
<control idMso="BorderInsideVertical" showLabel="false" />
<control idMso="BorderDiagonalDown" showLabel="false" />
<control idMso="BorderDiagonalUp" showLabel="false" />
</box>
<dialogBoxLauncher>
<button idMso="BordersShadingDialogWord" />
</dialogBoxLauncher>
</group>
<group id="__GroupInsert" label="Вставка">
<box id="__BoxInsert1" boxStyle="horizontal">
<control idMso="TableInsertGallery" showLabel="false" />
<control idMso="TableExcelSpreadsheetInsert" showLabel="false" />
</box>
<box id="__BoxInsert2" boxStyle="horizontal">
<control idMso="PictureInsertFromFile" showLabel="false"/>
<control idMso="GalleryAllShapesAndCanvas" showLabel="false"/>
</box>
<box id="__BoxInsert3" boxStyle="horizontal">
<control idMso="SymbolInsertGallery" showLabel="false"/>
<control idMso="EquationInsertNew" showLabel="false"/>
</box>
<separator id="__sep" />
<box id="__BoxInsert4" boxStyle="horizontal">
<labelControl id="__lcAll" label="Разное:"/>
<control idMso="BreaksGallery" showLabel="false"/>
<control idMso="HeaderFooterPageNumberInsert" showLabel="false"/>
<control idMso="HeaderInsertGallery" showLabel="false"/>
<control idMso="FooterInsertGallery" showLabel="false"/>
</box>
<box id="__BoxInsert5" boxStyle="horizontal">
<labelControl id="__lcContents" label="Оглавление:"/>
<control idMso="TableOfContentsGallery" showLabel="false"/>
<control idMso="TableOfContentsAddTextGallery" showLabel="false"/>
<control idMso="TableOfContentsUpdate" showLabel="false"/>
</box> <box id="__BoxInsert6" boxStyle="horizontal">
<labelControl id="__lcFootnote" label="Сноски:"/>
<control idMso="FootnoteInsert" showLabel="false"/>
<control idMso="EndnoteInsertWord" showLabel="false"/>
<control idMso="FootnoteNext" showLabel="false"/>
<control idMso="FootnotesEndnotesShow" showLabel="false"/>
</box>
</group>
<group id="__GroupMacros" label="Макросы">
<box id="__BoxMacros1" boxStyle="horizontal"> <control idMso="VisualBasic" showLabel="false"/>
</box>
<box id="__BoxMacros2" boxStyle="horizontal">
<control idMso="MacroPlay" showLabel="false"/>
<control idMso="MacroRecordOrStop" showLabel="false"/>
<control idMso="MacroRecorderPause" showLabel="false"/>
</box>
</group>
<group id="__GroupWindow" label="Окно">
<box id="__BoxWindow1" boxStyle="horizontal"> <control idMso="WindowSplit" showLabel="false"/>
<control idMso="WindowNew" showLabel="false"/>
<control idMso="WindowSwitchWindowsMenuWord" showLabel="false"/>
</box>
<box id="__BoxWindow2" boxStyle="horizontal">
<control idMso="WindowSideBySide" showLabel="false"/>
<control idMso="WindowSideBySideSynchronousScrolling" showLabel="false"/>
<control idMso="WindowResetPosition" showLabel="false"/>
</box>
<box id="__BoxWindow3" boxStyle="horizontal"> <control idMso="ViewRulerWord" label="Линейки" />
</box>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

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

[Вернуться в начало]
Часть 2   [Оставить отзыв в гостевой]
Hosted by uCoz