2012-07-19 16 views
6

İki Formum var, ana formum Form1 ve bir iletişim kutusu olarak istek üzerine ikincil formum Form2. Şimdi Form2'yi çağırırsam, ekranımın sol üst köşesinde her zaman görünür. İlk kez, formumun hiç orada olmadığını düşündüm ama sonra üst ekran köşesinde asılı olduğunu gördüm. Formumun, kullanıcının modal iletişim kutusunu göstermek için bir içerik menüsünü tıkladığı mevcut fare konumunda göstermesini isterim. Zaten farklı şeyler denedim ve kod örnekleri aradım. Ama gerçek fare pozisyonunu nasıl bildiğim konusunda farklı şekillerde binlerce farklı koddan başka hiçbir şey bulamadım. Ancak bu konum her zaman ekrana, ana forma, kontrole veya mevcut içerik ne olursa olsun göreceli olarak geçerlidir. İşte benim kodu (Ben de çalışmak ve merkezden-ekrandaki merkezleri form yalnızca, bu yüzden Windows.Default.Position mülkü terk etmez çalıştı masaüstü konumlandırma):C# Ekranda belirli bir fare konumunda bir form nasıl gösterilecek?

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

cevap

9

Senin sorunun olmasıdır İlk aramaniz: frm2.ShowDialog(this); ve daha sonra frm2.SetDesktopLocation'u arayiniz, bu da yalnizca form (frm2) zaten kapatildiktan sonra aranir.

ShowDialog engelleme çağrısıdır; bu, yalnızca ShowDialog aradığınız form kapanırsa döndürdüğü anlamına gelir. Böylece form pozisyonunu ayarlamak için farklı bir yaklaşıma ihtiyacınız olacak.

Muhtemelen bunu gerçekleştirmenin en kolay yolu, X ve Y koordinatları için iki parametre alan Form2'nizde (konumlandırılmasını istediğiniz) ikinci bir kurucu oluşturmak olacaktır. Bunu göstermek için formu oluştururken

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

Ardından, varsayılan bir yerine bu yapıcı kullanın:

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

Ayrıca Yük işleyicisinde this.Move(...)' instead of 'this.SetDesktopLocation kullanmayı deneyebilirsiniz.

+0

Önerim denediniz mi? Değiştirilmiş kurucuyu uyguladınız mı ve işe yaramadı mı? –

+0

@feedwall - Sizin için çalıştığına sevindim (ve destek ve kabul için teşekkürler) –

+0

StartPosition'ın Manuel olarak ayarlanması gerekiyor – ehh

2

Sen şöyle ShowDialog() yönteminden önce SetDesktopLocation çağırmanız gerekir:

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

kullanarak statemen kullanın, bu recomanded oluyor. İyi şanslar;)