5 votos

Arrastre una Característica de ESRI, ArcObjects Motor (AxMapControl)

Estoy tratando de implementar el mover de un punto de función en una costumbre C# ArcGIS Engine aplicación en una AxMapControl. Ya he creado una herramienta personalizada para hacer otras cosas. Y puedo pista cuando el usuario está haciendo un arrastre-tipo de operación (es decir, haga clic y mantenga presionado mientras mueves el ratón).

Lo que me gustaría ser capaz de hacer es dar algunas feedback visual de la operación de arrastre, pero no estoy seguro de cómo hacerlo.

Puedo manejar la función de selección, identificación del arrastre, y llegar a la nueva posición, etc. Sólo necesita ayuda en concreto con el arrastre de retroalimentación. Idealmente me gustaría actualizar el cursor a tener la misma simbología de la función, pero eso no es un requisito absoluto.

10voto

saint_groceon Puntos 2696

El truco para que la retroalimentación es la configuración de ISymbol.ROP a esriROPNotXOrPen y el dibujo de la geometría en dos ocasiones, la primera muestra, el segundo sorteo borra. Asegúrese de que si usted está utilizando múltiples capas de símbolo para establecer las reglas de participación para cada capa.

public class MyTool : ESRI.ArcGIS.Desktop.AddIns.Tool
{

    private ISymbol m_Symbol;
    private IPoint m_lastPoint;
    private bool m_Dragging = false;
    public MyTool()
    {
        m_Symbol = new SimpleMarkerSymbolClass();
        ((ISimpleMarkerSymbol)m_Symbol).Size = 20.0;
        m_Symbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen; 
    }

    protected override void OnUpdate()
    {

    }
    protected override void OnMouseDown(Tool.MouseEventArgs arg)
    {
        m_Dragging = !m_Dragging;
        if (!m_Dragging)
            Draw(arg.X, arg.Y);
    }

    protected override void OnMouseMove(Tool.MouseEventArgs arg)
    {
        if(m_Dragging)
            Draw(arg.X, arg.Y);
    }

    private void Draw(int X, int Y)
    {
        var av = ArcMap.Document.FocusMap as IActiveView;
        var pnt = av.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
        av.ScreenDisplay.StartDrawing(av.ScreenDisplay.hDC, 0);
        av.ScreenDisplay.SetSymbol(m_Symbol);
        if(m_lastPoint != null)
            av.ScreenDisplay.DrawPoint(m_lastPoint);
        if (m_Dragging)
        {
            av.ScreenDisplay.DrawPoint(pnt);
            m_lastPoint = pnt;
        }
        else
            m_lastPoint = null;
        av.ScreenDisplay.FinishDrawing();
    }

    protected override bool OnDeactivate()
    {
        // todo
        return base.OnDeactivate();
    }
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X