2009-08-12 22 views
5

मैंने पहले इस सवाल से पूछा और सोचा कि मैंने यह पता लगाया है लेकिन यह अभी भी काम नहीं करता है। Form.Show() moves form position slightlyफॉर्म। स्थान काम नहीं करता

तो मेरे पास एक मूल रूप है जो शो() के साथ बच्चों का एक गुच्छा खोलता है और फिर जब किसी की आवश्यकता होती है तो मैं इसे प्रदर्शित करने के लिए bringToFront() का उपयोग करता हूं। समस्या यह है कि जब दिखाया जाता है() को बाल रूप कहा जाता है तो पूरी तरह से गठबंधन किया जाता है, लेकिन जब मैं लेट टॉफ्रंट का उपयोग करता हूं तो यह बाएं और नीचे 1 पीएक्स चलाता है जो मेरी सीमाओं के साथ शिकंजा करता है। मैंने सभी बच्चे के रूपों को सेट करने से पहले मैन्युअल में प्रारंभिक गुणों को सेट किया है() - उन्हें आईएनजी। मैंने सामने लाने के दौरान frm.location = नया प्वाइंट (x, y) सेट किया है। मैंने स्पष्टीकरण सेटिंग frm.location की कोशिश की है जब शो() - आईएनजी भी। जब मैं टॉफ्रंट() लाता हूं तो यह अभी भी 1 पीएक्स को बाएं और नीचे ले जाता है। क्या लाने के लिए कुछ ऐसा है() जो मुझे फ़ॉर्म की स्थान संपत्ति को बदलने नहीं देता है?

if (myNewForm != null) 
{ 
    myNewForm.MdiParent = this; 

    bool isFormOpen = false; 

    foreach (Form frm in Application.OpenForms) 
    { 
     if (frm.GetType() == myNewForm.GetType()) 
     { 
      frm.WindowState = FormWindowState.Maximized; 
      frm.BringToFront(); 
      frm.Location = new Point(-4, -30); 
      isFormOpen = true; 
      break; 
     } 
    } 

    if (!isFormOpen) 
    { 
     myNewForm.StartPosition = FormStartPosition.Manual; 
     myNewForm.Show(); 
    } 
} 

संपादित करें: यहाँ मेरी कोड है http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=107589

लेकिन अपने आवेदन की जरूरत है: ठीक है तो जाहिरा तौर पर माइक्रोसॉफ्ट एक बग देता है कि StartPosition केवल और ShowDialog के लिए काम() नहीं दिखाएं(), लेकिन यह तय करने के लिए मना कर दिया है सभी अलग-अलग रूपों को खुले रखने के लिए और जरूरत पड़ने पर उन्हें सामने लाएं ... इसलिए ShowDialog() को इस उदाहरण में उचित रूप से उपयोग नहीं किया जा सकता है? तो मेरे पास कौन से विकल्प हैं? कोई?

+0

हममम ... अगर मैं FormWindowState.Maximized वास्तव में यह करता है मैं यह करने के लिए लेकिन उसके बाद MdiParent उपयोगकर्ता स्क्रॉल और पूर्ण बच्चे और इसके पीछे बच्चों को देखने के लिए अनुमति देता है क्या चाहते हैं को हटाने और मैं नहीं चाहता कि या तो .... – novacara

उत्तर

1

p/Invoke to MoveWindow का उपयोग करने के बारे में क्या? प्रदान किए गए लिंक में सी # उदाहरण शामिल है।

+0

पूरी तरह से काम करता है !! बहुत बहुत धन्यवाद!! – novacara

+0

खुशी है कि यह काम किया! – Armbrat

+0

एक साइड सवाल के रूप में ... क्या किसी को पता है कि विंडोज एपीआई कॉल का उपयोग विजुअल स्टूडियो के साथ कैसे काम करता है? क्या डीएलएल को तैयार उत्पाद के साथ शामिल किया जा सकता है या प्रोग्राम केवल विंडोज ऑपरेटिंग सिस्टम पर ही इस्तेमाल किया जा सकता है? – novacara

0

क्या आपने फॉर्म को दिखाने का प्रयास किया है, और फिर स्थान समायोजित किया है?

संपादित करें: या, क्या आपने बाएं और शीर्ष गुणों को समायोजित करने का प्रयास किया है?

+0

हाँ मैंने यह कोशिश की है। और यह BringToFront() - आईएनजी समस्या है और शो() - आईएनजी नहीं है।लेकिन मैंने आगे लाने और फिर स्थान को समायोजित करने का भी प्रयास किया है ... अभी भी कुछ नहीं। – novacara

+0

हां एक ही समस्या है। समस्या यह प्रतीत होती है कि सभी शो() में से पहला स्टार्टपॉजिशन सेट होने की अनुमति नहीं देता है, इसलिए इसे फिर से ढूंढना नहीं है। दूसरा, जब बच्चे को अधिकतम किया जाता है तो यह 1px और दाएं 1px नीचे चला जाता है हालांकि मुझे समझ में नहीं आता है क्योंकि क्यों इसे प्रारंभ में अभी तक अधिकतम किया गया है, जहां यह माना जाता है। अगर मैं अधिकतम नहीं करता तो एमडीआई माता-पिता स्क्रॉलबार देता है और मैं निश्चित रूप से यह नहीं चाहता हूं। अगर मैं फॉर्म को 1px बाएं और ऊपर संपादित करता हूं, जहां यह अब है, तो यह गलत रूप से गलत तरीके से दिखाता है लेकिन सही ढंग से जब मैं ltofront() लाता हूं। मैं चाहता हूं कि एक कामकाज हो! – novacara

1

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

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

जो फ़ॉर्म को सही स्थिति में मजबूर करना चाहिए, भले ही विंडोज़ के अंदर कुछ कोड इसे किसी समय में बदल दें।

1

आप की कोशिश की है:

this.Location 

या

Form.ActiveForm.Location?

15

यदि आप फॉर्म स्थान सेट करना चाहते हैं, तो आपको फॉर्म का WindowStateNormal पर सेट करना होगा (किसी भी अन्य सेटिंग पर, स्थान उस सेटिंग के नियमों के अनुसार आपके लिए सेट किया गया है, इसलिए आपका मान अनदेखा कर दिया गया है), और इसकी StartPosition से Manual पर।

frm.WindowState = FormWindowState.Normal; 
frm.StartPosition = FormStartPosition.Manual; 
frm.BringToFront(); 
frm.Location = new Point(-4, -30); 
+0

"TDull" आप कहां से आते हैं? अभी डाउनलोड करें ...! – IremadzeArchil19910311

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