Подсказка отображается только при запуске из источника
У меня есть иерархический элемент управления FlexGrid с ToolTipText
набор свойств, и когда я запускаю из источника, всплывающая подсказка отображается так, как должна. Но когда я компилирую и запускаю таким образом, всплывающая подсказка не отображается.
Я пытался удалить что-нибудь, слушая MouseMove
в надежде, что это исправит это, и когда я добавлю некоторый код для помещения текста всплывающей подсказки в окно сообщения, он будет настроен правильно. Кто-нибудь может подумать, почему это происходит?
Обновление: похоже, что проблема возникает, когда я размещаю сетку внутри другого пользовательского элемента управления. Например: make container.ctl, который является просто пустым элементом управления, но с ControlContainer = True. Затем создайте gridholder.ctl, который является mshfg внутри контейнера.ctl. Наконец, вставьте gridholder.ctl в какую-то форму. Всплывающие подсказки на flexgrid не отображаются.
Мне интересно посмотреть, насколько это воспроизводимо...
2 ответа
Я еще не нашел обходной путь для этой проблемы, но у меня есть лучшее представление о том, почему это происходит после некоторого тестирования и пошагового выполнения кода 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 является свойством расширителя, а свойства расширителя имеют приоритет над свойствами, которые вы пишете сами, с тем же именем.
После небольшого исследования я обнаружил, что я думаю, что является основной проблемой. Ваш пользовательский элемент управления не реализует какой-либо метод взаимодействия элементов управления. Пользовательские элементы управления, которые являются Контейнерными элементами управления, должны реализовывать функциональность расширителя. Эти две ссылки являются лучшими, которые я нашел на данный момент.
http://www.justvb.net/obook/ch7.htm
http://msdn.microsoft.com/en-us/library/aa733622%28v=vs.60%29.aspx