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

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


Этюд 2.3. Встроенные иконки

A computer icon is a small graphic, usually ranging from 16 pixels by 16 pixels to upto 128 pixels by 128 pixels, which represents a file, folder, application or device on a computer system. Icons were first developed as a tool for making computer interfaces easier for novices to grasp in the 1970s at the Xerox Palo Alto Research Center facility. Icon-driven interfaces were later popularized by the Apple Macintosh and Microsoft Windows operating environments.

Icons may also be found on the toolbars and in the menus of programs such as Microsoft Word.

Virtually every major computer operating system now uses icon-based GUIs to display information to end users.

http://www.websters-online-dictionary.org/definition/icon

Ресурсы

Шаблон "AhWordBuiltinIcons.dot" 19 Кб, формат ZIP [скачать].
Шаблон "AhWordBuiltinIcons2.dot" 24 Кб, формат ZIP [скачать].

Шаблон "FaceID.dot" 15 Кб, формат ZIP [скачать] [скачать оригинал].
Шаблон "Icon Generator.dot" 38 Кб, формат ZIP [скачать] [скачать оригинал].
Шаблон "BtnFaces.xla" 17 Кб, формат ZIP [скачать] [скачать оригинал].

Скачать все сразу, 111 Кб, формат ZIP.

 

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

Задача

Создать шаблон для удобной работы со встроенными иконками.

Решение

Встроенные иконки оказались достаточно популярной темой. В сети легко можно найти несколько готовых решений этой задачи. Сначала был создан шаблон "AhWordBuiltinIcons.dot" на основе одного из найденных решений. Затем было найдено еще одно, более красивое, решение задачи, на основании которого был создан еще один шаблон "AhWordBuiltinIcons2.dot". В этом этюде вместе с кратким обзором существующих решений приводятся исходные тексты и описания обоих созданных шаблонов.

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

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

FaceID.dot (Dave Rado, MVPs)

При открытии шаблона "FaceId.dot" с сайта MVPs http://www.mvps.org/ открывается четыре окна со встроенными иконками. Открыв свой шаблон одновременно с "FaceId.dot" можно методом копирования и вставки использовать любую из встроенных икон. При наведении курсора мыши на любую из иконок, возникает всплывающая подсказка с номером FaceId иконки. Самый большой номер иконки 3518.

Интересно, что шаблон не содержит вообще никакого кода на VBA. Только четыре панели инструментов с кнопками.

 

Ссылка: http://word.mvps.org/FAQs/Customization/CustomButtonImages.htm

 

Icon Generator.dot (Орлов А.И.)

