2011-09-06 6 views
6

यहाँ पर एक फार्म क्लोनिंग (घना होने के लिए खेद है, लेकिन मैं यह मुश्किल यह संक्षेप में वर्णन करने के लिए लग रहा हूँ) मेरी स्थिति है:एक विस्तारित डेस्कटॉप

हम एक सी # अनुप्रयोग है (है कि हम विकसित) कि दो मॉनीटर वाले सिस्टम पर चलता है। हालांकि, प्रत्येक मॉनिटर एक अलग उपयोगकर्ता का सामना करता है। यही कारण है, उपयोगकर्ता 1, जो नियंत्रण नहीं है, केवल देखता है और उपयोगकर्ता 2, जो एक 'केवल पढ़ने के लिए' स्थिति केवल अब तक बी पर नजर रखने को देखता है पर नजर रखने के लिए, हम एक क्लोन प्रदर्शन का उपयोग किया गया है, जैसे कि ए और बी प्रदर्शन एक ही जानकारी। हालांकि, वर्कफ़्लो में विशिष्ट उदाहरणों पर उपयोगकर्ताओं को 1 और 2 के लिए अलग-अलग चीज़ों को प्रदर्शित करने में सक्षम होना वांछनीय है।

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

जाहिर है, एक क्लोन-एकमात्र समाधान काम नहीं करेगा, ताकि विस्तारित मोड छोड़ देता है।

विस्तारित मोड आसानी से मेरे मॉनिटर A और B में दो अलग अलग रूपों को प्रदर्शित करने की अनुमति देता है, लेकिन मैं बार मैं चाहता हूँ दोनों पर नज़र रखता है एक ही बात को दिखाने के लिए क्या कर सकते हैं? क्या मेरे लिए सी # सिस्टम की एक "प्रतिलिपि" या "क्लोन" दिखाने का कोई तरीका है। मूल। खुले रहते समय फर्म, उसी जानकारी को दर्शाता है?

इस समस्या यह है कि मैं अनदेखी कर रहा हूँ करने के लिए एक और समाधान है? या "DisplaySwitch.exe का उपयोग कर प्रदर्शन मोड के बीच स्विच" जितना अच्छा हो उतना अच्छा है?

(मान हम मंच पर पूरा नियंत्रण है - हार्डवेयर और सॉफ्टवेयर)

+1

सटीक उसी प्रणाली का उपयोग करने में क्या गलत है जो अलग-अलग जानकारी प्रदर्शित करता है लेकिन एक ही जानकारी प्रदर्शित करता है? (शायद मध्यस्थ पैटर्न के अच्छे उपयोग के साथ) – pdr

+0

@pdr मुझे यकीन नहीं है, लेकिन मुझे लगता है कि आप दृष्टिकोण का सुझाव दे रहे हैं, जहां स्थितियों के लिए एक ही जानकारी को ए और बी दोनों पर प्रदर्शित करने की आवश्यकता है, मैं दो बना देता हूं फॉर्म एक्स के उदाहरण और प्रत्येक मॉनीटर पर एक प्रदर्शित करते हैं? मध्यस्थ तब सुविधा प्रदान करेगा कि दोनों उदाहरण, एक्स 1 और एक्स 2 कहते हैं, फॉर्म के अद्यतित रहते हैं, मुझे लगता है। मुझे लगता है कि मैं इस दृष्टिकोण से बचने का मुख्य कारण यह है कि यह एक काफी महत्वपूर्ण पुन: फैक्टरिंग का तात्पर्य है, लेकिन यह एकमात्र विकल्प हो सकता है। – Kohanz

उत्तर

0

अपनी आवश्यकताओं, यानी ऐसा कितनी बार ताज़ा करना चाहिए आदि पर निर्भर करता है, वहाँ हमेशा अपने फार्म की एक बिटमैप बनाने, और कहा कि प्रदर्शित करने का विकल्प है एक दूसरे रूप में बिटमैप।

