2012-07-19 12 views
6

Ho due moduli, il mio modulo principale è Form1 e il mio modulo secondario viene visualizzato su richiesta come una finestra di dialogo è Form2. Ora, se chiamo Form2, viene visualizzato sempre nell'angolo in alto a sinistra sullo schermo. La prima volta ho pensato che la mia forma non fosse affatto lì, ma poi l'ho vista appesa nell'angolo superiore dello schermo. Vorrei mostrare il mio modulo nella posizione corrente del mouse in cui l'utente fa clic su un menu di scelta rapida per visualizzare la finestra di dialogo modale. Ho già provato diverse cose e cercato campioni di codice. Ma non ho trovato nulla oltre a migliaia di codici diversi su come ottenere la posizione attuale del mouse in modi diversi che già conosco. Ma questa posizione è comunque sempre relativa allo schermo, alla forma principale, al controllo o qualunque sia il contesto attuale. Ecco il mio codice (il posizionamento del desktop, che ho provato anche non funziona e centri di centro-to-schermo la forma unica, così ho lasciato la proprietà di Windows.Default.Position):C# come mostrare un modulo in una posizione specifica del mouse sullo schermo?

 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); 

risposta

9

tuo problema è che la prima chiamata: frm2.ShowDialog(this); e quindi chiama frm2.SetDesktopLocation che in effetti viene chiamato solo dopo che il modulo (frm2) è già stato chiuso.

ShowDialog è una chiamata bloccante, ovvero restituisce solo quando il modulo chiamato chiama ShowDialog su chiude. Quindi avrai bisogno di un approccio diverso per impostare la posizione del modulo.

Probabilmente il modo più semplice per ottenere ciò sarebbe creare un secondo costruttore sul Form2 (che si desidera posizionare) che richiede due parametri, per le coordinate 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); 
    } 

Poi, quando si crea il form per visualizzarlo, utilizzare questo costruttore al posto di quello di default:

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

Si può anche provare a utilizzare this.Move(...)' instead of 'this.SetDesktopLocation nel gestore del carico.

+0

Avete provato il mio suggerimento? Hai implementato il costruttore modificato e questo non ha funzionato? –

+0

@feedwall - Sono contento che abbia funzionato per te (e grazie per l'upvote e l'accettazione) –

+0

StartPosition deve essere impostato su Manuale – ehh

2

è necessario chiamare SetDesktopLocation prima che il metodo ShowDialog(), in questo modo:

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); 
} 

Utilizzare le utilizzano statisti, è recomanded. Buona fortuna;)