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