मैं व्यक्तिगत रूप से इसे एक हैक के रूप में मानता हूं, और मध्यस्थ पैटर्न जैसे @pdr प्रस्तावों का उपयोग निश्चित रूप से एक क्लीनर दृष्टिकोण है। लेकिन यदि आपको त्वरित (और गंदे) समाधान की आवश्यकता है तो यह काम पूरा हो सकता है।

पोस्ट कोड प्रोटोटाइप गुणवत्ता की है और उसके अनुसार व्यवहार किया जाना चाहिए।

public partial class MainForm : Form 
{ 
    private bool m_Running; 

    public MainForm() 
    { 
     InitializeComponent(); 

     DuplicateForm f2 = new DuplicateForm(this.Text); 
     f2.Show(); 

     m_Running = true; 
     Thread t = new Thread(new ThreadStart(() => 
      { 
       while (m_Running) 
       { 
        this.Invoke(new MethodInvoker(() => 
        { 
         Bitmap bm = new Bitmap(Width, Height); 
         // pnl is a Panel with Dock=Fill 
         pnl.DrawToBitmap(bm, new Rectangle(0, 0, Width, Height)); 
         f2.SetImage(this, bm); 
        })); 

        Thread.Sleep(500); // or use a timer 
       } 
      })); 

     t.Start(); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     m_Running = false; 
    } 
} 

public partial class DuplicateForm : Form 
{ 
    public DuplicateForm(string title) 
    { 
     InitializeComponent(); 
     Text = title + " [copy]"; 
    } 

    public void SetImage(Form source, Image img) 
    { 
     this.Size = source.Size; 
     // Picturebox is a PictureBox control with Dock=Fill 
     pictureBox1.Image = img; 
    } 
} 
+0

एप्लिकेशन में लाइव वीडियो शामिल है, इसलिए जब मैं एक त्वरित हैक के लिए सुझाव की सराहना करता हूं (वैसे, मैं एक के लिए पूछ रहा था), यह संभवतः मेरे लिए काम नहीं करेगा। – Kohanz

+0

नहीं यह निश्चित रूप से नहीं होगा :) – havardhu

2

TightVNC की तरह एक दूरदराज के उपयोग प्रोग्राम का उपयोग पर विचार करें। यह लूपबैक मोड में काम कर सकता है, क्लाइंट प्रोग्राम में मुख्य मॉनिटर छवि प्रदर्शित करता है। क्लोन प्राप्त करने के लिए आपको फिर दूसरी मॉनिटर में जाना होगा। कस्टम फॉर्म के साथ जो आप कम और पुनर्स्थापित करते हैं।

+0

यह एक दिलचस्प विकल्प है। मुझे जांच करनी होगी कि कैसे TightVNC एक विस्तारित डेस्कटॉप पर दिखता है (मुझे इसे निर्बाध होने की आवश्यकता है, उदाहरण के लिए कोई सीमा नहीं है ताकि मैं इसे द्वितीयक मॉनीटर पर "पूर्ण स्क्रीन" कर सकूं) और यह भी कि मैं इसका उपयोग जीपीएल का उल्लंघन किए बिना कर सकता हूं। विस्तृत करने के लिए – Kohanz

2

अब मेरी टिप्पणी पर विस्तृत करने के लिए कि मेरे पास अधिक समय है।

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

ऐसा करने का सबसे आसान तरीका फॉर्म ए पर घटनाओं में मध्यस्थ को हुक करना है, और जब उन घटनाओं को ट्रिगर किया जाता है, तो इसे प्रस्तुत करने के लिए फॉर्म बी को आवश्यक डेटा भेजें।

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

यह संभावना है कि इष्टतम समाधान कहीं बीच में है।

+0

धन्यवाद। मुझे लगता है कि "सर्वश्रेष्ठ" समाधान इस जगह में कहीं स्थित है। यह कितना पुन: फैक्टरिंग लेता है वह है जो मुझे अधिक बारीकी से देखने की ज़रूरत है। प्रोटोटाइप का समय, मुझे लगता है :) – Kohanz

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