Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2010, 15:03
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
Вопрос Координаты Timage

Доброго вечера всем, объясните глупцу задачку:
Есть Timage на фоме в котором карта(сам рисовал)
На карте есть острова(много)
Как бы так придумать-сообразить, что бы когда наводишь курсор на определенный остров, будет всплывать Hint с уже готовым текстом. Я так понимаю нужно расчитать коардинаты острова, но если он не круглый(квадратный) а произвольной формы.
Очень жду ваших ответов=)
Ответить с цитированием
  #2  
Старый 16.12.2010, 15:15
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

Есть идейки?
Ответить с цитированием
  #3  
Старый 16.12.2010, 17:23
Аватар для MMM_Corp
MMM_Corp MMM_Corp вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 37
Репутация: 13
По умолчанию

Да запросто, методов много:

напр. :
1. сохранив отдельно в БД связку - координаты - хинт
2. сохранив отдельно спец-рисунок, где каждый цвет пикселя - определенный хинт и т.д.

а вообще то вам в GIS+Google, не изобретайте велосипедов
Ответить с цитированием
  #4  
Старый 16.12.2010, 17:59
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

да причем тут велик, мне в проге нужно эта фишка только и всего(для себя так скажем), кто еще, что скажет?
Ответить с цитированием
  #5  
Старый 16.12.2010, 18:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Впринципе можно описать примерно по контуру каждого острова ломанную линию (вручную), сохранить точки в массив. Получишь набор замкнутых фигур. Потом есть методы определения, лежит ли точка в обведенной ломанной линией области (один из методов - пробегаешь по всем X, взяв фиксированный Y точки, если пересекло фигуру четное количество раз, значит точка снаружи, нечетное - внутри. Только вот тогда небольшое западло, если точка имеет ту же координату Y, что и какая-то вершина: тогда при плохой реализации вершина посчитается за два пересечения).

А если не хочешь париться - то лучше всего по цвету пикселей: грубо говоря, если больше синего - значит море, иначе - остров.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 16.12.2010, 19:04
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

решил сделать так:
Цитата:
procedure TPirat.KartaIMGClick(Sender: TObject);
var
X, Y: integer;
begin
X := EX;
Y := WY ;
if (X > 407) AND (X < 417) AND (Y > 150) AND (Y < 157) then
begin
lll1.Caption := 'Tortuga';
end
end;


теперь думаю как сделать всплывающий хинт с рисунком и текстом вместо "lll1"

Кто подскажет?
Ответить с цитированием
  #7  
Старый 16.12.2010, 19:19
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

или юзать не подсказки, а что нить другое,
Ответить с цитированием
  #8  
Старый 16.12.2010, 20:40
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Просто прямоугольником? Можно и так.
Насчет
Цитата:
теперь думаю как сделать всплывающий хинт с рисунком и текстом вместо "lll1"
сделай так:
Код:
//событие KartaIMGClick:
Begin
...//проверка на попадание точки на остров, загрузка соответствующей картинки в Image2
 Image2.Top:=y;
 Image2.Left:=x;
 Image2.Visible:=true;
end;

//Событие MouseMove:
begin
 Image2.Visible:=false;
end;
так у тебя при нажатии на остров будет показываться картинка, а при движении мыши она исчезнет. Если хочешь полный функционал хинта - то лучше по событию движения делать
Код:
begin
Image2.Visible:=false;
TMHint:=0;  // глобальная переменная Integer
end;
и поставить таймер с событием:
Код:
begin
 if TMHint>=5 then
 begin
  ...//ставим картинку в координаты курсора
  Image2.Visible:=true;
 end
 else inc(TMHint);
end;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 16.12.2010, 20:45
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

спасибо попробую
Ответить с цитированием
  #10  
Старый 16.12.2010, 20:57
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Да, и по событию MouseLeave надо
Код:
Image2.Visible:=false;
TMHint:=0;
Timer1.Enabled:=false;
а по MouseEnter -
Код:
Timer1.Enabled:=true;
TMHint:=0; // на всякий случай
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 16.12.2010, 21:14
Аватар для MMM_Corp
MMM_Corp MMM_Corp вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 37
Репутация: 13
По умолчанию

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

