2011-06-14 26 views
6

मैं विनफॉर्म एप्लिकेशन पर काम कर रहा हूं और पैरेंट फॉर्म के केंद्र में मोडल फॉर्म खोलना चाहता हूं। Winform आवेदन में है:एमडीआई आवेदन में पेरेंट फॉर्म के केंद्र में ओपन मॉडल विंडो

  1. एमडीआई फार्म
  2. एमडीआई फार्म के मेनू आइटम में से एक के क्लिक पर
  3. (सभी के लिए कंटेनर के रूप में स्टार्टअप फार्म और अधिनियम के रूप में खुला) - एक एमडीआई बाल रूप
  4. पर खुलता है चरण 2 में खोले गए एमडीआई चाइल्ड पर एक बटन पर क्लिक करें - एक मोडल फॉर्म खोलता है - जिसे हमें एमडीआई चाइल्ड फॉर्म (चरण 2 में खोला गया) के केंद्र में खोलने की जरूरत है

तो केंद्र 1 में मोडल फॉर्म खोलने के लिए मैंने जो स्पष्ट समाधान किया था वह

है
TestModalForm obj = new TestModalForm() 
obj.StartPosition = FormStartPosition.CenterParent; 
obj.showdialog(this); 

लेकिन उपरोक्त समाधान काम नहीं करता क्योंकि मोडल फॉर्म हमेशा एमडीआई फॉर्म को अपने माता-पिता के रूप में मानता है। 2 समाधान के लिए तो मैं कसरत: कि में मैं मोडल विंडो के फार्म लोड में विधि लिखा था के रूप में नीचे के केंद्र में स्थित करने के लिए:

 private void MakeWinInCenter() 
     { 
      if (this.Owner != null) 
      { 
       Form objParent = null; 
       int TopbarHeight = 0; 
       if (this.Owner.IsMdiContainer && this.Owner.ActiveMdiChild != null) 
       { 
        objParent = this.Owner.ActiveMdiChild; 
        TopbarHeight = GetTopbarHeight(this.Owner); 
       } 
       else 
        objParent = this.Owner; 

       Point p = new Point((objParent.Width - this.Width)/2, (objParent.Height - this.Height)/2); 
       p.X += objParent.Location.X; 
       p.Y += TopbarHeight + objParent.Location.Y; 
       this.Location = p; 
      } 
      else 
      { 
       //If owner is Null then, we have reference of MDIForm in Startup Class - use that ref and opens win in center of MDI 
       if (Startup.MDIObj != null) 
       { 
        this.Left = Convert.ToInt32((Startup.MDIObj.Width - this.Width)/2); 
        this.Top = Convert.ToInt32((Startup.MDIObj.Height - this.Height)/2); 
       } 
      } 

     } 

     private int GetTopbarHeight(Form MDIForm) 
     { 
      int TopbarHeight = 0; 
      MdiClient objMDIClient = null; 
      foreach (Control ctl in MDIForm.Controls) 
      { 
       if (ctl is MdiClient) 
       { 
        objMDIClient = ctl as MdiClient; 
        break; 
       } 
      } 
      if (objMDIClient != null) 
      { 
       TopbarHeight = MDIForm.Height - objMDIClient.Size.Height; 
      } 
      return TopbarHeight; 
     } 

समाधान ऊपर सही काम करता है एमडीआई प्रपत्र बड़े दृश्य के रूप में खोला जाता है जब। लेकिन जब हमने एमडीआई फॉर्म (यानी अधिकतम फॉर्म में नहीं) का आकार बदलकर या अन्य स्क्रीन पर एमडीआई फॉर्म को स्थानांतरित करके चेक किया - कई स्क्रीनों के मामले में, उपरोक्त समाधान काम नहीं कर रहा है और एमडीआई के रूप में मोडल फॉर्म नहीं खोलता है बाल फार्म

भी this Question पर देखा लेकिन यह मेरी समस्या के लिए सहायक नहीं है।

क्या किसी को भी समस्या का समाधान करने के लिए कोई सुझाव या समाधान हो सकता है।

धन्यवाद

उत्तर

1

इस प्रयास करें:

TestModalForm.showdialog(this.MdiParent); 
+1

अगर (यह। एमडीपीेंट! = शून्य) ... –

+0

