Panning tùy chỉnh bằng ArcGIS Engine


8

Do một số hạn chế, mà tôi sẽ không đi vào, tôi đã thấy mình cần phải thực hiện panning tùy chỉnh trong ứng dụng của mình.

Tham chiếu API ArcGIS đề xuất sử dụng các phương pháp sau:

IScreenDisplay2.PanStart(IPoint start)    // Starts a pan
IScreenDisplay2.PanMoveTo(IPoint moveTo)  // Moves to a point
IScreenDisplay2.PanEnd()                  // Ends the pan

Mỗi phương thức này được gọi trong các trình xử lý sự kiện sau (tương ứng):

IMapControl4.OnMouseDown     // Call PanStart()
IMapControl4.OnMouseMove     // Call PanMoveTo()
IMapControl4.OnMouseUp       // Call PanEnd()

Vì vậy, tất cả những điều đó hoạt động tốt, các sự kiện được xử lý, panning bắt đầu, mọi người đều hạnh phúc.

-nhưng-

Nơi màn hình thực sự không phải là nơi tôi đã kéo con trỏ của mình. Bản đồ trượt xung quanh theo một mô hình hơi xác định, nhưng tôi dường như không thể tìm ra cách bù đắp cho những gì API đang làm. Tôi đã không thể tìm thấy bất kỳ tài liệu khai sáng.

Có ai có kinh nghiệm với phần này của API không? Mã mẫu hoặc tài liệu sẽ là tuyệt vời!


1
Bạn đã thử thiết lập một câu lệnh gỡ lỗi để in ra IDisplayTransatures.DeviceFrame khi bản đồ hoàn thành mỗi pan? Trước đây, tôi đã nhận thấy trong một số điều kiện, kích thước khung thiết bị bị thay đổi thành giá trị không phù hợp.
Kirk Kuykendall

@Kirk - DeviceFrameKhông thay đổi chút nào khi panning. Đó là để được mong đợi mặc dù, chính xác? Khung thiết bị chỉ bằng kích thước của khung theo tọa độ thiết bị (pixel)
tbridge

Đúng, nó không nên thay đổi. Bạn đã thử nghe ITransformEvents.VisibleBoundUpdated trên ví dụ hiển thị thông tin chưa? Có lẽ nó được gọi hai lần? Ngoài ra, bạn đã thử gọi TrackPan chưa?
Kirk Kuykendall

@Kirk Không may mắn với VisibleBoundsUpdatedviệc gọi hai lần. Tôi sẽ sử dụng TrackPan()nhưng tôi cần tiếp tục xử lý các sự kiện chuột trong khi di chuyển và chúng bị TrackPan
đè nén

Bạn có thể gửi mã trong trình xử lý sự kiện. Liệu panning chấm dứt OnMouseUp và chỉ kết thúc ở một vị trí không mong muốn? Bạn đã thử tạo một điểm từ X, Y của OnMouseDown và OnMouseUp chưa? Do chúng tương ứng với nơi panning bắt đầu và kết thúc.
Jakub Sisak GeoGraphics

Câu trả lời:


2

Tôi đã thử @ phiên bản 10 SP 1 này nhưng nó sẽ hoạt động trên mọi phiên bản.

public class PanTool extends BaseCommand implements ITool {
private HookHelper hookHelper = null;
private IScreenDisplay display;

public PanTool()    {
    this.category = "Text";
    this.caption = "Text";
    this.message = "Text";
    this.toolTip = "Text";
    this.name = "Text";
    this.bitmapPath = System.getProperty("user.dir") + "/cmdbitmaps/your_icon.bmp";
    this.enabled = true;
}

@Override
public void onCreate(Object hook)   {
    if (hook == null)
        return;
    try {
        hookHelper = new HookHelper();
        hookHelper.setHookByRef(hook);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onClick()   {
    try {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        map.setCurrentToolByRef(this);
    } catch (Exception e)   {
        e.printStackTrace();
    }
}

@Override
public void onMouseDown(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1) {
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();
        display = map.getActiveView().getScreenDisplay();

        display.panStart(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public void onMouseUp(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panStop();
        MapControl map = (MapControl) ((ToolbarControl) hookHelper.getHook()).getBuddy();

        map.getActiveView().refresh();
    }
}

@Override
public void onMouseMove(int button, int shift, int x, int y) throws IOException, AutomationException {
    if(button == 1 && display != null)  {
        display.panMoveTo(display.getDisplayTransformation().toMapPoint(x, y));
    }
}

@Override
public boolean onContextMenu(int x, int y) throws IOException, AutomationException {
    return false;
}


@Override
public boolean deactivate() throws IOException, AutomationException {
    return true;
}

@Override
public int getCursor() throws IOException, AutomationException {
    return esriSystemMouseCursor.esriSystemMouseCursorHand;
}

@Override
public void onDblClick() throws IOException, AutomationException {

}

@Override
public void onKeyDown(int keyCode, int shift) throws IOException, AutomationException {

}

@Override
public void onKeyUp(int arg0, int arg1) throws IOException, AutomationException {

}

@Override
public void refresh(int arg0) throws IOException, AutomationException {

}

}}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.