Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Всплывающая подсказка для сноски в Word 2013 без мышиного указателя

84K
26 октября 2016 года
auto-teacher
19 / / 26.10.2016
Как известно, если навести указатель мыши на слово со сноской (обычной или концевой), то сразу появляется прямоугольничек, а через секунду всплывает подсказка с текстом сноски.
При выполнении команд "следующая сноска" или "предыдущая сноска" курсор становится между сноской и словом, к которому она привязана.
Как сделать (какой макрокомандой или другим способом), чтобы подсказка появлялась после перескока к сноске без участия мыши?

Возможно, к этой теме относится вот это:
https://msdn.microsoft.com/ru-ru/library/system.wi...(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
***********************************
Там про это:
Свойство Cursor.HotSpot
.NET Framework (current version)
Возвращает активную точку курсора.
Пространство имен: System.Windows.Forms
Сборка: System.Windows.Forms (в System.Windows.Forms.dll)
Синтаксис VB
Public ReadOnly Property HotSpot As Point
Значение свойства
Type: System.Drawing.Point
Объект Point, представляющий активную точку курсора.
HotSpot — Point В курсор, который взаимодействует с другими элементами на экране.
**********************************
То есть, по моим понятиям надо после скачка к сноске в точку расположения курсора перевести указатель мыши (сфокусировать что ли?). Может быть, тогда подсказка и всплывет, если она не глупая?
Или это мистика?
275
27 октября 2016 года
pashulka
985 / / 19.09.2004
Если переместить курсор с помощью WinAPI функции SetCursorPos, то подсказка появляется.
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Спасибо, pashulka, за обнадеживающую информацию...
Я очень извиняюсь, но мне нужен подробный текст макрокоманды (лучше с комментариями), который я бы сумел вставить в шаблон normal.dotm.
Сам я такой макрос не сочиню ни за что в жизни.
275
27 октября 2016 года
pashulka
985 / / 19.09.2004
1) Весь нижеопубликованный код необходимо вставить строго в модуль документа ThisDocument.

2) После копирования, необходимо выполнить событие Document_Open. В дальнейшем, в этом не будет необходимости, т.к. событие будет выполняться автоматически, сразу после открытия любого докумета. Если вникать в такие тонкости не хочется :) то после копирования/вставки кода и сохранения документа, можно просто перезапустить Word.

3) Пример актуален только для 32-bit. Если Вы являетесь обладателем 64-bit, то Вам необходимо изменить об'явление WinAPI функции SetCursorPos и тип переменных cX и cY. Сделать это поможет статья, опубликованная на официальном сайте Microsoft.

Совместимость 32- и 64-разрядных версий Office 2010 и файл Win32API_PtrSafe.txt, который можно скачать там же.

P.S.Доступа к 64-разрядной версии не имею, так что мучить меня в этом плане, не имеет смысла :)
Код:
Private Declare Function SetCursorPos _
        Lib "user32.dll" ( _
        ByVal X As Long, _
        ByVal Y As Long) As Long

Private WithEvents wdApp As Word.Application

Private Sub Document_Open()
    Set wdApp = Application
End Sub

Private Sub wdApp_WindowSelectionChange(ByVal Sel As Selection)
    Dim cX As Long, cY As Long
    wdApp.ActiveWindow.GetPoint cX, cY, 0&, 0&, Sel.Range
    SetCursorPos cX, cY
End Sub
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Спасибо!
У нас дома два компа: и 32-х, и 64-х разрядный. Я попробую сперва на другом, если разберусь.
Пугает, правда, что я не до конца понимаю суть Вашего решения и боюсь, что оно затронет других.
275
27 октября 2016 года
pashulka
985 / / 19.09.2004
В упрощённом виде - суть сводится к тому, что после выделения, мы просто перемещаем курсор мышки к самому первому символу выделенного текста. Разумеется в реальности, имеет смысл перемещать курсор мышки только после выделения текста со сноской.

P.S. Если бы в теме был документ (не содержащий конфиденциальных данных) со сносками, было бы попроще.
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Модератору: идет рабочий процесс по отладке решения. Он полезен для всех.

Уважаемый, Pashulka!
ОТЛИЧНО!
Я все сделал, как Вы велели, и испытал в деле Ваши рекомендации (на 32-х разрядном Офисе).
Вашу функцию (или как правильно?) я вставил в шаблон NORMAL.DOTM.
При первом же запуске ВСЕ ЗАРАБОТАЛО (!), почти как надо.
Вот как получается.
Там же (кроме перемещения самого курсора стрелками) для сносок есть три основных команды, которые я и использую (горячими клавишами).
  1. Первая (ViewEndnoteArea) делает скачок от основного текста к тексту сносок и обратно.
  2. Две других (GoToNextEndnote и GoToPreviousEndnote) делают перескок и в тексте сносок вверх-вниз, и в основном тексте от сноски к сноске.
