Этюды для программистов Microsoft Word

Home ] Up ] Этюд 2.1. Встроенные панели инструментов ] Этюд 2.2. Программное создание панели инструментов ] Этюд 2.3. Встроенные иконки ] Этюд 2.4. Инструменты для работы с картинками ] Этюд 2.5. Изменяемая панель инструментов ]


Этюд 2.4. Инструменты для работы с картинками

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

Джоэл Спольски. Секрет айсберга.

 

В предыдущем этюде было рассмотрено программное создание панели инструментов с элементами управления разных типов.

Рассмотрим теперь вопрос о программной вставке иконок и других графических элементов. Для работы с картинками предназначены функции управляющих элементов CopyFace() и PasteFace(). Функция CopyFace() копирует имеющееся у элемента изображение в буфер обмена, функция PasteFace() вставляет изображение элемента из буфера обмена. С помощью CopyFace() можно получить только уже имеющиеся на других элементах изображения.

Для использования "своих" картинок требуется приложить дополнительные усилия. В этом этюде мы рассмотрим создание иконки с помощью специальной динамической библиотеки, а также создание иконки на основе графического файла. Годится графический файл любого формата (BMP, JPG, GIF, TIF и многие другие), который может быть вставлен в документ Microsoft Word.

Утилита Clip2File также является инструментом для работы с иконками.

 

Назначение

Утилита для работы с буфером обмена "Clip2File.exe" предназначена для сохранения информации из буфера обмена в файле и восстановления информации из предварительно сохраненного файла в буфер обмена. Сохраняемые файлы имеют специальный формат. Кроме того, утилита умеет копировать картинку из файла формата BMP в буфер обмена.

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

Ресурсы

Программа "Clip2File.exe", 82 Кб, формат ZIP,  [скачать].

Исходные тексты проекта Clip2File [позже!].

Страница программы Clip2File

Главное окно

Главное окно утилиты имеет следующий вид:

Основные функции

В следующей таблице кратко описаны основные функции утилиты "Clip2File.exe".

Кнопка

Описание

Save CB

Сохранить данные из буфера обмена во внутреннем буфере программы. Предыдущие данные из внутреннего буфера теряются.

Restore CB

Восстанановить данные буфера обмена из внутреннего буфера программы.

Browse

Выбрать файл для команды "File2Clip" или "Bitmap File2Clip".

Clip2File

Сохранить данные из буфера обмена в указанном файле.  Данные сохраняются в специальном формате.

File2Clip

Восстановить данные буфера обмена из указаного файла.  Файл должен быть создан с помощью команды "Clip2File".

Bitmap File2Clip

Восстановить данные буфера обмена из указаного файла. Файл должен иметь формат BMP.

Close

Закрыть окно программы Clip2File.exe

Ресурсы

Шаблон "AhWordIcons1.dot" предназначен для работы совместно с библиотекой AhWordImages.dll 105 Кб, формат ZIP [скачать].

Библиотека AhWordImages.dll

Библиотека AhWordImages.dll экспортирует функцию CopyWordImage(imageId),
которая копирует в буфер обмена набор заранее подготовленных картинок.
Картинки хранятся в ресурсах библиотеки.

По аналогии можно использовать любую библиотеку с нужными картинками.

Исходные тексты проекта AhWordImages [позже!].

Страница программы Clip2File

Перед использованием динамическая библиотека AhWordImages.dll должна быть скопирована в системную папку (обычно это "C:\Windows\System32").

Функциональная спецификация

Задача

Алгоритм создания иконки управляющего элемента Microsoft Word "вручную" состоит из следующих шагов:

  1. создание новой или открытие имеющейся картинки в любом графическом редакторе

  2. копирование изображения в буфер обмена

  3. использование в коде на VBA функции управляющего элемента PasteFace()

Требуется создать шаблон "AhWordIcons1.dot", демонстрирующий возможности использования пользовательских изображений для иконки кнопки панели инструментов Microsoft Word.
Первая возможность - это вставка изображения, хранящегося в динамической библиотеке.
Вторая возможность - это вставка изображения из любого графического файла.

