2012-06-08 9 views
12

मुझे किसी अन्य रूप के सामने बिल्कुल एक फॉर्म दिखाना होगा, इससे मुझे निम्नलिखित प्रश्नों का सामना करना पड़ेगा।फॉर्म। माता-पिता और StartPosition.CenterParent

फ़ील्ड this.Parent फ़ील्ड होने पर CenterParent के रूप में एक प्रारंभ स्थिति कैसे हो सकती है?

यह माता-पिता को सही ढंग से स्थिति देने के लिए पता होना चाहिए, जो यह करता है, लेकिन Parent फ़ील्ड सेट नहीं है। यह गलत है। क्या मैं कुछ भूल रहा हूँ?

 Form2 f = new Form2(); 
     f.ShowDialog(); 

मैं बच्चे के रूप में सब कुछ करता हूं। माता-पिता डिफ़ॉल्ट विंडो स्थिति पर सेट है। इससे कोई फर्क नहीं पड़ता कि मैं मूल रूप से कहां जाता हूं, बच्चा माता-पिता के केंद्र में दिखाया जाता है।

+0

जब आप माता-पिता जो एक माता पिता खिड़कियों के आधार पर स्क्रीन को मध्य करने के लिए सेट कर दिया जाता है is not अनुमान लगा एप्लिकेशन im शुरू प्राकृतिक सेटिंग्स, अगर आप इस 'माता-पिता' फॉर्म ले जाने के लिए स्क्रीन के ऊपरी बाएँ कोने में कहने के लिए करता है, 'बच्चा' अभी भी उस पर या आपकी पूरी स्क्रीन के केंद्र में केंद्र है? – RhysW

+0

कोई फर्क नहीं पड़ता कि मैं मूल रूप से कहां स्थानांतरित करता हूं, बच्चे को सही ढंग से – Odys

+1

पर कब्जा कर लिया गया है जब आप माता-पिता को शून्य मानते हैं? ऑनलोड ईवेंट में केंद्रित किया जाता है, अगर आप इसके माता-पिता को इसके बाहर शून्य पर सेट करते हैं तो ऐसा क्यों हो सकता है। इसके माता-पिता, केंद्र हैं, फिर कहा कि उसके बाद माता-पिता नहीं हैं – RhysW

उत्तर

8

मालिक के बारे में जानकारी API कॉल के माध्यम से बनाया संवाद करने के लिए पारित हो जाता है (जैसा कि आप देख सकते हैं कि ShowDialog (भीतर परावर्तक में IWin32Window मालिक) विधि):

UnsafeNativeMethods.SetWindowLong(new HandleRef(this, base.Handle), -8, new HandleRef(owner, handle)); 

जब कोई मालिक में निर्दिष्ट है

: आप GetWindowLong API call उपयोग कर सकते हैं

IntPtr activeWindow = UnsafeNativeMethods.GetActiveWindow(); 
IntPtr handle = (owner == null) ? activeWindow : Control.GetSafeHandle(owner); 

मालिक संवाद प्रपत्र च तक पहुँच प्राप्त करने के लिए: ShowDialog owner चर फोन GetActiveWindow API कॉल के माध्यम calcualated है

IntPtr ownerHandle = NativeMethods.GetWindowLong(nonModalForm.Handle, -8); 
+0

धन्यवाद दिमित्रीजी, लेकिन 'शोमोडाल' के साथ होने वाला जादू क्या है? ध्यान दें कि मैं माता-पिता को 'ShowDialog() 'पर पास नहीं करता हूं। – Odys

+0

+1 अच्छा बिंदु। –

+0

ShowDialog विधि का यह संस्करण किसी मालिक या नियंत्रण को उसके स्वामी के रूप में निर्दिष्ट नहीं करता है। जब यह संस्करण कहा जाता है, तो वर्तमान में सक्रिय विंडो को संवाद बॉक्स का स्वामी बना दिया जाता है। यदि आप एक विशिष्ट मालिक निर्दिष्ट करना चाहते हैं, तो इस विधि के दूसरे संस्करण का उपयोग करें। एमएसडीएन टिप्पणियां पढ़ें - http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx। मुझे लगता है कि आप दिमित्रीजी के जवाब को स्वीकार कर सकते हैं। –

1

मेरा मानना ​​है कि इस जानकारी को किसी कारण से आंतरिक रूप से .NET Framework द्वारा संग्रहीत किया जाता है। फिर बच्चे में

Form form = new Form(); 
form.Owner = this; 
form.Show(); 

आप मालिक संपत्ति का उपयोग कर माता-पिता के फार्म का उपयोग कर सकते फार्म: वैसे भी, आप यह बच्चे फार्म के Owner property करने के लिए सेट कर सकते हैं यदि आप माता पिता के फार्म के लिए उपयोग करना चाहते हैं। जब किसी प्रपत्र का स्वामित्व किसी अन्य रूप से होता है, तो इसे मालिक के रूप में कम और बंद कर दिया जाता है। स्वामित्व वाले फॉर्म भी अपने मालिक के फॉर्म के पीछे कभी प्रदर्शित नहीं होते हैं, जो आपको सही समझने पर आपको जो चाहिए वह बेहद जरूरी है।

3

एक माता-पिता और खिड़की के मालिक के बीच का अंतर Winforms में थोड़ा उलझन में है। इस संदर्भ में, सेंटरपैंट वास्तव में सेंटरऑनर का मतलब है। विंडोज़ क्षमता नहीं, इसे बेस फॉर्म.ऑनलोड() विधि द्वारा किए गए विनफॉर्म में कार्यान्वित किया जाता है। एक संवाद में हमेशा एक मालिक होना चाहिए, जब आप ShowDialog() कॉल में निर्दिष्ट नहीं करते हैं तो यह एक के लिए शिकार करता है। जो GetActiveWindow() का सबसे अच्छा अनुमान के रूप में उपयोग करता है।

इस खुद के लिए इस तरह संवाद के रूप में अधिभार OnLoad देखने के लिए,:

public partial class Form2 : Form { 
    public Form2() { 
     InitializeComponent(); 
     this.StartPosition = FormStartPosition.CenterParent; 
    } 
    protected override void OnLoad(EventArgs e) { 
     //base.OnLoad(e); 
    } 
} 

और ध्यान दें कि यह अब मालिक पर केंद्रित है।

आप संदर्भ स्रोत में प्रासंगिक कोड देख सकते हैं, Form.cs वर्ग, OnLoad विधि:

if (GetState(STATE_MODAL)) { 
    FormStartPosition startPos = (FormStartPosition)formState[FormStateStartPos]; 
    if (startPos == FormStartPosition.CenterParent) { 
     CenterToParent(); 
    } 
    else if (startPos == FormStartPosition.CenterScreen) { 
     CenterToScreen(); 
    } 
} 
0

इस कोड को पैरेंट टैग के बीच में संवाद खुल जाएगा।

ObjectDistrubution od = new ObjectDistrubution(); 
    od.StartPosition = FormStartPosition.CenterParent; 
    od.ShowDialog(); 
संबंधित मुद्दे