Код на Delphi, переведешь сам.
Порядок действий:
1 Создаешь свой класс наследник класса THintWindow:
THintWindow1 = class(THintWindow)
public
procedure ActivateHint(Rect: TRect; const AHint: string); override;
end;
procedure THintWindow1.ActivateHint(Rect: TRect; const AHint: string);
begin
//какой то код определяющий положение подсказки и записывающий его в Rect
inherited ActivateHint(Rect, AHint);
end;
2. Создаешь свой класс наследник TCustomListBox, в котором перехватываешь события CM_MOUSEENTER (заход мыши в листбокс) и CM_MOUSELEAVE (выход мыши из листбокс). В которых снимаешь-устанавливаешь флаг, нужный для обработки события WM_MOUSEMOVE.
3. В обработчике события WM_MOUSEMOVE определяешь Items по позиции курсора (если флаг установлен). Затем определяешь ширину текста:
ListBox1.Canvas.Font:=ListBox1.Font;
If ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i])>ListBox1.ClientWidth then
begin
//Код прописывающий в глобальную переменную Rect подсказки,
//которая передается в процедуру THintWindow1.ActivateHint
Application.ShowHint:=False;
OldHintWindow:=HintWindowClass;//запоминаем родной хинт-класс, здесь HintWindowClass - глобальная переменная Delphi, думаю в балдере она тоже есть
HintWindowClass:=THintWindow1;//устанавливаем свой класс хинта
Application.ShowHint:=True;
Application.CancelHint;
ListBox1.Hint:=ListBox1.Items.Strings[i];
end;
4. При выходе из листбокса (событие CM_MOUSELEAVE) востанавливаем родной хинт-класс:
Application.ShowHint:=False;
HintWindowClass:=OldHintWindow;//восстанавливаем родной хинт-класс
Application.ShowHint:=True;