9 votos

La creación flotante sólo (no empotrado) de la ventana de ArcMap el uso de ArcObjects?

Estoy buscando una manera de crear una ventana flotante en ArcMap. Para dar un ejemplo, basta con mirar por la ventana de la herramienta Identificar.

Flotante significa que permanece en frente de el documento de mapa en todo momento y que el usuario puede continuar trabajando con ArcMap. Sé que la interfaz de IDockableWindowDef puede ser utilizado para crear las ventanas acoplables que también puede flotar, pero no quiero a atracar. A mi conocimiento, no es posible evitar que los formularios creados por IDockableWindowManager de acoplamiento por ejemplo, si el usuario empuja a la frontera de la ventana de ArcMap.

Alguna idea?


La solución fue buscar por palabras clave, como el niño de la ventana y el MDI. HTH

La solución del problema parece ser tan fácil como @llcf la respuesta:

MyForm form = new MyForm();
form.Show(NativeWindow.FromHandle(new IntPtr(m_application.hWnd)));

3voto

bastibe Puntos 3569

He encontrado la respuesta a este problema con la ayuda de los mayores de ESRI foros. Sólo había utilizado las palabras claves equivocadas hasta ahora :/ La solución está en SetWindowLong():

// import external methods
[DllImport("user32.dll")]
static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll")]
static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
private int GWL_HWNDPARENT = -8;

public TestForm()
{
    InitializeComponent();

    IntPtr mxPtr = new IntPtr(GetApplicationReference().hWnd);
    if(IntPtr.Size == 8) { // needed for 64bit compatibility?
        SetWindowLongPtr(this.Handle, GWL_HWNDPARENT, mxPtr);
    } else {
        SetWindowLong(this.Handle, GWL_HWNDPARENT, mxPtr);
    }
}

No estoy muy seguro de si la compatibilidad de 64 bits se implementa la derecha, porque SetWindowLongPtr() se supone que supersed SetWindowLong (), pero yo no era capaz de conseguir que funcione en mi máquina de 64 bits. Siempre tengo un EntryPointNotFoundException. Pero al menos esto funciona con mi dev instalación.

0voto

monksy Puntos 143

Si usted está usando .RED, creando un no modal Formulario de Windows y la configuración de la parte más alta de la propiedad a true es la mejor apuesta. Usted también querrá establecer la Forma del Padre de la propiedad para la aplicación ArcMap.

sealed class MyForm : Form
{
    // ... other impl ...

    public void SetMxParent(IApplication app)
    {
        IntPtr mxPtr = new IntPtr(app.hWnd);
        this.Parent = Control.FromHandle(mxPtr);

        // optionally
        this.TopMost = true;
    }
}

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