Код:
{Появление}
IF h<>nil H.ReleaseHandle; {если чей-то хинт yже был, то его погасить}
H:=THintWindow.Create(Окно-владелец хинта);
H.ActivateHint(H.CalcHintRect(...),'hint hint nint');
....
{UnПоявление :) - это возможно пpидется повесить на таймеp, котоpый бyдет
обнyляться пpи каждом новом появлении хинта}
IF h<>nil H.ReleaseHandle;

граф. хинт:
Код:
type
  TGraphicHintWindow = class(THintWindow)
    constructor Create(AOwner: TComponent); override;
  private
    FActivating: Boolean;
  public
    procedure ActivateHint(Rect: TRect; const AHint: string); override;
  protected
    procedure Paint; override;
  published
    property Caption;
  end;

  {...}

constructor TGraphicHintWindow.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  {
   Hier kцnnen beliebige Schrift Eigenschaften gesetzt
   werden.

   Here you can set custom Font Properties:
   }

  with Canvas.Font do
  begin
    Name := 'Arial';
    Style := Style + [fsBold];
    Color := clBlack;
  end;
end;

procedure TGraphicHintWindow.Paint;
var
  R: TRect;
  bmp: TBitmap;
begin
  R := ClientRect;
  Inc(R.Left, 2);
  Inc(R.Top, 2);

  {*******************************************************
   Der folgende Code ist ein Beispiel wie man die Paint
   Prozedur nutzen kann um einen benutzerdefinierten Hint
   zu erzeugen.

   The folowing Code ist an example how to create a custom
   Hint Object. :
   }

  bmp := TBitmap.Create;
  bmp.LoadfromFile('D:\hint.bmp');

  with Canvas do
  begin
    Brush.Style := bsSolid;
    Brush.Color := clsilver;
    Pen.Color := clgray;
    Rectangle(0, 0, 18, R.Bottom + 1);
    Draw(2, (R.Bottom div 2) - (bmp.Height div 2), bmp);
  end;

  bmp.Free;
  //Beliebige HintFarbe
  //custom Hint Color
  Color := clWhite;

  Canvas.Brush.Style := bsClear;
  Canvas.TextOut(20, (R.Bottom div 2) - (Canvas.Textheight(Caption) div 2),
    Caption);
  {********************************************************}
end;

procedure TGraphicHintWindow.ActivateHint(Rect: TRect; const AHint: string);
begin
  FActivating := True;
  try
    Caption := AHint;
    //Hцhe des Hints setzen setzen
    //Set the "Height" Property of the Hint
    Inc(Rect.Bottom, 14);
    //Breite des Hints setzen
    //Set the "Width" Property of the Hint
    Rect.Right := Rect.Right + 20;
    UpdateBoundsRect(Rect);
    if Rect.Top + Height > Screen.DesktopHeight then
      Rect.Top := Screen.DesktopHeight - Height;
    if Rect.Left + Width > Screen.DesktopWidth then
      Rect.Left := Screen.DesktopWidth - Width;
    if Rect.Left < Screen.DesktopLeft then
      Rect.Left := Screen.DesktopLeft;
    if Rect.Bottom < Screen.DesktopTop then
      Rect.Bottom := Screen.DesktopTop;
    SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
      SWP_SHOWWINDOW or SWP_NOACTIVATE);
    Invalidate;
  finally
    FActivating := False;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  HintWindowClass := TGraphicHintWindow;
  Application.ShowHint := False;
  Application.ShowHint := True;
end;
Ответить с цитированием
  #12  
Старый 16.12.2010, 21:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Понятное дело что можно сделать свой компонент Я просто предожил простейшую реализацию, раз надо "для себя", в 10 строчек... Просто через Image нарисовать на DC формы нужную картинку.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 16.12.2010 в 21:24.
Ответить с цитированием
  #13  
Старый 17.12.2010, 06:53
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

По контуру острова я бы предложил:
1.создать регион по контуру острова
2.проверять вхождение мышки PtInRegion
СОздать регион можно по картинке острова. Или создать массив точек, которые опишут контур острова.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #14  
Старый 17.12.2010, 10:33
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

еще вопросик, если нужно чтобы хинт был неким переходом на другую форму, тоесть с ссылкой на форму
Ответить с цитированием
  #15  
Старый 17.12.2010, 15:10
Аватар для MMM_Corp
MMM_Corp MMM_Corp вне форума
Прохожий
 
Регистрация: 12.12.2010
Сообщения: 37
Репутация: 13
По умолчанию

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

Последний раз редактировалось MMM_Corp, 17.12.2010 в 15:13.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025