亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? earthmap.pas

?? 想在DELPHI中應用GoogleMap嗎
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
procedure TEarthMap.CMExit(var Msg: TCMExit);
begin
  inherited;
end;

constructor TEarthMap.Create(AOwner: TComponent);
var
  Bitmap: TBitmap;
begin
  inherited Create(AOwner);
  DoubleBuffered := True;
  TabStop := True;     //可以是控件獲得焦點信息,從而可以接收滾軸消息
  FWinWidth := 512;
  FWinHeight := 512;
  Width := FWinWidth;
  Height := FWinHeight;
  FImage := TImage.Create(Self);
  FImage.Parent := Self;
  FImage.AutoSize := True;
  FImage.Cursor := crCross;
  FImage.OnMouseDown := OmImgMouseDown;
  FImage.OnMouseMove := OnImgMouseMove;
  Bitmap := TBitmap.Create;
  FImage.Picture.Graphic := Bitmap;
  Bitmap.Free;
  FDefMap := TBitmap.Create;
  FDefMap.Width := 256;
  FDefMap.Height := 256;
  FDefMap.Canvas.Pen.Color := clSkyBlue;
  FDefMap.Canvas.Brush.Style := bsClear;
  FDefMap.Canvas.Rectangle(0, 0, 256, 256);
  FDefMap.Canvas.Font.Color := clSkyBlue;
  FDefMap.Canvas.Font.Style := [fsBold];
  FDefMap.Canvas.TextOut(10, 10, 'Loading...');
  MapZoom := 0;
  FMapRect.Left := 0;
  FMapRect.Top := 0;
  FMapRect.Right := 0;
  FMapRect.Bottom := 0;
  FMapVector.X := (Width - CMapWidth) div 2;
  FMapVector.Y := (Height - CMapHeight) div 2;
  FMapPath := ExtractFilePath(GetModuleName(HInstance)) + 'FileMap\';
  FMapURL := CMapURL;
  FProxy.Proxy := False; 
  FGetThread := TGetThread.Create;
  FGetThread.FEarthMap := Self;
  FGetThread.MapPath := FMapPath;
  FGetThread.MapURL := FMapURL;
  FGetThread.Proxy := FProxy;
  DrawMap;
end;

procedure TEarthMap.CursorToMap(AMouse: TPoint; var x, y: Integer);
begin
  x := AMouse.X div CMapWidth + FMapRect.Left;
  y := AMouse.Y div CMapHeight + FMapRect.Top;
end;

destructor TEarthMap.Destroy;
begin
  FImage.Free;
  FGetThread.Terminate;
  FGetThread.Free;
end;

function TEarthMap.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
  MousePos: TPoint): Boolean;
var
  IsNeg: Boolean;
begin
  Result := False;
  if csDesigning in ComponentState then Exit;
  if Assigned(OnMouseWheel) then
    OnMouseWheel(Self, Shift, WheelDelta, MousePos, Result);
  if not Result then
  begin
    if WheelDelta > 0 then
      Result := DoMouseWheelUp(Shift, MousePos)
    else
      Result := DoMouseWheelDown(Shift, MousePos);
  end;
end;

function TEarthMap.DoMouseWheelDown(Shift: TShiftState;
  MousePos: TPoint): Boolean;
var
  ImgMousePos: TPoint;
  xMap, yMap, xMouse, yMouse, xLeft, yTop: Integer;
