Задача делится на три вопроса.
I. Как перехватывать мышь? OnMouseMove и OnMouseLeave (вроде так оно…)
II. Как нарисовать подсказку? Есть три способа это сделать, выбирайте любой:
1. Отпечатать подсказку на компоненте-просмотрщике (например, в событии OnPaint). Например, подвели «крысика» — InvalidateRect, примерно соответствующий расположению подсказки (ну или Invalidate целиком, если считаете, что картинка рисуется быстро). В OnPaint — собственно отрисовка.
2. Сделать собственное окошко-подсказку — например, такая же TForm. Внимание, TLabel не умеет вычислять вертикальный размер, когда текст перенесён, поэтому или найдите компонент, который закрывает этот просчёт, либо нарисуйте текст сами, как и в первой части.
3. Вывести тултип средствами WinApi.
III. Вот мы вычислили габариты подсказки и хотим её расположить в границах экрана (варианты 2, 3) или окна (вариант 1). Куда её всунуть? Сделайте несколько вариантов расположения, в порядке предпочтитения.
• Снизу, горизонтальное выравнивание по левому краю. Если умещается по вертикали, но вылезает по горизонтали — сместить влево.
• Затем сверху с теми же условиями.
• Затем справа; вертикальное выравнивание — как уместится.
• Затем слева; вертикальное выравнивание — как уместится.
• А если ни один вариант не проканал — по координатам (0, 0).
Ах да. Вычисляя габариты, убедитесь, что очень длинные подписи переносятся — чтобы не было подсказки, которая шире, чем экран.
Вот так в общих чертах. Делать мне это приходилось; я использовал 1-й способ, однако «затравкой» делал не прямоугольник, а точку (нужны были подписи к графику). Естественно, выравнивал я с небольшим отступом, чтобы курсор не загораживал подпись. Использовал я Graphics32 с собственным кодом рисования закруглённого прямоугольника, получились кавайненькие такие полупрозрачные плашки.