2012-07-19 16 views
6

मेरे पास दो रूप हैं, मेरा मुख्य रूप फॉर्म 1 है और एक संवाद के रूप में मांग पर दिखाया गया मेरा द्वितीयक रूप फॉर्म 2 है। अब अगर मैं फॉर्म 2 को कॉल करता हूं तो यह हमेशा मेरी स्क्रीन पर ऊपरी बाएं कोने में दिखाई देता है। पहली बार मैंने सोचा कि मेरा फॉर्म बिल्कुल नहीं है, लेकिन फिर मैंने इसे ऊपरी स्क्रीन कोने में लटका देखा। मैं अपना फॉर्म वर्तमान माउस स्थिति पर दिखाना चाहता हूं जहां उपयोगकर्ता मोडल संवाद दिखाने के लिए संदर्भ मेनू पर क्लिक करता है। मैंने पहले से ही विभिन्न चीजों की कोशिश की है और कोड नमूने की खोज की है। लेकिन मुझे विभिन्न तरीकों से वास्तविक माउस स्थिति कैसे प्राप्त करें, इस बारे में हजारों अलग-अलग कोडों के अलावा कुछ भी नहीं मिला जो मुझे पहले से ही पता है। लेकिन यह स्थिति हमेशा स्क्रीन, मुख्य रूप, नियंत्रण या जो भी वर्तमान संदर्भ है, के सापेक्ष है। यहाँ मेरी कोड (डेस्कटॉप स्थिति जो मैं भी करने की कोशिश की काम नहीं करता है और केंद्र-टू-स्क्रीन केन्द्रों प्रपत्र केवल, तो मैं Windows.Default.Position को संपत्ति छोड़ दिया):सी # स्क्रीन पर एक विशिष्ट माउस स्थिति पर एक फॉर्म कैसे दिखाना है?

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

उत्तर

9

आपकी समस्या यह है कि आपका पहला कॉल: frm2.ShowDialog(this); और फिर frm2.SetDesktopLocation पर कॉल करें जो वास्तव में केवल फॉर्म (frm2) के बाद ही कॉल हो जाता है।

शोडियलॉग एक अवरुद्ध कॉल है - जिसका अर्थ यह है कि यह केवल तभी लौटाता है जब आप शोडियलॉग को बंद कर रहे हैं। तो आपको फॉर्म स्थिति सेट करने के लिए एक अलग दृष्टिकोण की आवश्यकता होगी।

शायद इसे पूरा करने का सबसे आसान तरीका आपके फॉर्म 2 (जिसे आप तैनात करना चाहते हैं) पर दूसरा कन्स्ट्रक्टर बनाना होगा जो एक्स और वाई निर्देशांक के लिए दो पैरामीटर लेता है।

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

तब, जब आप इसे प्रदर्शित करने के लिए प्रपत्र बनाने के लिए, यह निर्माता के बजाय डिफ़ॉल्ट एक की का उपयोग करें:

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

तुम भी लोड हैंडलर में this.Move(...)' instead of 'this.SetDesktopLocation उपयोग करने का प्रयास कर सकते हैं।

+0

क्या आपने अपना सुझाव दिया है? क्या आपने संशोधित कन्स्ट्रक्टर को कार्यान्वित किया था और यह काम नहीं किया था? –

+0

@feedwall - मुझे खुशी है कि यह आपके लिए काम करता है (और ऊपर उठाने और स्वीकार करने के लिए धन्यवाद) –

+0

प्रारंभपोत को मैन्युअल पर सेट करने की आवश्यकता है – ehh

2

आप विधि ShowDialog() से पहले SetDesktopLocation कॉल करने के लिए है, इसलिए की तरह की जरूरत है:

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

statemen का उपयोग कर का उपयोग करें, यह recomanded है। शुभकामनाएं;)

संबंधित मुद्दे