begin
  inherited DoMouseWheelDown(Shift, MousePos);
  Result := True; //防止兩次觸發消息
  GetCursorPos(MousePos);
  MousePos := Self.ScreenToClient(MousePos);
  if MapZoom = 0 then Exit;   //如果是最小的則不縮小
  ImgMousePos.X := MousePos.X - FImage.Left;
  ImgMousePos.Y := MousePos.Y - FImage.Top;
  if ((ImgMousePos.X < 0) or (ImgMousePos.X > FImage.Width)) or
     ((ImgMousePos.Y < 0) or (ImgMousePos.Y > FImage.Height)) then  //如果超出范圍,則取中間點
  begin
    ImgMousePos.X := FImage.Width div 2 - 1;
    ImgMousePos.Y := FImage.Height div 2 - 1;
  end;
  //獲得地圖參數
  CursorToMap(ImgMousePos, xMap, yMap);
  xMouse := (ImgMousePos.X + FMapRect.Left * CMapWidth) mod (CMapWidth*2);
  yMouse := (ImgMousePos.Y + FMapRect.Top * CMapHeight) mod (CMapHeight*2);
  xLeft := FMapVector.X + (xMap - xMap mod 2 - FMapRect.Left)*CMapWidth;
  yTop := FMapVector.Y + (yMap - yMap mod 2 - FMapRect.Top)*CMapHeight;
  //獲得縮小后的地圖參數
  MapZoom := MapZoom - 1;
  FMapRect.Left := xMap div 2;
  FMapRect.Top := yMap div 2;
  FMapRect.Right := xMap div 2;
  FMapRect.Bottom := yMap div 2;
  FMapVector.X := xLeft + xMouse div 2;
  FMapVector.Y := yTop + yMouse div 2;
//  FMapVector.X := FMapVector.X + xMouse div 2;
//  FMapVector.Y := FMapVector.Y + yMouse div 2;
  StrechMap;
  DrawMap;
end;

function TEarthMap.DoMouseWheelUp(Shift: TShiftState;
  MousePos: TPoint): Boolean;
var
  ImgMousePos: TPoint;
  xMap, yMap, xMouse, yMouse, xLeft, yTop: Integer;
begin
  inherited DoMouseWheelUp(Shift, MousePos);
  Result := True;  //防止兩次觸發消息
  GetCursorPos(MousePos);
  MousePos := Self.ScreenToClient(MousePos);
  if MapZoom = 17 then Exit; //如果是最大的則不放大
  ImgMousePos.X := MousePos.X - FImage.Left;
  ImgMousePos.Y := MousePos.Y - FImage.Top;
  if ((ImgMousePos.X < 0) or (ImgMousePos.X > FImage.Width)) or
     ((ImgMousePos.Y < 0) or (ImgMousePos.Y > FImage.Height)) then  //如果超出范圍,則取中間點
  begin
    ImgMousePos.X := FImage.Width div 2 - 1;
    ImgMousePos.Y := FImage.Height div 2 - 1;
  end;
  //獲得地圖參數
  CursorToMap(ImgMousePos, xMap, yMap);
  xMouse := ImgMousePos.X mod CMapWidth;
  yMouse := ImgMousePos.Y mod CMapHeight;
  xLeft := FMapVector.X + (xMap - FMapRect.Left)*CMapWidth;
  yTop := FMapVector.Y + (yMap - FMapRect.Top) * CMapHeight;
  //獲得放大后的地圖參數
  MapZoom := MapZoom + 1;
  FMapRect.Left := xMap * 2;
  FMapRect.Top := yMap * 2;
  FMapRect.Right := xMap * 2 + 1;
  FMapRect.Bottom := yMap * 2 + 1;
  FMapVector.X := xLeft - xMouse;
  FMapVector.Y := yTop - yMouse;
  StrechMap;
  DrawMap;
end;

procedure TEarthMap.DrawMap;
var
  BmpMap: TBitmap;
  i, j, xInv, yInv: Integer;
begin
  BmpMap := TBitmap.Create;
  try
    BmpMap.Width := (FMapRect.Right - FMapRect.Left + 1) * CMapWidth;
    BmpMap.Height := (FMapRect.Bottom - FMapRect.Top + 1) * CMapHeight;
    for i := FMapRect.Top to FMapRect.Bottom do    //畫圖
    begin
      for j := FMapRect.Left to FMapRect.Right do
      begin
        DrawOneMap(MapZoom, j, i, BmpMap);
      end;
    end;
    //調整圖的位置
    FImage.Picture.Graphic := BmpMap;
    xInv := FMapVector.X - FImage.Left;
    yInv := FMapVector.Y - FImage.Top;
    ScrollBy(xInv, yInv); 
