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

Home ] Up ] Этюд 3.1. Работа со свойствами документа. ] Этюд 3.2. Переопределение поведения Drag-n-Drop для окна документа Microsoft Word ] Этюд 3.3. Microsoft Word как сервер автоматизации. ] Этюд 3.4. Транскрайбер ]


Этюд 3.2. Переопределение поведения Drag-n-Drop для окна документа Microsoft Word

"Drag and Drop",сокращенно DnD, (читается как "дрэг энд дроп", переводится как "перетащить и бросить") является названием технологии работы с объектами в оконном интерфейсе. Пользователь может перетаскивать куски текста, файлы и другие объекты как из одного места окна в другое, так и между окнами различных приложений. Разумеется, для того, чтобы перетаскивание работало, приложения должны поддерживать эту технологию.

В этом этюде рассматривается простая реализация переопределения поведения Drag-n-Drop для Microsoft Word, состоящая из шаблона "AhCustomDragDrop.dot" (VBA) и библиотеки "AhCustomDragDrop.dll" (C++). Исходные тексты библиотеки не включены.

Ресурсы

Шаблон "AhCustomDragDrop.dot" и библиотека "AhCustomDragDrop.dll"
 
37 Кб, формат ZIP [скачать].

Исходные тексты проекта AhCustomDragDrop.dll (C++)  [позже!].

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

 

После тестирования приведенного шаблона для восстановления нормальной функциональности Drag-n-Drop для Microsoft Word следует удалить шаблон "AhCustomDragDrop.dot" из папки глобальных шаблонов, чтобы исключить его автоматическую загрузку при старте Microsoft Word.

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

Задача

При использовании Microsoft Word в качестве одной из частей большой программной системы часто возникает необходимость переопределения поведения Drag-n-Drop для окон документов, например, для перетаскивания и бросания объектов, специфических для рассматриваемой системы.

Задача состоит в создании шаблона "AhCustomDragDrop.dot" и библиотеки "AhCustomDragDrop.dll", совместная работа которых демонстрирует возможность переопределения стандартного поведения механизма Drag-n-Drop для окон документов Microsoft Word.

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

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

т

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

Макрос

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

Help

AhCustomDragDrop2Help

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

Examine

AhCustomDragDrop2Examine

Информация об активном окне. В случае отсутствия открытых документов показывает информацию о главном окне Microsoft Word.

Краткая подсказка

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

Проверка окна

При нажатии кнопки "Examine" появляется сообщение о том, зарегистрировано текущее окно Microsoft Word или нет. Сообщение имеет следующий вид.

Сообщение для окна документа.
Сообщение для главного окна
Microsoft Word.

Тестирование

и уронить например,

Перенос текста
Перенос файла
Пользовательский формат переносимых данных

 

Реализация - библиотека AhCustomDragDrop.dll

Программисты VBA, не знакомые с C++, спокойно могут пропустить этот раздел.

Назначение

Библиотека предназначена для переопределения Drag-n-Drop поведения Microsoft Word и используется вместе с шаблоном "AhCustomDragDrop.dot".

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

Описание

Библиотека экспортирует функции AhDropRegisterWindow, AhDropUnRegisterWindow, AhDropUnRegisterAll и AhDropIsRegisteredWindow. Файл экспорта библиотеки приведен ниже.

;
; File AhCustomDragDrop.def
;
; © 2001-200
8. Evgeny Akhundzhanov. All rights reserved.
;
LIBRARY      "AhCustomDragDrop"
DESCRIPTION  'AhCustomDragDrop Windows Dynamic Link Library'
 
EXPORTS
    ; Explicit exports can go here
      AhDropRegisterWindow

      AhDropUnRegisterWindow

      AhDropUnRegisterAll

      AhDropIsRegisteredWindow

Исходные тексты C++

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

Как это устроено

В реализации технологии Drag-n-Drop участвуют по крайней мере два окна - окно-источник (source window) и окно-мишень (target window). Пользователь нажимает кнопку мыши в окне-источнике и, удерживая кнопку нажатой, перетаскивает указатель мыши в окно-мишень, где отпускает кнопку мыши. Окно-мишень может совпадать с окном-источником. Перетаскиваемые данные обычно ассоциируются с выделенными в окне-источнике объектами, но это не обязательно.