Динамическая библиотека (назовем её "AhWordImages.dll") должна экспортировать функцию

CopyWordImage(imageId),

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

Тогда следующий код на VBA создает иконку управляющего элемента Microsoft Word на основании изображения из библиотеки номер imageId.

' объявление внешней функции
Declare Function CopyWordImage Lib "AhWordImages.dll" (imageId As Long) As Long
 
With CommandBarControls.Item(1)    ' нужный элемент управления
      .Caption = "Caption"         ' заголовок
      CopyWordImage imageId        ' копирование картинки в буфер обмена
      .PasteFace                   ' вставка картинки из буфера обмена
End With

Панель инструментов

Шаблон "AhWordIcons1.dot" содержит ряд макросов и панель инструментов "Testing AhWordImages.dll", предназначенных для тестирования функций изменяющих иконку кнопки панели инструментов Microsoft Word.

Панель инструментов "Testing AhWordImages.dll" имеет следующий вид:

Кнопка панели

Макрос

Краткое описание

Help

AhWordImagesHelp

Краткая подсказка по кнопкам панели инструментов.

Image id =

AhTestWordImagesDLL

Вставка иконки из библиотеки.

Image From File

AhWordImageFromFileTest

Вставка иконки из указанного файла.

Краткая подсказка по кнопкам панели инструментов

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

Вставка иконки из библиотеки

Для вставки очередной иконки из библиотеки пользователь нажимает кнопку "Image id" (вторая кнопка панели инструментов). В результате иконка второй кнопки панели инструментов изменяется:

 

Вставка иконки из графического файла

Для вставки иконки из графического файла пользователь нажимает кнопку "Image From File", вводит путь файла в появившемся диалоге и нажимает кнопку "OK".

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

Реализация - шаблон "AhWordIcons1.dot"

Объявление библиотечной функции

'
' File AhWordIcons1.dot|AhWordIcons1
'
' Etudes for Microsoft Word Programmers.
' Etude 2.4. Icon Instruments.
'
' First published on http://www.transcriber.ru
'
' © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide.
'
Option Explicit
Declare Function CopyWordImage Lib "AhWordImages.dll" (ByVal imageId As Long) As Long
Dim dwImageId As Long
 

Константы

'
' Constants
'
Const strThisToolBarName As String = "Testing AhWordImages.dll"
Const uiTargetButtonIndex As Long = 2

Процедура AutoExec

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

'
' AutoExec
'
' !!! This will run only if template is in the Startup folder.
'
Sub AutoExec()
    dwImageId = 1
    With CommandBars(strThisToolBarName).Controls.Item(uiTargetButtonIndex)
        .Style = msoButtonIconAndCaption
        .Caption = "Press button to test CopyWordImage function"
   
End With
End Sub

Процедура AhWordImagesHelp

'
' AhWordImagesHelp
'
Sub AhWordImagesHelp()
    MsgBox "Etudes for Microsoft Word Programmers." & vbCrLf & _
        "Etude 2.4. Icon Instruments (AhWordIcons1.dot)." & vbCrLf & _
        "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
        "Image id - inserts next icon from AhWordImages.dll" & vbCrLf & _
        "Image From File - inserts button icon from graphic file"
   
AutoExec
End Sub

Процедура AhTestWordImagesDLL

'
' AhTestWordImagesDLL
'
Sub AhTestWordImagesDLL()
Dim dwResult As Long
Dim strLabel As String
    ' assume 1st item is "Help"
    With CommandBars(strThisToolBarName).Controls.Item(uiTargetButtonIndex)
        .Style = msoButtonIconAndCaption
        dwResult = CopyWordImage(dwImageId)
        If 0 = dwResult Then
            strLabel = "Image id = " & dwImageId
            .PasteFace
        Else
            strLabel = "Image id = " & dwImageId & " is invalid."
            dwImageId = 0
        End If
        .Caption = strLabel
    End With
   
