2012-04-26 39 views
6

विंडोज फॉर्म का उपयोग करके मैं विंडो को विशिष्ट कॉर्ड में रखना चाहता था। मैंने सोचा कि यह एक सरल तरीके से किया जा सकता है, लेकिन निम्नलिखित कोड बिल्कुल काम नहीं करता है:सी # विंडो पोजिशनिंग

public Form1() 
{ 
    InitializeComponent(); 

    this.Top = 0; 
    this.Left = 0; 
} 

हालांकि, जब केवल उस खिड़की के लिए एक संभाल पाने के लिए, यह अच्छी तरह से काम करता है:

public Form1() 
{ 
    InitializeComponent(); 

    IntPtr hwnd = this.Handle; 
    this.Top = 0; 
    this.Left = 0; 
} 

आप देख सकते हैं कि मैं उस सूचक के साथ बिल्कुल काम नहीं कर रहा हूं। मैंने एमएसडीएन में निम्नलिखित कथन में पाया:

हैंडल प्रॉपर्टी का मूल्य एक विंडोज एचडब्ल्यूएनडी है। यदि हैंडल में अभी तक नहीं बनाया गया है, तो इस प्रॉपर्टी का संदर्भ देने के लिए को बनाए रखने के लिए मजबूर किया जाएगा।

क्या इसका मतलब यह है कि हम केवल अपने हैंडल के निर्माण के बाद विंडो स्थिति सेट कर सकते हैं? क्या हैंडल आंतरिक रूप से इस हैंडल का उपयोग कर शीर्ष/बाएं हैं? स्पष्टीकरण के लिए धन्यवाद।

+0

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

+0

क्या आपने उन्हें डिजाइनर में सेट करने का प्रयास किया था? –

+0

मुझे पता है कि मैं इसे कई तरीकों से काम कर सकता हूं। मैं केवल यह जानना चाहता था कि यह इस तरह से क्यों व्यवहार करता है क्योंकि अन्य ढांचे (क्यूटी, WxWidgets, एमएफसी ...) में आप खिड़की के निर्माण के दौरान सीधे अपनी खिड़की की स्थिति सेट कर सकते हैं। – Fremen

उत्तर

5

आमतौर पर स्टार्टअपपोशन संपत्ति के अनुसार स्क्रीन पर एक WinForm स्थित है।
इसका मतलब है कि फॉर्म 1 के निर्माता से बाहर निकलने के बाद विंडो प्रबंधक विंडो बनाता है और उसे उस संपत्ति के अनुसार स्थिति देता है।
यदि आप स्टार्टअपपोजिशन = मैनुअल सेट करते हैं तो डिज़ाइनर के माध्यम से सेट किए गए बाएं और शीर्ष मान (स्थान) को पता चल जाएगा। स्टार्टअपपोजिशन के लिए
See MSDN और FormStartPosition enum के लिए भी।

बेशक यह this.Handle का उपयोग करने की आवश्यकता को हटा दें। (मुझे लगता है कि उस प्रॉपर्टी का संदर्भ देना जो आप विंडोज मैनेजर को स्टार्टअपपॉशन में डिज़ाइनर मानों का उपयोग करके फॉर्म को तत्काल रूप से बनाने के लिए मजबूर कर रहे हैं)

+0

कन्स्ट्रक्टर पास करने के बाद खिड़की का निर्माण मुझे स्पष्टीकरण देता है। धन्यवाद। – Fremen

3

कारण के बारे में बहुत निश्चित नहीं है, लेकिन यदि आप Form_Load ईवेंट पर स्थिति कोड जोड़ते हैं तो यह होगा हैंडलर को स्पष्ट रूप से प्रारंभ करने की आवश्यकता के बिना अपेक्षित कार्य करें।

using System; 
using System.Windows.Forms; 

namespace PositioningCs 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      /* 
      IntPtr h = this.Handle; 
      this.Top = 0; 
      this.Left = 0; 
      */ 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.Top = 0; 
      this.Left = 0; 
     } 
    } 
} 
4
public Form1() 
{ 
    InitializeComponent(); 
    Load += Form1_Load; 
} 

void Form1_Load(object sender, EventArgs e) 
{ 
    Location = new Point(700, 20); 
} 

या:

public Form1() 
{ 
    InitializeComponent(); 
    StartPosition = FormStartPosition.Manual; 
    Location = new Point(700, 20); 
} 
2

आप इस तरह प्रपत्र लोड घटना पर स्थान निर्धारित कर सकते हैं। यह स्वचालित रूप से हैंडल फॉर्म स्थिति।

this.Location = new Point(0, 0); // or any value to set the location 
संबंधित मुद्दे