![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Доброго вечера всем, объясните глупцу задачку: 
		
	
		
		
		
		
		
	
		
		
	
	
	Есть Timage на фоме в котором карта(сам рисовал) На карте есть острова(много) Как бы так придумать-сообразить, что бы когда наводишь курсор на определенный остров, будет всплывать Hint с уже готовым текстом. Я так понимаю нужно расчитать коардинаты острова, но если он не круглый(квадратный) а произвольной формы. Очень жду ваших ответов=)  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Есть идейки? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Да запросто, методов много: 
		
	
		
		
		
		
		
	
		
		
	
	
	напр. : 1. сохранив отдельно в БД связку - координаты - хинт 2. сохранив отдельно спец-рисунок, где каждый цвет пикселя - определенный хинт и т.д. а вообще то вам в GIS+Google, не изобретайте велосипедов  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 да причем тут велик, мне в проге нужно эта фишка только и всего(для себя так скажем), кто еще, что скажет? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Впринципе можно описать примерно по контуру каждого острова ломанную линию (вручную), сохранить точки в массив. Получишь набор замкнутых фигур. Потом есть методы определения, лежит ли точка в обведенной ломанной линией области (один из методов - пробегаешь по всем X, взяв фиксированный Y точки,  если пересекло фигуру четное количество раз, значит точка снаружи, нечетное - внутри. Только вот тогда небольшое западло, если точка имеет ту же координату Y, что и какая-то вершина: тогда при плохой реализации вершина посчитается за два пересечения). 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	А если не хочешь париться - то лучше всего по цвету пикселей: грубо говоря, если больше синего - значит море, иначе - остров.  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 решил сделать так: 
		
	
		
		
		
		
		
	
		
		
	
	
	Цитата: 
	
 теперь думаю как сделать всплывающий хинт с рисунком и текстом вместо "lll1" Кто подскажет?  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 или юзать не подсказки, а что нить другое, 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Просто прямоугольником? Можно и так. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Насчет Цитата: 
	
 Код: 
	//событие 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;  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 спасибо попробую 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Да, и по событию MouseLeave надо 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	Image2.Visible:=false; TMHint:=0; Timer1.Enabled:=false; Код: 
	Timer1.Enabled:=true; TMHint:=0; // на всякий случай  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 май гад, что вы только предлагаете человеку.... ужас, можно сделать самый настоящий хинт, свой, напр.: 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	{Появление}
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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Понятное дело что можно сделать свой компонент 
		
	
		
		
		
		
			
		
		
		
		
		
			  Я просто предожил простейшую реализацию, раз надо "для себя", в 10 строчек... Просто через Image нарисовать на DC формы нужную картинку.Последний раз редактировалось Bargest, 16.12.2010 в 21:24.  | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 По контуру острова я бы предложил: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	1.создать регион по контуру острова 2.проверять вхождение мышки PtInRegion СОздать регион можно по картинке острова. Или создать массив точек, которые опишут контур острова.  | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 еще вопросик, если нужно чтобы хинт был неким переходом на другую форму, тоесть с ссылкой на форму 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 если используйте мой код хинта, то можно отрисовать урл. напр. навешать события и т.д., это же тоже форма, читайте про работу с компонентами в ран-тайме, но у нас обратите внимание виндовая форма, а значит работать с ней надо полностью на WinAPI, смотрите не напутайте, а то ничего не получится 
		
	
		
		
		
		
		
		
			Последний раз редактировалось MMM_Corp, 17.12.2010 в 15:13.  |