![]() |
|
|
#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. |