Окно-источник реагирует на нажатие кнопки мыши вызывая функцию DoDragDrop. Кроме того, это окно должно предоставить указатель на реализацию интерфейса IDropSource и IDataObject.

Окно-мишень предоставляет указатель на реализацию интерфейса IDropTarget. Указатель должен быть предварительно зарегистрирован в системе с помощью вызова функции RegisterDragDrop.

Функция RegisterDragDrop имеет следующий прототип.

WINOLEAPI  RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget);

Для удаления регистрации окна используется функция RevokeDragDrop со следующим прототипом.

WINOLEAPI  RevokeDragDrop(HWND hwnd);

Слежение за окнами документов Microsoft Word

Для слежения за окнами документов Microsoft Word приходится отслеживать процессы создания и удаления окон документов. Создание новых окон происходит при создании новых документов или открытии существующих документов любыми возможными способами. Удаление окон происходит при закрытии документа.

Самым простым способом отслеживания указанных процессов является перехват событий приложения - события открытия документа (_DocumentOpen), события создания нового документа (_NewDocument) и события закрытия документа (_DocumentBeforeClose).

Для перехвата событий необходим модуль класса, содержащий объект типа Word.Application с описателем "WithEvents".

Public WithEvents AhWordApp As Word.Application

Для автоматического создания и удаления объекта приложения лучше всего использовать автоматические макросы AutoExec и AutoExit.

Интерфейс IDropTarget

Информация взята с сайта Microsoft http://msdn.microsoft.com

 Краткое описание функций интерфейса IDropTarget приведено в следующей таблице.

Функция

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

DragEnter

Determines whether a drop can be accepted and its effect if it is accepted.

DoDragDrop calls IDropTarget::DragEnter when it detects the mouse has moved over a window that is registered as a drag target.

DragOver

Provides target feedback to the user through the DoDragDrop function.

Once the mouse has entered a drag-target window, DoDragDrop calls DragOver as the mouse moves through the window.

DragLeave

Causes the drop target to suspend its feedback actions.

DoDragDrop calls IDropTarget::DragLeave if the mouse leaves the target window or if the user cancels or completes the drag-and-drop operation.

Drop

Drops the data into the target window.

DoDragDrop calls IDropTarget::Drop if the drop finally occurs.

 You do not call the methods of IDropTarget directly.

The DoDragDrop function calls the IDropTarget methods during the drag-and-drop operation.

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

Шаблон содержит панель инструментов "AhCustomDragDrop" и соответствующие макросы.

Модуль "AhCustomDragDrop"

'
' File AhCustomDragDrop.dot|AhCustomDragDrop
'
' Etudes for Microsoft Word Programmers.
' Etude 3.2. Customizing Drag-n-Drop.
'
' First published on http://www.transcriber.ru
'
' © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide.
'
Option Explicit
 
'
' Globals
'
Dim xxx As New AhWordApplication ' Word "With Events" Application
Dim bIsActivated As Boolean
 
'
' External
'
Private Declare Function AhDropRegisterWindow Lib "AhCustomDragDrop.dll" (ByVal strTitle As String) As Long
Private Declare Function AhDropUnRegisterWindow Lib "AhCustomDragDrop.dll" () As Long
Private Declare Function AhDropUnRegisterAll Lib "AhCustomDragDrop.dll" () As Long
Private Declare Function AhDropIsRegisteredWindow Lib "AhCustomDragDrop.dll" () As Long
 

Процедура AutoExec

Обратите внимание, что для работы шаблона необходимо, чтобы перед запуском Microsoft Word шаблон находился в папке автозагрузки.
В противном случае запустите макрос AutoExec вручную.

 

'
' AutoExec
'
Sub AutoExec()
    If bIsActivated = True Then Exit Sub
   
    Set xxx.AhWordApp = Word.Application
    bIsActivated = True
   
    '
    ' register active window
    '
    AhRegisterCurrentWindow

   

End Sub

Процедура AutoExit

'
' AutoExit
'
Sub AutoExit()
    On Error Resume Next
    Set xxx.AhWordApp = Nothing
   
    AhDropUnRegisterAll

End Sub

Процедура AhCustomDragDrop2Help