//    FImage.Left := FMapVector.X;
//    FImage.Top := FMapVector.Y;
  finally
    BmpMap.Free;
  end;
end;

procedure TEarthMap.DrawOneMap(const AZoom, AX, AY: Integer; var ABmp: TBitmap);
var
  GraphicClass: TGraphicExGraphicClass;
  Graphic: TGraphic;
  sFileName: string;
  iLeft, iTop, Zoom, x, y: Integer;
  BmpZoom: TBitmap;
  DestRect, SrcRect: TRect;
begin
  sFileName := FMapPath + Format(CMapFile, [AZoom, AX, AY]);
  try
    iLeft := (AX - FMapRect.Left) * CMapWidth;
    iTop := (AY - FMapRect.Top) * CMapHeight;
    if FileExists(sFileName) and FGetThread.CheckFileHeader(sFileName) then            //如果存在則直接畫
    begin
      try
        GraphicClass := FileFormatList.GraphicFromContent(sFileName);
        Graphic := GraphicClass.Create;
        Graphic.LoadFromFile(sFileName);
        ABmp.Canvas.Draw(iLeft, iTop, Graphic);
      finally
        if Graphic <> nil then FreeAndNil(Graphic);
      end;
    end
    else                                     //如果不存在則找下一級放大的圖片畫 
    begin
      if not (csDesigning in ComponentState) then
        FGetThread.AddTask(AZoom, AX, AY);
      Zoom := AZoom - 1;
      x := AX div 2;
      y := AY div 2;
      sFileName := FMapPath + Format(CMapFile, [Zoom, x, y]);
      if FileExists(sFileName) then
      begin
        try
          GraphicClass := FileFormatList.GraphicFromContent(sFileName);
          Graphic := GraphicClass.Create;
          Graphic.LoadFromFile(sFileName);
          BmpZoom := TBitmap.Create;
          BmpZoom.Width := 2*CMapWidth;
          BmpZoom.Height := 2*CMapHeight;
          BmpZoom.Canvas.StretchDraw(Rect(0, 0, 2*CMapWidth, 2*CMapHeight), Graphic);  //放大
          DestRect.Left := iLeft+1;
          DestRect.Top := iTop+1;
          DestRect.Right := DestRect.Left + CMapWidth - 1;
          DestRect.Bottom := DestRect.Top + CMapHeight - 1;
          SrcRect.Left := (AX mod 2) * CMapWidth;
          SrcRect.Top := (AY mod 2) * CMapHeight;
          SrcRect.Right := SrcRect.Left + CMapWidth - 1;
          SrcRect.Bottom := SrcRect.Top + CMapHeight - 1;
          ABmp.Canvas.CopyRect(DestRect, BmpZoom.Canvas, SrcRect);  //然后復制放大之后的區域
        finally
          if Graphic <> nil then FreeAndNil(Graphic);
          if BmpZoom <> nil then FreeAndNil(BmpZoom);
        end;
      end
      else
        ABmp.Canvas.Draw(iLeft, iTop, FDefMap);
    end;
  except
    on E: Exception do ;
  end;
end;

procedure TEarthMap.SetMapZoom(AZoom: TMapZoom);
begin
  if FMapZoom <> AZoom then
  begin
    FMapZoom := AZoom;
    if Assigned(FOnMapZoomChange) then FOnMapZoomChange(Self, FMapZoom);
  end;
end;

procedure TEarthMap.SetProxy(AProxy: TProxy);
begin
  if (AProxy.Proxy <> FProxy.Proxy) or (not SameText(AProxy.Host, FProxy.Host))
    or (not SameText(AProxy.Port, FProxy.Port)) then
  begin
    FProxy := AProxy;
    FGetThread.Proxy := AProxy;
  end;
end;