Что происходит:
  1. При перемещении курсора стрелками по доку все идет отлично: курсор приходит к слову с курсором - подсказка всплывает и при прямом, и при заднем ходе, как дрессированная.
  2. При перескоке из текста сносок к сноске в основном тексте подсказка тоже всплывает очень хорошо.
  3. А вот при перескоке между сносками в основном тексте при помощи указанных команд (пред. сноска - след. сноска) подсказка уже не хочет всплывать. Наверное, как раз в этом месте - между словом и сноской - черная дыра; подсказка и не чувствует, где курсор скрылся. (Ну это не беда, - его можно подвинуть макросом туда-сюда на знак - и подсказка поймет, что пора всплывать.)
  4. Кроме того, стали всплывать и к примечаниям подсказки по той же схеме (что мне в принципе тоже на пользу), но после перехода хотя бы к одному примечанию, сноскины подсказки уже не всплывают (странно это).

Короче, почти то самое, что я хотел, но все-таки, НЕМНОЖКО НЕ ТО, и я доспрошу Вас.
Понимаю, что вопросы от человека, не понимающего в программировании, могут взбесить любого программиста, но мне надо все понять, как следует.
Что меня не устраивает?
Ваше решение теперь действует на все документы и постоянно.
А мне хочется, чтобы это было только в выбранных документах и после конкретных макрокоманд и только внутри этих макрокоманд.
Например, я подключаю к шаблону собственные вкладки так:
Разработчик/Шаблоны и надстройки/Добавить - и ставлю галочку на время сеанса (я даже в стартовый каталог их не гружу), чтобы потом отключились.

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

Sub СледующаяСноска()
Application.Run MacroName:="GoToNextEndnote" (это обычный макрос Word)
Здесь Ваша функция начинается
  • Определяется, куда попал курсор после GoToNextEndnote, но подсказка на него не реагирует...
  • Указатель мыши определяет, где находит курсор и - туда же прыгает (наверное)...
  • Если надо, курсор влево-вправо шевельнется...
  • Подсказка понимает, что делать нечего - пора наверх - и всплывает.
Здесь Ваша функция кончается и закрывается.
End Sub

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

И еще. Прочитал сейчас Ваш последний ответ.
Документ со сносками, примечаниями (чтобы, как говорится, было что в руках подержать) я Вам, конечно пришлю. И даже полный шаблон со всеми своими макросами. Увидите эти команды, поймете: там много интересного и необычного. Но команды все - штатные.
Но я вообще не выделяю сносок (зачем?), когда их перебираю: только горячей клавишей перескакиваю от одной к другой или от сноски к тексту сносок.
И поэтому мне вообще-то не надо, чтобы они засвечивались, когда я просто стрелками мимо них курсор веду: это их не касается; для них будет свой отдельный вызов, о котором мы и говорим.
Сейчас подготовлю текст.
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Потом: забыл еще спросить.
Если Ваш код удалить из модуля ThisDocument, то все станет не прежнее место, как будто не было или еще надо что-то доудалять?
275
27 октября 2016 года
pashulka
985 / / 19.09.2004
Если я правильно понял и Вы хотите переместить курсор мышки, после выполнения макроса СледующаяСноска, то в любом стандартном модуле :
Код:
Private Declare Function SetCursorPos _
        Lib "user32.dll" ( _
        ByVal X As Long, _
        ByVal Y As Long) As Long

Private Sub СледующаяСноска()
    Application.Run "GoToNextEndnote"
 
    Dim cX As Long, cY As Long
    ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Next(wdCharacter)
    SetCursorPos cX, cY
End Sub
P.S. После удаления этого кода, мусора оставаться не должно ...
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Private Sub СледующаяСноска()
Application.Run "GoToNextEndnote"
Dim cX As Long, cY As Long
ActiveWindow.GetPoint cX, cY, 0&, 0&, Selection.Next(wdCharacter)
SetCursorPos cX, cY
End Sub
Это я так понял, усовершенствованный макрос.
А первую часть куда вставлять? В ней, наверное, какое-то объявление делается.
У меня все макросы тут лежат: Normal Modules NewMacros.
84K
27 октября 2016 года
auto-teacher
19 / / 26.10.2016
Здесь, в шаблоне, удобно по ссылкам и примечаниям перемещаться.
Пора спать...
Прикрепленные файлы:
179 Кб
Загрузок: 858
275
28 октября 2016 года
pashulka
985 / / 19.09.2004
Суровая правда жизни заключается в том, что мне, увы, добавить нечего.

