2009-08-12 13 views
5

Hice esta pregunta previamente y pensé que la había descifrado, pero todavía no funciona. Form.Show() moves form position slightlyForm.Location does not

Así que tengo un formulario principal que abre un grupo de niños con show() y cuando se necesita uno utilizo bringToFront() para mostrarlo. El problema es cuando se llama a show() que la forma secundaria está perfectamente alineada, pero cuando uso bringToFront se mueve hacia la izquierda y hacia abajo 1 px, que se atornilla con mis bordes. Establecí todas las propiedades secundarias en Propiedades de posición en Manual antes de mostrarlas(). Configuré frm.location = new Point (x, y) cuando llevo al frente. También probé explicity setting frm.location when show() - ing también. Todavía lo mueve hacia la izquierda y abajo 1 px cuando llevo ToFront(). ¿Hay algo con bringToFront() que no me permita cambiar la propiedad de ubicación del formulario? Aquí está mi código:

if (myNewForm != null) 
{ 
    myNewForm.MdiParent = this; 

    bool isFormOpen = false; 

    foreach (Form frm in Application.OpenForms) 
    { 
     if (frm.GetType() == myNewForm.GetType()) 
     { 
      frm.WindowState = FormWindowState.Maximized; 
      frm.BringToFront(); 
      frm.Location = new Point(-4, -30); 
      isFormOpen = true; 
      break; 
     } 
    } 

    if (!isFormOpen) 
    { 
     myNewForm.StartPosition = FormStartPosition.Manual; 
     myNewForm.Show(); 
    } 
} 

EDIT: Ok por lo que al parecer, Microsoft tiene un error que permite StartPosition sólo funcionan para ShowDialog() y no show(), pero se niega a solucionarlo: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=107589

Pero mis necesidades de aplicaciones para mantener abiertos todos los formularios diferentes y simplemente ponerlos en primer plano cuando sea necesario ... para que ShowDialog() no se haya utilizado correctamente en esta instancia, ¿es correcto? Entonces, ¿qué opciones tengo? ¿Alguna?

+0

Hmmm ... Si quito FormWindowState.Maximized esto es exactamente lo que yo quiero que sin embargo entonces el MdiParent permite al usuario desplazarse y ver al niño completo y los niños detrás de él y no quiero que sea .... – novacara

Respuesta

1

¿Qué pasa con el uso de un p/Invoke to MoveWindow? El enlace proporcionado incluye un ejemplo de C#.

+0

Funciona perfectamente !! ¡¡Muchas gracias!! – novacara

+0

¡Me alegro de que funcionó! – Armbrat

+0

Como una pregunta complementaria ... ¿Alguien sabe cómo funciona usar las llamadas a la API de Windows con Visual Studio? ¿Los dlls se incluyen con el producto terminado o el programa solo se puede usar en un sistema operativo Windows? – novacara

0

¿Ha intentado mostrar el formulario y luego ajustar la ubicación?

Editar

: O, ¿ha intentado ajustar las propiedades Left y Top?

+0

Sí, lo he intentado. Y es el BringToFront() que es el problema y no el Show() - ing.Pero también intenté traer al frente y luego ajustar la ubicación ... todavía nada. – novacara

+0

Sí, el mismo problema. El problema parece ser que, en primer lugar, Show() no permite que StartPosition se configure como se supone que debe hacerlo, por lo que no debe volver a ubicarse. En segundo lugar, al maximizar al niño lo mueve hacia abajo 1px y hacia la derecha 1px, aunque no entiendo por qué porque se maximiza al principio pero se ubica donde se supone que debe estar. Si no maximizo, el padre mdi da barras de desplazamiento y definitivamente no quiero eso. Si edito el formulario para que quede 1px a la izquierda y arriba donde está ahora, se muestra incorrectamente al principio pero correctamente cuando traigo el frente(). ¡Todo lo que quiero es una solución! – novacara

1

Supongo que los formularios se mueven por el código que maneja las solicitudes Mostrar() (y BringToFront), por lo que realmente no puede establecer la ubicación del formulario, ni antes ni después de llamar al método, porque la ubicación del formulario se actualizará después el código en su ventana principal se ha ejecutado (y dejó el control de nuevo a la bomba de mensajes de la ventana, en términos de Win32, básicamente).

me gustaría utilizar una subclase de formulario para cada una de sus formas y luego añadir una propiedad Punto explícita que indica la posición fija, donde se espera que la particular forma de ser. Dentro de esta clase, anule el método virtual OnShown (o quizás el método OnActivated también) y simplemente actualice esta ubicación con la ubicación correcta.

Eso debería obligar a las formas en la posición correcta, incluso si algún código dentro de formas de las ventanas cambia en algún momento.

1

¿Has probado:

this.Location 

o

Form.ActiveForm.Location?

15

Si desea establecer la ubicación de la forma, usted tiene que fijar de WindowState a Normal la forma (en cualquier otro entorno, la ubicación se establece para usted de acuerdo a las reglas de ese entorno, por lo que se omite su valor), y es StartPosition a Manual.

frm.WindowState = FormWindowState.Normal; 
frm.StartPosition = FormStartPosition.Manual; 
frm.BringToFront(); 
frm.Location = new Point(-4, -30); 
+0

"TDull" ¿De dónde vienes? ქართველი ხარ ...! – IremadzeArchil19910311

Cuestiones relacionadas