При открытии макроса "Icon Generator.dot" с сайта Орлова А.И. (http://orlovs.pp.ru/) доступны три панели инструментов "Best Icons" и панель "Icon Generator".

 

 При нажатии кнопки "Icon Generator" возникает следующий диалог настройки генератора.

После настройки и нажатии кнопки "OK" создается несколько новых документов, в каждом из которых создаётся указанное количество панелей инструментов и встроенными кнопками. На следующей картинке приводится примерный вид одного из документов.

Используя метод копирования и вставки с помощью диалога "Customize" можно использовать любую из встроенных иконок в своих шаблонах.

Доступен код создания панелей на Visual Basic. FaceId кнопок не показываются.

Ссылка: http://orlovs.pp.ru/soft.php

 

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

Ресурсы

Шаблон "AhWordBuiltinIcons.dot", 19 Кб, формат ZIP [скачать].

 

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

 

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

Макрос

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

Help

AhBuiltInIconsHelp

 

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

Create Toolbars

AhBuiltInIconsCreate

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

Delete Toolbars

AhBuiltInIconsDelete

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

 

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

Создание панелей со встроенными иконками

При нажатии кнопки "Create Toolbars" создаются панели инструментов с встроенными кнопками.

Удаление панелей с встроенными иконками

При нажатии кнопки "Delete Toolbars" созданные панели инструментов удаляются.

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

'
' File AhWordBuiltinIcons.dot|AhWordBuiltinIcons
'
' Etudes for Microsoft Word Programmers.
' Etude 2.3. Built-in Icons (Solution #1).
'
' First published on http://www.transcriber.ru
'
' © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide.
'

Option Explicit
'
' Ah! 29-Nov-2005. Builtin Word Icons
'
Const ui1000Index = 1
Const uiMaxIconsOnTheBar As Long = 50
Const strToolBarRootName As String = "AhBuiltinIcons"
'
' AhBuiltInIconsHelp
'
Sub AhBuiltInIconsHelp()
MsgBox "Etudes for Microsoft Word Programmers." & vbCrLf & _
   "Etude 2.3. Built-in Icons (Solution 1)." & vbCrLf & _
   "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
   "Create - creates 20 toolbars, each contains 50 icons" & vbCrLf & _
   "Delete - deletes just created toolbars" & vbCrLf & vbCrLf & _
   "ui1000Index (hardcoded in the template) = [1-4] - Thousand index."

End Sub
'
' AhGetTBarName
'
Private Function AhGetTBarName(ByVal nBar As Long) As String
    AhGetTBarName = strToolBarRootName & CStr(nBar)
End Function
'
' AhBuiltInIconsCreate
'
Sub AhBuiltInIconsCreate()
Dim n As Long
Dim nBar As Long
Dim cbar As CommandBar
Dim butt As CommandBarControl
Dim strToolTip As String
Dim uiMinIconIndex As Long
Dim uiMaxIconIndex As Long
    uiMinIconIndex = (ui1000Index - 1) * 1000 + 1
    uiMaxIconIndex = (ui1000Index) * 1000
   
    nBar = 1
    Set cbar = CommandBars.Add(Name:=AhGetTBarName(nBar), Position:=msoBarTop, Temporary:=True)
    cbar.Visible = True
 
    For n = uiMinIconIndex To uiMaxIconIndex
        Set butt = cbar.Controls.Add(Type:=msoControlButton, ID:=797)
        With butt
            .FaceId = n
            strToolTip = "FaceId = " & CStr(n)
            .TooltipText = strToolTip
            If (n - uiMinIconIndex + 1) Mod uiMaxIconsOnTheBar = 0 And (n <> uiMaxIconIndex) Then
               
nBar = nBar + 1
                Debug.Print "nBar = " & nBar & " n = " & n & Chr(13)
               
                Set cbar = CommandBars.Add(Name:=AhGetTBarName(nBar), Position:=msoBarTop, Temporary:=True)
                cbar.Visible = True
            End If
        End With
    Next n
End Sub
'
' AhBuiltInIconsDelete
'
Sub AhBuiltInIconsDelete()
Dim nBar As Long
    On Error Resume Next
    For nBar = 1 To 40
        CommandBars(strToolBarRootName & CStr(nBar)).Delete
    Next nBar
End Sub

 

Второе решение на основе шаблона Джима Реча "ButtonFaces.xla"

После того, как была создана первая версия шаблона "AhWordBuiltinIcons.dot", нашлось практически идеальное решение "ButtonFaces.xla" Джима Реча (Jim Rech) для Microsoft Excel. Код был адаптирован для Microsoft Word и помещен в шаблон "AhWordBuiltinIcons2.dot".

Ссылка: http://www.oaltd.co.uk/MVP/Default.htm

Ресурсы

Шаблон "AhWordBuiltinIcons2.dot", 24 Кб, формат ZIP [скачать].

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

 

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

Макрос

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

Help

AhBuiltInIcons2Help

 

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

Show

AhBuiltInIcons2Show

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

Hide

AhBuiltInIcons2Hide

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

 

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

Создание панели со встроенными иконками

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

Кнопка

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

Всплывающая подсказка

В начало.

Предыдущие 100 иконок. При нажатой клавише Shift - следующие 1000 иконок.

 

Следующие 100 иконок. При нажатой клавише Shift - предыдущие 1000 иконок.

В конец.

Скрыть панель инструментов.

 

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

'
' File AhWordBuiltinIcons2.dot|AhWordBuiltinIcons2
'
' Etudes for Microsoft Word Programmers.
' Etude 2.3. Built-in Icons (Solution 2).
'
' First published on http://www.transcriber.ru
'
' © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide.
'
' 17-Jan-2006. Jim Rech. "ButtonFaces.xla" project was adopted for MS Word.
' From The Excel MVP Page http://www.oaltd.co.uk/MVP/Default.htm
'
Option Explicit
 
Declare Function GetKeyState32 Lib "user32" Alias "GetKeyState" (ByVal vKey As Integer) As Integer
 
Const CtrlStNum As Integer = 108
 
Dim LastStartNumber As Long
Dim MaxStartNum As Long
Dim BtnFaceCB As CommandBar
Const strHelpEng As String = _
"This shows the button faces built into Microsoft Word." & vbCrLf & _
"You can use them in your own command bars " & vbCrLf & _
"(e.g., Commandbars(""X"").Controls(1).FaceID = 10). " & vbCrLf & _
"The number of FaceIDs available varies with the Word version, " & vbCrLf & _
"newer versions having more."
Const strHelpRus As String = _
"
Просмотр встроенных иконок Microsoft Word.  " & vbCrLf & _
"
Вы можете использовать их в своих панелях инструментов " & vbCrLf & _
"(
например, Commandbars(""X"").Controls(1).FaceID = 10).  " & vbCrLf & _
"Количество доступных иконок зависит от версии. " & vbCrLf & _
"В более новых версиях MS Word их обычно больше, чем в старых."
'
'
AhBuiltInIcons2Help
'
Sub AhBuiltInIcons2Help()
MsgBox "Etudes for Microsoft Word Programmers." & vbCrLf & _
  "Etude 2.3. Built-in Icons (Solution 2)." & vbCrLf & _
  "Jim Rech's 'ButtonFaces.xla' project was adopted for Microsoft Word." & _
  "http://www.transcriber.ru" & vbCrLf & vbCrLf & _
  strHelpEng
