Подсказка отображается только при запуске из источника - PullRequest
2 голосов
/ 01 марта 2012

У меня есть иерархический элемент управления flexgrid с установленным свойством ToolTipText, и при запуске из источника всплывающая подсказка отображается как должно.Но когда я компилирую его и запускаю таким образом, всплывающая подсказка не отображается.

Я пытался удалить что-либо, прослушивающее MouseMove, в надежде, что это исправит это, и когда я добавлю некоторый кодчтобы поместить текст всплывающей подсказки в окно сообщения, оно должно быть установлено правильно.Кто-нибудь может подумать, почему это происходит?


Обновление: похоже, проблема возникает, когда я размещаю сетку внутри другого пользовательского элемента управления.Например: make container.ctl, который является просто пустым элементом управления, но с ControlContainer = True.Затем создайте gridholder.ctl, который является mshfg внутри container.ctl.Наконец, вставьте gridholder.ctl в какую-то форму.Всплывающие подсказки на flexgrid не отображаются.

Мне интересно посмотреть, насколько это воспроизводимо ...

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Я еще не нашел обходного пути для этой проблемы, но у меня есть лучшее представление о том, почему это происходит после некоторого тестирования и пошагового выполнения некоторого кода времени выполнения VB6 в WinDBG.

Первое, что интересно, это то, что VB6 не использует стандартные механизмы отображения подсказок, предоставляемые Windows. Например, он не использует WM_NOTIFY сообщения для отображения / скрытия всплывающих подсказок или любую другую «стандартную» поддержку всплывающих подсказок, описанную в документации , объясняющей, как всплывающие подсказки работают в Windows .

Вместо этого среда выполнения VB6 имеет собственный способ управления и отображения подсказок. В принципе, он в некотором смысле похож на стандартный способ работы со всплывающими подсказками в Windows, но в некоторых областях он также отличается.

Описание того, как VB6 выполняет всплывающие подсказки:

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

  • Хук мыши перехватывает все сообщения мыши, отправленные в программу, в частности все WM_MOUSEMOUSE сообщения

  • Всякий раз, когда запускается ловушка мыши, он вызывает внутренний метод во время выполнения VB6, чтобы получить указатель объекта (HCTL) элемента управления, над которым в данный момент находится мышь. Обратите внимание, что это фактический указатель интерфейса COM, а не дескриптор окна.

  • Преобразует HCTL в соответствующий дескриптор окна (HWND).

  • Он проверяет, находится ли положение мыши внутри прямоугольника этого окна.

  • Если это так, он извлекает свойство ToolTipText для элемента управления. Если он не пустой, он создает окно всплывающей подсказки и отображает всплывающую подсказку после задержки в 700 мс.

Проблема с MSHFlexGrid (и я полагаю, что другие элементы управления, которые не являются стандартными элементами управления VB6), заключается в том, что этот код не возвращает правильный HCTL, когда вы наводите курсор на элемент управления и он находится внутри пользовательского контейнера.

В этом случае код получает HCTL пользовательского контейнера, а не HCTL самой MSHFlexGrid. Поэтому он извлекает свойство контейнера ToolTipText (которое пусто), а не ToolTipText сетки , и поэтому не отображает всплывающую подсказку.

Я точно не знаю, , почему это делает, потому что, как отмечено в комментариях к вашему вопросу, все это работает правильно, если вы используете PictureBox в качестве контейнера.

Я подозреваю, что PictureBox имеет код для правильной обработки, который не включается при создании собственного контейнера.

Я обновлю этот ответ реальным обходным путем, если смогу его найти. Сейчас я могу думать только о том, чтобы как-то «синхронизировать» свойство вашего контейнера ToolTipText со свойством сетки ToolTipText , чтобы при запросе VB6 контейнера ToolTipText контейнера , вместо него будет возвращено значение свойства ToolTextTip сетки.

Однако это легче сказать, чем сделать, потому что ToolTipText является свойством расширителя, а свойства расширителя имеют приоритет над свойствами, которые вы пишете сами, с тем же именем.

0 голосов
/ 02 марта 2012

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

http://www.justvb.net/obook/ch7.htm#UsingtheExtenderObject

http://msdn.microsoft.com/en-us/library/aa733622(v=vs.60).aspx

...