dwImageId = dwImageId + 1
End Sub

Процедура AhWordImageFromFile

'
' AhWordImageFromFile
'
Sub AhWordImageFromFile(ByVal strImageFilePath As String)
Dim oShape As Shape
    '
    ' Add picture to the document's Shapes collection,
    ' select it, copy to the clipboard and delete.
    '
    Set oShape = ActiveDocument.Shapes.AddPicture(FileName:=strImageFilePath)
    oShape.Select
    Selection.CopyAsPicture
    Selection.Delete

    With CommandBars(strThisToolBarName).Controls.Item(uiTargetButtonIndex)
        .PasteFace
    End With

    Set oShape = Nothing
End Sub

Процедура AhWordImageFromFileTest

' AhWordImageFromFileTest
'
Sub AhWordImageFromFileTest()
If Documents.Count = 0 Then Exit Sub    ' AhWordImageFromFile() requires open document
Dim strImageFilePath As String
Dim strImageFilePathDef As String
   
    strImageFilePathDef = ActiveDocument.AttachedTemplate.Path + "\" + "flag_rus.gif"
   
    strImageFilePath = InputBox("Enter path to graphic file", "AhWordImageFromFileTest", strImageFilePathDef)
    If Len(strImageFilePath) = 0 Then Exit Sub
   
    Dim bFileExists As Boolean
    Dim fs
    Set fs = CreateObject("Scripting.FileSystemObject")
    bFileExists = fs.FileExists(strImageFilePath)
    Set fs = Nothing
   
    If Not bFileExists Then
        MsgBox "File <" & strImageFilePath & "> doesn't exist."
        Exit Sub
    End If
   
   
    On Error GoTo ErrorLabel
    AhWordImageFromFile strImageFilePath
    Exit Sub
   
ErrorLabel:
    MsgBox _
    "AhWordImageFromFile: error pasting file <" & strImageFilePath & _
    ">. Toolbar = <" & strThisToolBarName & _
    ">. Button index = " & CStr(uiTargetButtonIndex)
End Sub

Выводы

Утилита "Clip2File.exe" предназначена для работы с буфером обмена и позволяет сохранять содержимое буфера обмена в файле.

Библиотека "AhWordImages.dll", содержит файлы ранее сохраненных иконок в виде ресурсов и экспортирует функцию CopyWordImage(), которая вызывается из кода VBA и используется для копирования иконок в буфер обмена.

Шаблон "AhWordIcons1.dot" содержит панель инструментов "Testing AhWordImages.dll", демонстрирующую работу с пользовательскими иконками - вставку иконки из динамической библиотеки и из любого графического файла.

Задания

Задание 1

Изучите свойства и методы объекта Shape и коллекции Shapes - вдруг да найдется еще что-нибудь полезное.

 

Задание 2

В приведенном коде есть недостатки. Во-первых, используется коллекция Shapes текущего документа. Соответственно для работы макроса требуется наличие хотя бы одного открытого документа.
Во-вторых, при копировании и вставке картинки "портится" текущее выделение, то есть теряются свойства объекта selection. Сможете ли Вы устранить эти недостатки?

 

Задание 3

Изучите свойства и методы объекта CommandBarButton, включая свойства Picture и Mask, возвращающие объекты типа IPictureDisp.

Обратите внимание на то, что в коде примеров используется объект stdole и методы LoadPicture и SavePicture его свойства StdFunctions, в то время как в справочной информации Microsoft Word  объект stdole вообще не описан. Найдите и изучите описания объектов stdole и IPictureDisp.

Напишите макрос, сохраняющий все иконки (и маски) любой панели инструментов на диске. Используйте свойства и методы объекта stdole.

 


Этюды для программистов Microsoft Word. Этюд 2.4. Инструменты для работы с картинками.


© 2000-2009 Евгений Ахунджанов, Все Права Сохранены.
www.transcriber.ru | Послать письмо автору