function TEarthMap.StrechMap: Boolean;
begin
  Result := False;
  if (FMapVector.X > 0) and (FMapRect.Left > 0) then  //在放大的時候,而且左邊還有空余的地圖
  begin
    while (FMapRect.Left > 0) and (FMapVector.X > 0) do
    begin
      FMapRect.Left := FMapRect.Left - 1;
      FMapVector.X := FMapVector.X - CMapWidth;
    end;
    Result := True;
  end;
  if (FMapVector.Y > 0) and (FMapRect.Top > 0) then  //在放大的時候,而且上面還有空余的地圖
  begin
    while (FMapRect.Top > 0) and (FMapVector.Y > 0) do
    begin
      FMapRect.Top := FMapRect.Top - 1;
      FMapVector.Y := FMapVector.Y - CMapHeight;
    end;
    Result := True;
  end;
  if ((FMapVector.X + (FMapRect.Right-FMapRect.Left+1)*CMapWidth) < Width) //在放大的時候,而且右邊還有空余的地圖
    and (FMapRect.Right < GetMapCount(MapZoom)) then
  begin
    while ((FMapVector.X + (FMapRect.Right-FMapRect.Left+1)*CMapWidth) < Width)
      and (FMapRect.Right < GetMapCount(MapZoom)) do
    begin
      FMapRect.Right := FMapRect.Right + 1;
    end;
    Result := True;
  end;
  if ((FMapVector.Y + (FMapRect.Bottom-FMapRect.Top+1)*CMapHeight) < Height) //下面
    and (FMapRect.Bottom < GetMapCount(MapZoom)) then
  begin
    while ((FMapVector.Y + (FMapRect.Bottom-FMapRect.Top+1)*CMapHeight) < Height)
    and (FMapRect.Bottom < GetMapCount(MapZoom)) do
    begin
      FMapRect.Bottom := FMapRect.Bottom + 1;
    end;
    Result := True;
  end;
end;

procedure TEarthMap.WMMap(var AMsg: TMessage);
var
  sFileName: string;
  Zoom, x, y: Integer;
  Bitmap: TBitmap;
  procedure AnalyseParam;
  var
    iPos: Integer;
    sTmp: string;
  begin
    sTmp := ExtractFileName(sFileName);
    iPos := Pos('-', sTmp);
    Zoom := StrToIntDef(Copy(sTmp, 1, iPos-1), 0);
    Delete(sTmp, 1, iPos);
    iPos := Pos('-', sTmp);
    X := StrToIntDef(Copy(sTmp, 1, iPos-1), 0);
    Delete(sTmp, 1, iPos);
    iPos := Pos('.', sTmp);
    Y := StrToIntDef(Copy(sTmp, 1, iPos-1), 0);
  end;
begin
  sFileName := PChar(AMsg.WParam);
  AnalyseParam;
  if Zoom = MapZoom then
  begin
    Bitmap := FImage.Picture.Bitmap;
    DrawOneMap(Zoom, X, Y, Bitmap);
  end;
end;

procedure TEarthMap.WMSize(var AMsg: TWMSize);
begin
  inherited;
  FMapVector.X := FMapVector.X - (FWinWidth - AMsg.Width) div 2;
  FMapVector.Y := FMapVector.Y - (FWinHeight - AMsg.Height) div 2;
  StrechMap;
  DrawMap;
  FWinWidth := AMsg.Width;
  FWinHeight := AMsg.Height;
end;

function TEarthMap.GetMapCount(AZoom: Integer): Integer;
begin       //獲取地圖塊的坐標最大值
  if AZoom <= 0 then
  begin
    Result := 0;
  end
  else
  begin
    Result := 2 shl (AZoom - 1) - 1;
  end;
end;

procedure TEarthMap.OmImgMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FOrganMouse.X := X;
  FOrganMouse.Y := Y;
end;

procedure TEarthMap.OnImgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  TargetPoint: TPoint;
  xInv, yInv: Integer;
  dLongitude, dLatitude: Double;