End Sub
'
' AhBuiltInIcons2Show
'
Sub AhBuiltInIcons2Show()
    ToolFaceCtrl
End Sub
'
' AhBuiltInIcons2Hide
'
Sub AhBuiltInIcons2Hide()
    KillCB
End Sub
'
' ToolFaceCtrl
'
Private Sub ToolFaceCtrl()
    KillCB
    MakeMainToolbar
    AdNavBtns
    AttachFaces 0
End Sub
'
' MakeMainToolbar
'
Private Sub MakeMainToolbar()
    Dim Ctrl As CommandBarControl
    Dim Counter As Integer
    Dim HoldWidth As Integer
    Set BtnFaceCB = CommandBars.Add("ButtonFaces", msoBarFloating, False, True)
    With BtnFaceCB
        .Protection = msoBarNoChangeVisible + msoBarNoResize + msoBarNoChangeDock
        .Top = GetSetting("JRRUtils", "BtnFacesTB", "Top", Application.Top + 50)
        .Left = GetSetting("JRRUtils", "BtnFacesTB", "Left", (Application.Left + Application.Width * 0.4))
        For Counter = 1 To 120
            With .Controls.Add(msoControlButton, 1)
                .FaceId = 1
            End With
            If Counter = 20 Then
                .Visible = True
                HoldWidth = .Width ''True width doesn't "happen" unless TB is visible
                .Visible = False
            End If
        Next
        MaxStartNum = MaxHundredStartNumber(.Controls(1))
        .Visible = True
        .Width = HoldWidth ''Width won't change unless TB is visible
        .Protection = msoBarNoChangeVisible + msoBarNoResize + msoBarNoChangeDock
        SetHelp
    End With
End Sub
'
' NextHundred
'
Private Sub NextHundred()
    If LastStartNumber < MaxStartNum Then
        If ShiftDown Then ''Go 1000 instead of 100
            AttachFaces MinOfTwo(MaxStartNum, LastStartNumber + 1000)
        Else
            AttachFaces LastStartNumber + 100
        End If
    End If
End Sub
'
' PriorHundred
'
Private Sub PriorHundred()
    If LastStartNumber >= 100 Then
        If ShiftDown Then
            AttachFaces MaxOfTwo(0, LastStartNumber - 1000)
        Else
            AttachFaces LastStartNumber - 100
        End If
    End If
End Sub
'
' LastHundred
'
Private Sub LastHundred()
    AttachFaces MaxStartNum
End Sub
'
' FirstHundred
'
Private Sub FirstHundred()
    AttachFaces 0
End Sub
'
' AttachFaces
'
Private Sub AttachFaces(StartNum As Long)
    Dim Counter As Integer
    On Error GoTo TooHigh
    LastStartNumber = StartNum
    SetNavBtnEnables
    With BtnFaceCB
        .Name = "Button Faces  (" & StartNum + 1 & " - " & StartNum + 100 & ")"
        For Counter = 1 To 100
            .Controls(Counter).FaceId = Counter + StartNum
            .Controls(Counter).TooltipText = Counter + StartNum
        Next
    End With
    Exit Sub
TooHigh:
    BtnFaceCB.Name = "Button Faces  (" & StartNum + 1 & " - " & StartNum + Counter - 1 & ")"
    ClearUnusedFaces Counter
End Sub
'
' ClearUnusedFaces
'
''When the last group is displayed this removes
'' the picture and tooltip from the unused buttons
Private Sub ClearUnusedFaces(FirstBtn As Integer)
    Dim Counter As Integer
    For Counter = FirstBtn To 100
        With BtnFaceCB.Controls(Counter)
            .FaceId = 1
            .TooltipText = ""
        End With
    Next
End Sub
'
' KillCB
'
Private Sub KillCB()
    On Error GoTo EndThis
    With BtnFaceCB
        SaveSetting "JRRUtils", "BtnFacesTB", "Top", .Top
        SaveSetting "JRRUtils", "BtnFacesTB", "Left", .Left
        .Delete
    End With