'
' AhCustomDragDrop2Help
'
Sub AhCustomDragDrop2Help()
MsgBox "Etudes for Microsoft Word Programmers." & vbCrLf & vbCrLf & _
"Etude 3.2. Customizing Drag-n-Drop." & vbCrLf & _
" © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide." & vbCrLf & _
"http://www.transcriber.ru" & vbCrLf & vbCrLf & _
"Template 'AhCustomDragDrop.dot' - " & vbCrLf & vbCrLf & _
"Examine - examines whether current active window is registered or not." & vbCrLf & vbCrLf & _
"For testing just drop something (text or file) to the Microsoft Word document window."
End Sub

Процедура AhCustomDragDrop2Examine

'
' AhCustomDragDrop2Examine
'
Sub AhCustomDragDrop2Examine()
    AhDropIsRegisteredWindow    ' displays message box
End Sub

Процедура AhRegisterCurrentWindow

'
' AhRegisterCurrentWindow
'
Sub AhRegisterCurrentWindow()
    Dim strTitle As String
    If Documents.Count = 0 Then
        strTitle = "MS_Word_Frame" ' special name, window will not be registered.
    Else
        strTitle = ActiveDocument.Name
    End If
   
    AhDropRegisterWindow strTitle

   

End Sub

Процедура AhUnRegisterCurrentWindow

'
' AhUnRegisterCurrentWindow
'
Sub AhUnRegisterCurrentWindow()
If Documents.Count = 0 Then Exit Sub
    AhDropUnRegisterWindow

End Sub

 

Модуль класса "AhWordApplication"

'
' File AhCustomDragDrop.dot|AhWordApplication
'
' Etudes for Microsoft Word Programmers.
' Etude 3.2. Customizing Drag-n-Drop.
'
' First published on http://www.transcriber.ru
'
' © 2000-2008. Evgeny Akhundzhanov. All rights reserved worldwide.
'
'
Option Explicit
'
Public WithEvents AhWordApp As Word.Application
 

Процедура Class_Initialize - конструктор

'
' Constructor
'
Private Sub Class_Initialize()
End Sub

Процедура Class_Terminate - деструктор

'
' Destructor
'
Private Sub Class_Terminate()
End Sub

Процедура AhWordApp_Quit

'
' Quit handler
'
Private Sub AhWordApp_Quit()
End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события OnClose

'
' DocumentBeforeClose
'
Private Sub AhWordApp_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
    Debug.Print "DocumentBeforeClose"
    AhUnRegisterCurrentWindow
End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события OnSave

'
' DocumentBeforeSave
'
Private Sub AhWordApp_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
    Debug.Print "DocumentBeforeSave"

End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события OnOpen

'
' DocumentOpen
'
Private Sub AhWordApp_DocumentOpen(ByVal Doc As Document)
    Debug.Print "DocumentOpen"
    AhRegisterCurrentWindow
End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события OnNew

'
' NewDocument
'
Private Sub AhWordApp_NewDocument(ByVal Doc As Document)
    Debug.Print "NewDocument"
    AhRegisterCurrentWindow
End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события активизации окна

'
' WindowActivate
'
Private Sub AhWordApp_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
    Debug.Print "WindowActivate"
    AhRegisterCurrentWindow
End Sub

Процедура AhWordApp_DocumentBeforeClose - обработка события деактивизации окна

'
' WindowDeactivate
'
Private Sub AhWordApp_WindowDeactivate(ByVal Doc As Document, ByVal Wn As Window)
    Debug.Print "WindowDeactivate"

End Sub

 

Выводы

В этюде продемонстрирована простая реализация переопределения поведения Drag-n-Drop для Microsoft Word, состоящая из шаблона "AhCustomDragDrop.dot" (VBA) и библиотеки "AhCustomDragDrop.dll" (C++).

Задания

Задание 1 (для программистов C++)

Напишите программу, содержащую окно-источник. Реализуйте интерфейсы IDropSource и IDataObject. Проверьте работу Вашей программы совместно с шаблоном "AhCustomDragDrop.dot".

 

Вопросы

1. Можно ли изменить поведение Drag-n-Drop для окон документов Microsoft Word, используя только VBA?

2. Для какой цели лично Вам могло бы понадобиться изменять стандартное поведение окон документов Microsoft Word?


Этюды для программистов Microsoft Word.
Этюд 3.2. Переопределение поведения Drag-n-Drop для окна документа Microsoft Word.


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