Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как определить положение картинки в TListBoxItem?


Andrey Efimov

Вопрос

  • Модераторы

Ярослав, прочитал ваш совет http://fire-monkey.ru/topic/95-kak-pravilno-zamenit-image-na-webbrowser/?p=297

 

Интересен вот этот пункт:

 

3) В событии OnMouseDown у итема определяем положение пальца и если положение совпадает с положением картинки …

 

А точнее, как определить положение картинки в ListBoxItem, если картинка у нас находится тут "TListBoxItem.ItemData.Bitmap"?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Добрый день,

  • В событии MouseDown у TListBoxItem ищем в стиле итема объект изображения. Для итема картинка имеет название 'icon'.
  • Определяем координаты мыши в координатах формы (Абсолютные координаты). На случай отступов и произвольного размещения изображения.
  • Конвертируем абсолютные координаты в локальные координаты изображения.
  • Если картинка содержит координаты мыши, значит нажали на картинку.

Delphi:

procedure TForm6.ListBoxItem1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
  Item: TListBoxItem;
  StyleObject: TFmxObject;
  StyleIcon: TControl;
  LocalMousePos: TPointF;
  AbsoluteMousePos: TPointF;
begin
  if Sender is TListBoxItem then
  begin
    Item := TListBoxItem(Sender);
    LocalMousePos := TPointF.Create(X, Y);
    AbsoluteMousePos := Item.LocalToAbsolute(LocalMousePos);
    // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки 
    StyleObject := Item.FindStyleResource('icon');
    if (StyleObject <> nil) and (StyleObject is TControl) then
    begin
      StyleIcon := TControl(StyleObject);
      // Координаты в локальной системе координат картинки
      LocalMousePos := StyleIcon.AbsoluteToLocal(AbsoluteMousePos);
      if StyleIcon.LocalRect.Contains(LocalMousePos) then
        ShowMessage('Click on Image');
    end;
  end;
end;

Builder C++:

void __fastcall TForm4::ListBoxItem1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y)
{
	TListBoxItem *item = dynamic_cast<TListBoxItem*>(Sender);
	if (item != 0){
		TPointF localMousePos(X, Y);
		TPointF absoluteMousePos = item->LocalToAbsolute(localMousePos);
		// Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки
		TFmxObject *styleObject;
		styleObject = item->FindStyleResource("icon");
		if (styleObject != NULL) {
			TControl *styleIcon = dynamic_cast<TControl*>(styleObject);

			// Координаты в локальной системе координат картинки
			localMousePos = styleIcon->AbsoluteToLocal(absoluteMousePos);
			if (styleIcon->LocalRect.Contains(localMousePos))
				ShowMessage("Click on Image");
		}
	}
}
Ссылка на комментарий
  • 0
  • Модераторы

Вот спасибо.

Знал как получить координаты нажатия, но не мог понять как найти картинку в ListBoxItem'е. Оказывается нужно было через стиль искать...

 

p.s. У меня lvl-up по изучению firemonkey  :D

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...