Если перемещаться между сносками (#3), то подсказка не всплывает, причём неважно куда мы переместим курсор. Иначе говоря, даже если мы переместим курсор мышки на один символ вправо(влево), подсказка всё равно не появится. И причина подобного игнора Word - мне неизвестна. Более того, до вчерашнего дня я вообще не знал о таком безобразии.
84K
28 октября 2016 года
auto-teacher
19 / / 26.10.2016
Как это, уважаемый, Pashulka?
Я же конкретно написал, что все всплывает!!!
Сейчас только еще раз проверил на 32-х разрядном. Нажимаю макрос "след." или "пред. сноска", курсор перемещается куда надо (между словом и сноской), я шевелю его вправо или влево, и подсказка как миленькая всплывает в обоих случаях. Осталось только внутрь макроса эти действия запихнуть.
Я сейчас изучаю различия 32-х и 64-х разрядов для Declare и PtrSafe. С трудом понимаю, о чем речь. Про этот оператор пойму, может, налажу и на 64-х разрядном.
Я спросил Вас, куда первую часть кода вставлять? В какое место модуля NewMacros?
84K
28 октября 2016 года
auto-teacher
19 / / 26.10.2016
Вообще-то, это хорошее решение, потому что до этого только с участием мыши подсказки всплывали.
Если б я в VB получше понимал, я бы Вашу подпрограмму на время работы со сносками подключал и меня бы это устраивало.
Сейчас не очень нравится, что сноски все время подскакивают. А второе: примечания на этот код глюк наводят - надо закрывать док и опять открывать.
Что бы сделать еще?
84K
28 октября 2016 года
auto-teacher
19 / / 26.10.2016
А вчера я этот последний код в шаблон 64-х разрядного офиса сунул, так верхняя половина с Declare почему-то в предыдущую макрокоманду залезла. Я ж в этом деле тупой. Мне пошагово надо подсказать.
275
28 октября 2016 года
pashulka
985 / / 19.09.2004
auto-teacher,

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

Что касается второго макроса, то SetCursorPos в начало модуля, а СледующаяСноска можно и в любое(допустимое)

Если выполните Set wdApp = Nothing , то курсор мышки перестанет перещаться к выделенному об'екту.
84K
28 октября 2016 года
auto-teacher
19 / / 26.10.2016
Спасибо!
Теперь, пока не разберусь с отличиями в разрядности офиса, вся эта работа зависнет. А разбираться мне придется долго: дуб дубом.
84K
29 октября 2016 года
auto-teacher
19 / / 26.10.2016
Уважаемый Pashulka!
Испробовал на обоих офисах Ваш код, причем для 64-х битового ничего так и не изменил.
В общем он работает, но не всегда.

Посылаю тот же документ, что прошлый раз - normal.dotm, в котором есть и пробный текст со сносками, и макрокоманды, и их горячие клавиши.
Прошу Вас посмотреть в большом масштабе 500%, куда становится указатель курсора после перехода по сноскам.

Видно, что каждый раз после перехода по сноске и вперед, и назад указатель мыши строго выполняет Ваше приказание, становясь на знак правее или левее (я и так, и так заставлял, даже на слово заставлял сдвигаться).
А подсказка всплывает иногда хорошо, а иногда не хочет. Иногда туда-сюда пройдусь, так она всплывает на свое усмотрение даже на одной и той же сноске.
Поэтому у меня появилась мысль, что одних координат указателя ей маловато. Другая мысль подсказывает, что вообще нет смысла указатель сдвигать на знак в сторону: пусть точно встает по найденным координатам.

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

Чует мое сердце, что подсказке движение (шевеление) нужно в поле сноски. Поле это, по-видимому, охватывает некий прямоугольник со словом и сноской. А размер этого прямоугольника зависит, наверное, от размера шрифта, об базовой линии текста и пр..
Если можете, включите это движение (сдвиг) типа mouseover / out в поле слова со сноской после того, как указатель встанет по координатам курсора вместо вот этого: Selection.Next(wdCharacter).
И тогда все заработает надежно.
А вообще код классный: я много посмотрел на форумах - и коротко, и ясно.
С уважением, Auto-teacher!
84K
29 октября 2016 года
auto-teacher
19 / / 26.10.2016
Вот новый шаблон с макросами по сноскам, их горячими клавишами и пробным текстом.
Его надо открыть именно как шаблон из Wordа, а то может текст не появиться.
Прикрепленные файлы:
189 Кб
Загрузок: 873
275
29 октября 2016 года
pashulka
985 / / 19.09.2004
Непонятно зачем Вы обращаетесь ко мне лично. Ведь я уже подтвердил, что в Вашем шаблоне подсказки не появляются, если пользоваться горячими клавишами. В других случаях, проблем нет.
84K
30 октября 2016 года
auto-teacher
19 / / 26.10.2016
Еще я заметил, что если после SetCursorPos идет MsgBox, а потом закрывается, то подсказка всплывает всегда.
84K
30 октября 2016 года
auto-teacher
19 / / 26.10.2016
Спасибо за советы!!!
84K
04 ноября 2016 года
auto-teacher
19 / / 26.10.2016
Добавил цикл по таймеру и для себя проблему решил.
Подсказки стабильно всплывают при переходе и по гиперссылкам, и по сноскам во всех режимах просмотра.
Если не появится решения с применением событий мыши (наведение и пр.), можно тему закрыть.

Спасибо за помощь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог