Код на 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;