EndThis:
End Sub
'
' AdNavBtns
'
Private Sub AdNavBtns()
    With BtnFaceCB
         With .Controls(CtrlStNum)
            .FaceId = 154
            .OnAction = "FirstHundred"
            .TooltipText = "First group"
            .BeginGroup = True
        End With
        With .Controls(CtrlStNum + 1)
            .FaceId = 155
            .OnAction = "PriorHundred"
            .TooltipText = "Previous group" & vbCrLf & "Shift down to go back 1000"
         End With
         With .Controls(CtrlStNum + 2)
            .FaceId = 156
            .OnAction = "NextHundred"
            .TooltipText = "Next group" & vbCrLf & "Shift down to advance 1000"
        End With
        With .Controls(CtrlStNum + 3)
            .FaceId = 157
            .OnAction = "LastHundred"
            .TooltipText = "Last group"
        End With
        With .Controls(CtrlStNum + 4)
            .FaceId = 478
            .OnAction = "KillCB"
            .TooltipText = "Close"
         End With
        With .Controls(CtrlStNum + 5)
            .BeginGroup = True
         End With
   
    End With
End Sub
'
' SetNavBtnEnables
'
Private Sub SetNavBtnEnables()
    With BtnFaceCB
        .Controls(CtrlStNum).Enabled = (LastStartNumber <> 0)
        .Controls(CtrlStNum + 1).Enabled = (LastStartNumber <> 0)
        .Controls(CtrlStNum + 2).Enabled = (LastStartNumber <> MaxStartNum)
        .Controls(CtrlStNum + 3).Enabled = (LastStartNumber <> MaxStartNum)
    End With
End Sub
'
' MaxHundredStartNumber
'
''Returns to highest FaceID in the running version of Excel, rounded
'' down to the lower multiple of 100.  This determines the starting point
'' of the last button group.
Private Function MaxHundredStartNumber(Btn2Use As CommandBarButton) As Long
    Dim Counter As Long, Incr As Integer
    Dim BeginCounter As Integer
    On Error GoTo ErrHandler
    Incr = 1000
    BeginCounter = 1000
BeginSmallLoop:
    For Counter = BeginCounter To 10000000# Step Incr
        Btn2Use.FaceId = Counter
    Next
ErrHandler:
    If Incr = 1000 Then
        BeginCounter = Counter - 1000 + 100
        Incr = 100
        Resume BeginSmallLoop
    Else
        MaxHundredStartNumber = Counter - 100
    End If
End Function
'
' SetHelp
'
Private Sub SetHelp()
    With BtnFaceCB.Controls(101)
        .FaceId = 49
        .TooltipText = strHelpRus
    End With
End Sub
'
' MinOfTwo
'
Private Function MinOfTwo(Long1 As Long, Long2 As Long) As Long
    MinOfTwo = IIf(Long1 < Long2, Long1, Long2)
End Function
'
' MaxOfTwo
'
Private Function MaxOfTwo(Long1 As Long, Long2 As Long) As Long
    MaxOfTwo = IIf(Long1 < Long2, Long2, Long1)
End Function
'
' ShiftDown
'
Private Function ShiftDown() As Boolean
    ShiftDown = (GetKeyState32(16) < 0)
End Function

Выводы

Рассмотрена работа со встроенными иконками. Любая встроенная иконка может быть использована как в визуальном, так и в программном режиме создания панели инструментов.

Задания

Задание 1

В приведенной реализации макросы шаблона "AhWordBuiltinIcons.dot" создают 20 новых панелей инструментов по 50 кнопок на каждой. Это позволяет одновременно видеть только тысячу иконок. Чтобы изменить индекс показываемой тысячи, требуется внести небольшие изменения в код шаблона, используя редактор Visual Basic.

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

 

Задание 2

Повторное нажатие на кнопку "Create" в шаблоне "AhWordBuiltinIcons.dot" вызывает макрос AhBuiltInIconsCreate, который создает следующие 20 панелей, не обращая внимания на то, что панели с создаваемыми именами уже существуют. Таким образом, Microsoft Word допускает существование панелей инструментов с одинаковыми именами,

хотя и не разрешает создание таких панелей в "визуальном" режиме.

Угадайте - это баг (ошибка программистов Microsoft) или фича (так и задумано)?

Напишите процедуру с сигнатурой

 

Function ToolbarExists (strToolBarName As String) As Boolean

которая возвращает True только в случае, если панель инструментов с заданным именем существует.

Используйте написанную функцию для проверки существования панели с заданным именем и, если панель существует, не создавайте новую панель с таким же именем.

 

Задание 3

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

 

 

Этюды для программистов Microsoft Word. Этюд 2.3. Встроенные иконки.


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