begin
  inherited;
  if csDesigning in ComponentState then Exit; 
  TargetPoint.X := X;
  TargetPoint.Y := Y;
  
  if Shift = [ssLeft] then
  begin
    xInv := TargetPoint.X - FOrganMouse.X;
    yInv := TargetPoint.Y - FOrganMouse.Y;
    FMapVector.X := FMapVector.X + xInv;
    FMapVector.Y := FMapVector.Y + yInv;
    if StrechMap then
      DrawMap
    else
      ScrollBy(xInv, yInv);
  end;
//  FOrganMouse := TargetPoint;
  if Assigned(FOnMapGPS) then
  begin
    PelsToLongLat(MapZoom, FMapRect.Left*CMapWidth+X,
      FMapRect.Top*CMapHeight+Y, dLongitude, dLatitude);
    FOnMapGPS(Self, dLongitude, dLatitude);
  end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产成人午夜在线一区| 亚洲人xxxx| 中文字幕亚洲成人| 亚洲午夜av在线| 久久99久久99小草精品免视看| 欧美aⅴ一区二区三区视频| 成人综合婷婷国产精品久久 | 精品视频一区二区不卡| 欧美一级黄色录像| 日本一区二区免费在线观看视频| 亚洲最色的网站| 国内久久精品视频| 色婷婷av一区二区三区大白胸| 日韩一区二区三区视频在线观看 | 91在线国产观看| 欧美丰满美乳xxx高潮www| 国产网站一区二区| 日韩高清中文字幕一区| 色婷婷综合久久久久中文一区二区 | 在线不卡一区二区| 一二三四社区欧美黄| 韩国理伦片一区二区三区在线播放| 欧美亚州韩日在线看免费版国语版| 国产色一区二区| 欧美xxx久久| 日日摸夜夜添夜夜添精品视频| 国产精品一区二区三区乱码| 69av一区二区三区| 一区二区三区资源| 99r精品视频| 国产区在线观看成人精品 | 自拍偷拍亚洲欧美日韩| 韩国av一区二区三区| 91麻豆精品国产| 亚洲一级在线观看| 日本精品一区二区三区高清| 樱桃视频在线观看一区| 国产99久久久国产精品潘金| 精品剧情v国产在线观看在线| 天堂av在线一区| 色综合天天视频在线观看| 亚洲国产精品99久久久久久久久| 国产在线播放一区| 欧美电视剧免费全集观看| 亚洲精品国产a久久久久久| 色天使久久综合网天天| 亚洲免费观看高清完整版在线观看熊| 成人中文字幕合集| 国产精品网站导航| 91麻豆自制传媒国产之光| 成人欧美一区二区三区小说 | 亚洲综合精品久久| eeuss影院一区二区三区| 亚洲免费色视频| 欧亚洲嫩模精品一区三区| 一区二区不卡在线播放| 在线播放一区二区三区| 日韩国产在线观看一区| 精品区一区二区| 国产精品中文字幕日韩精品| 欧美片网站yy| 激情五月婷婷综合| 久久尤物电影视频在线观看| 国产精品 欧美精品| 精品国产一区二区三区av性色| 国产福利不卡视频| 国产精品久久精品日日| 色综合亚洲欧洲| 亚洲午夜成aⅴ人片| 欧美日韩亚洲另类| 风流少妇一区二区| 一区二区三区不卡视频在线观看 | 国产精品日日摸夜夜摸av| k8久久久一区二区三区| 亚洲欧洲精品成人久久奇米网| 一本色道久久综合亚洲91| 日韩成人dvd| 国产欧美综合在线| 99视频精品全部免费在线| 午夜精品成人在线| 精品国产乱码久久久久久影片| 国产盗摄精品一区二区三区在线| 亚洲黄色小说网站| 精品欧美一区二区久久| 成人午夜私人影院| 日韩精品一二三| 91精品婷婷国产综合久久性色| 99这里只有久久精品视频| 午夜视频在线观看一区二区 | 91丝袜高跟美女视频| 麻豆国产精品777777在线| 一区二区三区美女| 国产精品国产a级| 久久婷婷色综合| 欧美久久一二三四区| 91在线视频官网| 国产成人啪免费观看软件 | 成人sese在线| 精品一区精品二区高清| 日韩国产一区二| 亚洲福利一区二区三区| 日韩美女精品在线| 中文字幕视频一区| 亚洲国产高清在线观看视频| 久久综合狠狠综合久久综合88 | 日韩高清中文字幕一区| 亚洲第一狼人社区| 亚洲综合免费观看高清完整版在线 | 国产视频不卡一区| 国产午夜精品一区二区三区视频 | 欧美一区二区三区免费大片| 欧美三级电影网站| 欧美视频在线一区二区三区 | 日韩电影在线一区二区| 午夜电影网亚洲视频| 午夜国产不卡在线观看视频| 亚洲成人在线网站| 亚洲国产欧美日韩另类综合 | 国产91精品露脸国语对白| 国产一区二区不卡老阿姨| 毛片基地黄久久久久久天堂| 麻豆国产精品一区二区三区| 极品少妇xxxx偷拍精品少妇| 国产最新精品免费| 国产成人啪午夜精品网站男同| 国产精品一区三区| 懂色av噜噜一区二区三区av| 99精品久久只有精品| 日本精品视频一区二区| 欧美精品在线观看播放| 日韩一区二区三区av| 久久伊99综合婷婷久久伊| 久久精品在线免费观看| 成人欧美一区二区三区| 亚洲高清免费观看高清完整版在线观看| 亚洲午夜视频在线| 麻豆freexxxx性91精品| 国产精品亚洲第一| 色综合天天综合网天天看片| 欧美日韩在线播放一区| 欧美成人三级在线| 国产精品久久久久久久久快鸭| 一区二区三区不卡在线观看| 日本强好片久久久久久aaa| 高清不卡一二三区| 欧美午夜影院一区| 久久久精品日韩欧美| 亚洲欧美日韩国产一区二区三区| 亚洲gay无套男同| 国产精品亚洲视频| 欧美色网站导航| 国产日韩精品一区| 午夜国产精品一区| 99国内精品久久| 日韩欧美另类在线| 亚洲欧美韩国综合色| 蜜臀a∨国产成人精品| 99精品桃花视频在线观看| 欧美一区永久视频免费观看| 国产精品久久毛片| 免费视频一区二区| 欧美在线免费观看视频| 久久久久久久国产精品影院| 亚洲午夜久久久久久久久电影院| 国产精品夜夜嗨| 欧美一卡2卡3卡4卡| 亚洲另类在线制服丝袜| 国产另类ts人妖一区二区| 欧美天天综合网| 国产精品久久久久久久久图文区| 免费成人在线网站| 欧美日韩一区二区三区四区五区| 中文一区二区在线观看| 久久国产精品区| 欧美日韩视频专区在线播放| 专区另类欧美日韩| 成人网男人的天堂| 亚洲精品一区二区三区蜜桃下载 | 夜夜揉揉日日人人青青一国产精品| 国产真实乱子伦精品视频| 正在播放亚洲一区| 亚洲电影在线播放| 色婷婷综合久久久中文一区二区| 国产欧美日韩久久| 国内成+人亚洲+欧美+综合在线| 69久久夜色精品国产69蝌蚪网| 亚洲女人的天堂| www.亚洲人| 中文字幕一区二区日韩精品绯色| 国产高清不卡一区| 亚洲精品一区二区三区影院 | 99综合影院在线| 国产精品电影一区二区| 成人综合婷婷国产精品久久蜜臀 | 精品久久久久久久人人人人传媒| 亚洲18影院在线观看| 欧日韩精品视频| 亚洲国产精品一区二区www| 日本电影欧美片| 亚洲午夜精品一区二区三区他趣|