Предварительный просмотр изображения в списке

Как я могу отобразить предварительный просмотр (почти как подсказку) изображения, когда я навожу указатель мыши на элемент в списке имен файлов? Я пытался показать форму и загрузить изображение, но когда отображается форма предварительного просмотра, я теряю фокус для списка, что означает, что при перемещении мыши изображение предварительного просмотра не меняется, когда я перехожу к следующему элементу в списке. .

Спасибо, Питер.


Я, основываясь на ответе TOndrej, попытался реализовать собственное THintWindow, но Canvas.StretchDraw не рисует растровое изображение, отправленное в качестве параметра. Есть идеи, почему бы и нет? Текст отображается нормально.

procedure TFormMain.DisplayPreview(HintImage: TBitmap);
var
  CustomHint: THintWindow;
  Rect: TRect;
  MousePoint: TPoint;
begin
  *{
    Based on Source: http://www.chami.com/tips/delphi/112996D.html
  }*
  GetCursorPos(MousePoint);
  with Rect do
    begin
      // set the position and size of the hint window
      Left   := MousePoint.X;
      Top    := MousePoint.Y;
      Right  := Left + 50;
      Bottom := Top + 25;
    end;

  CustomHint := THintWindow.Create(Self);
  try
    with CustomHint do
      begin
        // set the background color
        //Color := clNone;
        **Canvas.StretchDraw(Rect, HintImage);**
        ActivateHint(Rect, 'Hint');
        Application.ProcessMessages;
        //
        // perform your tasks here
        // before closing the hint window
        //
        Sleep(500);
        ReleaseHandle;
      end;

  finally
    if Assigned(CustomHint) then
      CustomHint.Free;
  end;
end;

person Pieter van Wyk    schedule 20.04.2009    source источник


Ответы (2)


Мне кажется, вам нужно собственное окно подсказки. Для этого вы должны написать новый потомок THintWindow и либо установить его глобально для всего приложения, назначив новый класс глобальной переменной HintWindowClass в модуле Forms, либо написать свой собственный потомок списка, в котором вы будете обрабатывать CM_HINTSHOW сообщение и назначать новый класс окна подсказки для HintInfo.HintWindowClass. (HintInfo указывает на запись, переданную вашему элементу управления в сообщении CM_HINTSHOW от VCL.)

person Ondrej Kelle    schedule 20.04.2009

1) Отображаете ли вы форму предварительного просмотра как диалоговое окно (модальное окно), если да, измените его на немодальное окно.
2) Не забудьте установить фокус обратно на родительское окно, как только появится форма предварительного просмотра, таким образом, ваша родительская форма со списком будет иметь фокус, и она будет передавать события перемещения мыши в список.

С уважением.

person Anand Shah    schedule 20.04.2009