2012-07-19 35 views
6

Tengo dos formularios, mi formulario principal es Form1 y mi formulario secundario se muestra a pedido ya que el diálogo es Form2. Ahora si llamo a Form2 aparece siempre en la esquina superior izquierda de mi pantalla. La primera vez pensé que mi forma no estaba allí, pero luego la vi colgando en la esquina superior de la pantalla. Me gustaría mostrar mi formulario en la posición actual del mouse donde el usuario hace clic en un menú contextual para mostrar el cuadro de diálogo modal. Ya he probado cosas diferentes y busqué ejemplos de código. Pero no encontré nada además de miles de códigos diferentes sobre cómo obtener la posición real del mouse de diferentes maneras que ya sé. Pero esta posición siempre es relativa a la pantalla, la forma principal, el control o cualquiera que sea el contexto actual. Aquí mi código (el posicionamiento de escritorio que también probé no funciona y centros de centro a la pantalla la forma única, así que me fui a la propiedad Windows.Default.Position):C# cómo mostrar un formulario en una posición específica del mouse en la pantalla?

 Form2 frm2 = new Form2(); 
     frm2.textBox1.Text = listView1.ToString(); 
     frm2.textBox1.Tag = RenameFile; 
     DialogResult dlgres=frm2.ShowDialog(this); 
     frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

Respuesta

9

Su problema es que su primera llamada: frm2.ShowDialog(this); y luego llame al frm2.SetDesktopLocation que de hecho solo recibe una llamada después de que el formulario (frm2) ya se haya cerrado.

ShowDialog es una llamada de bloqueo, lo que significa que solo se devuelve cuando se cierra el formulario al que llama ShowDialog. Por lo tanto, necesitará un enfoque diferente para establecer la posición del formulario.

Probablemente la manera más fácil de lograr eso sería crear un segundo constructor en su Form2 (que desea colocar) que toma dos parámetros, para las coordenadas X e Y.

public class Form2 
{ 

    // add this code after the class' default constructor 

    private int desiredStartLocationX; 
    private int desiredStartLocationY; 

    public Form2(int x, int y) 
      : this() 
    { 
     // here store the value for x & y into instance variables 
     this.desiredStartLocationX = x; 
     this.desiredStartLocationY = y; 

     Load += new EventHandler(Form2_Load); 
    } 

    private void Form2_Load(object sender, System.EventArgs e) 
    { 
     this.SetDesktopLocation(desiredStartLocationX, desiredStartLocationY); 
    } 

Entonces, cuando se crea el formulario para mostrarlo, utilice este constructor en lugar de la opción por defecto:

Form2 frm2 = new Form2(Cursor.Position.X, Cursor.Position.Y); 
frm2.textBox1.Text = listView1.ToString(); 
frm2.textBox1.Tag = RenameFile; 
DialogResult dlgres=frm2.ShowDialog(this); 

También puede intentar usar this.Move(...)' instead of 'this.SetDesktopLocation en el controlador de carga.

+0

¿Has probado mi sugerencia? ¿Implementaron el constructor modificado y eso no funcionó? –

+0

@feedwall - Me alegro de que funcionó para usted (y gracias por el voto favorable y acepto) –

+0

StartPosition debe configurarse en Manual – ehh

2

es necesario llamar a SetDesktopLocation antes de que el método ShowDialog(), así:

using(Form2 frm2 = new Form2()) 
{ 
    frm2.textBox1.Text = listView1.ToString(); 
    frm2.textBox1.Tag = RenameFile; 
    frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

    DialogResult dlgres=frm2.ShowDialog(this); 
} 

Use los que utilizan statemen, se recomanded. Buena suerte;)

Cuestiones relacionadas