Я еще не нашел обходного пути для этой проблемы, но у меня есть лучшее представление о том, почему это происходит после некоторого тестирования и пошагового выполнения некоторого кода времени выполнения 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 является свойством расширителя, а свойства расширителя имеют приоритет над свойствами, которые вы пишете сами, с тем же именем.