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

PNG Кнопка


Radio

Вопрос

Пожалуйста помогите как создать кнопку или timage  в которым фон PNG . Как сделать  срабатывание click не на размер кнопки а на область где есть содержимое PNG. Проста в проекте есть типа карты в которым надо показать информацию региона при нажатие на территорий региона.

99.thumb.png.74f6c5bb4a5ae005ab4119b56563ffbe.png.         

Каждый цвет это отдельный PNG территория . очень прошу помогите 

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

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

  • 0

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

Ссылка на комментарий
  • 0
11 минуту назад, POV сказал:

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

можете по поподробнее  очень нужно 

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

https://community.embarcadero.com/answers/how-do-i-get-at-individual-pixels-in-a-firemonkey-tbitmap

можно проверять цвет пиксела

а можно приготовить 100500 отдельных картинок, наложить их тут друг на друга и проверять непрозрачность пиксела в каждой из этих исходных картинок

можно предварительно составить 100500 масивов - битовых масок, соответствующих непрозрачным пикселам на каждой области, и проверять по ним.

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

Можно костыль - кучу формочек над главной формой - у которых включено Transparent.

Но к чему извращения? Тыкай мышой в карту и определяй цвет под ней. 

 

 

P.S. Но вообще есть,к примеру, компонент TPie - у него регион соответствует контуру. Так что и сделать свой компонент произвольной формы можно. Вот так он рисуется

procedure TPie.Paint;
var
  LShapePath: TPathData;
  LShapeRect: TRectF;
  MidPoint: TPointF;
  StrokeThicknessRestoreValue: Single;
  FillShape, DrawShape: Boolean;
begin
  StrokeThicknessRestoreValue := FStroke.Thickness;
  LShapePath := TPathData.Create;
  try
    LShapeRect := GetDrawingShapeRectAndSetThickness(Self, False, FillShape, DrawShape, StrokeThicknessRestoreValue);
    MidPoint := LShapeRect.CenterPoint;

    LShapePath.MoveTo(MidPoint);
    LShapePath.AddArc(MidPoint, TPointF.Create(LShapeRect.Width * 0.5, LShapeRect.Height * 0.5), FStartAngle, FEndAngle - FStartAngle);
    LShapePath.LineTo(MidPoint);
    LShapePath.ClosePath;
    if FillShape then
      Canvas.FillPath(LShapePath, AbsoluteOpacity, FFill);
    if DrawShape then
      Canvas.DrawPath(LShapePath, AbsoluteOpacity, FStroke);
  finally
    if LShapePath <> nil then
      LShapePath.Free;
    if StrokeThicknessRestoreValue <> FStroke.Thickness then
      FStroke.Thickness := StrokeThicknessRestoreValue;
  end;

end;

 

Изменено пользователем POV
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...