हैलो डेविड, टेस्टमोडालफॉर्म.शॉडियलोग (यह। एमडीआईपीेंट); यह काम नहीं कर रहा है। यह भी। MdiParent शून्य देता है ताकि यह एमडीआई के केंद्र में प्रदर्शित हो - जो आवश्यक नहीं है। मुझे दूसरे एमडीआई चाइल्ड के केंद्र में तीसरी मोडल विंडो खोलनी होगी। प्रश्न की शुरुआत में इसका तीसरा बिंदु। – Shah

0

आपका विधि बहुत ज्यादा जटिल लगता है। ऐसा क्यों न करें?

// All code goes in your MDI Child form 

// Create the modal form 
TestModalForm obj = new TestModalForm(); 

// Find center point of MDI Parent form 
Point centerPoint = new Point(this.MdiParent.Top + this.MdiParent.Height/2, 
           this.MdiParent.Left + this.MdiParent.Width/2); 
// Set the location and show the modal form 
obj.StartPosition = FormStartPosition.Manual 
obj.Location = centerPoint; 
obj.ShowDialog(this); 
0

मुझे लगता है कि आप इस

//for modal form set its strat position to centerparent like this 

**this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;** 

// this will open the modalform in center of parent form 
+0

यह एमडीआई अभिभावक के केंद्र में संवाद दिखाता है, जबकि ओपी को एमडीआई बाल रूप के केंद्र में दिखाने की जरूरत है। –

0

एमडीआई में रूपों center to parent अपेक्षा के अनुरूप प्रलेखन MSDN, यह हमेशा center to screen उपयोग करने के लिए सिफारिश की है देखें काम नहीं करता है क्या करना चाहिए, लेकिन मैं एक काम के आसपास का उपयोग इसके लिए, यह स्थान पोजीशनिंग के बारे में है, इसलिए मैंने center to parent के लिए एक ओवरराइड विधि बनाई और इसे बच्चे के फॉर्म load event पर इस्तेमाल किया ताकि हर बार जब बच्चे को लोड किया जाता है तो यह माता-पिता के लिए केंद्रित होता है:

private void CenterToParentOverride() 
    { 
     this.Location = new Point(
      this.MdiParent.ClientSize.Width/2 - this.Width/2, 
      this.MdiParent.ClientSize.Height/2 - this.Height/2); 
    } 
+0

ओपी एमडीआई माता-पिता के केंद्र में एमडीआई अभिभावक फॉर्म के केंद्र में संवाद दिखाना चाहता है। –

0

रूप दिखाने के लिए अपनी मूल के केंद्र में ShowDialog का उपयोग करते समय माता-पिता एमडीआई बाल है, तो आप कोड

कोड एक एमडीआई बाल फार्म और शो में एक बटन से चलाने के लिए माना जाता है निम्नलिखित का उपयोग कर सकते एमडीआई बाल प्रपत्र के केंद्र में मॉडल संवाद के रूप में एक और रूप:

var dialog = new Form(); //The form which you want to show as dialog 
//this.Parent point to the MdiClient control which is the container of this 
var p = this.Parent.PointToScreen(this.Location); 
p.Offset((this.Width - dialog.Width)/2 , (this.Height - dialog.Height)/2); 
dialog.StartPosition = FormStartPosition.Manual; 
dialog.DesktopLocation = p; 
dialog.ShowDialog(); 

उपरोक्त कोड में, मौजूदा रूप के बाद से एक एमडीआई बाल, तो this.Parent बिंदु टी के लिए है वह MdiClient नियंत्रण जो एमडीआई चाइल्ड फॉर्म का कंटेनर है, इसलिए हम एमडीआई बच्चे के स्क्रीन स्थान प्राप्त करने के लिए एमडीआई बच्चे (इस) के पास PointToScreen विधि गुजरने का उपयोग कर सकते हैं। फिर यदि आप एमडीआई बच्चों और संवाद चौड़ाई और ऊंचाई के बीच अंतर के आधे हिस्से का उपयोग करके उस स्थान को ऑफ़सेट करते हैं और StartPosition पर FormStartPosition.Manual पर संवाद के सेट को सेट करते हैं और इसे ShowDialog का उपयोग करके दिखाते हैं।

+0

मुझे पता है कि सवाल पुराना है, लेकिन वर्तमान में अन्य सभी उत्तरों गलत हैं। 10k विचारों वाला एक प्रश्न सही उत्तर की आवश्यकता है। –