2010-02-10 13 views
6

मैं वर्तमान में कुछ पुराने वीबी 6 एप्लिकेशन को सी # के साथ डब्ल्यूपीएफ में पोर्ट करने का विकल्प तलाश रहा हूं। योजना, चरण एक में, कई महत्वपूर्ण रूपों को बंद करना है, न कि सभी आवेदन। सैद्धांतिक लक्ष्य VB6 फॉर्म को किसी ActiveX dll के माध्यम से WPF के भीतर किसी प्रकार के कंटेनर में खोलना है।क्या आप सी # डब्ल्यूपीएफ ऐप में एक पूर्ण वीबी 6 फॉर्म होस्ट कर सकते हैं?

क्या यह भी संभव है? मैंने इंटरऑप को देखने का प्रयास किया है और यह एक ठोस उदाहरण नहीं है कि यह किसी भी चीज़ के साथ काम करने के लिए कैसे मिलता है लेकिन Win32 नियंत्रण, पूर्ण रूप से नहीं। मेरे पास पुराने वीबी 6 कोड तक पूर्ण पहुंच है और इसे वैसे भी संशोधित कर सकते हैं।

मुख्य WPF अनुप्रयोग के निम्न स्क्रीनशॉट आवरण/कंटेनर रूप में काम करेगा:

http://www.evocommand.com/junk_delete_me/main_menu_mockup.png

वर्तमान VB6 रखरखाव स्क्रीन कि के दाईं ओर "सफेद स्थान" खंड में लोड किया जाएगा पिछली स्क्रीन

उत्तर

11

मैं निम्न चरणों के साथ कार्य को पूरा करने में सक्षम था:

  1. एक नया VB6 सक्रिय एक्स नियंत्रण परियोजना बनाया गया। नए नियंत्रण में वीबी 6 फॉर्म नियंत्रण और कोड की पूरी सामग्री को कॉपी और चिपकाया।वहाँ कई तत्वों है कि एक नियंत्रण का उपयोग करने जा में नियंत्रित किया जा करने के लिए कर रहे हैं:

    1. आप पिछले ढंग से फार्म के शीर्षक को प्रदर्शित करने की क्षमता खो देते हैं। आप चारों ओर यह वैकल्पिक नियंत्रण (लेबल/borderlesstextbox, आदि) कि ही कार्यक्षमता को पूरा करता है, तो की जरूरत के साथ काम कर सकते हैं। यह एक प्राथमिकता के बाद से प्रत्येक स्क्रीन हमारे नए नेट परियोजना में एक ब्राउज़र टैब सिस्टम की तरह में होस्ट किया जा रहा था नहीं था।

    2. सभी mousepointer संदर्भ Screen.mousepointer

    3. आप Me.Hide उपयोग नहीं कर सकते और नेट कंटेनर को छिपाने के लिए वैकल्पिक घटनाओं करने के लिए Me.Mousepointer से बदल किया जाना है।

    4. कोई और सभी को मेरे संदर्भ। [कुछ भी] [कुछ भी] अगर वे लागू होते हैं हटा दिया जाना चाहिए या UserControl के साथ बदल दिया है।।

    5. आप किसी भी कार्यों का उपयोग करते हैं कि संदर्भ एक [yourcontrol] एक प्रपत्र वे संग्रह बजाय UserControl.Controls के माध्यम से पाश करने के लिए बदल दिया और "कंटेनर" की आवश्यकता होगी पर .Contianer.Property अमान्य है VB6 के लिए ActiveX को नियंत्रित करता है

    6. सभी गैर मोडल रूपों/संवाद बक्से रूप में इस परियोजना से हटाया जाना चाहिए वहाँ अब कोई HWND WPF में संभाल करने के लिए है। आपको 'गैर-मोडल फॉर्म ' की त्रुटि मिलती है, इस होस्ट एक्टिवएक्स डीएलएल, ActiveX नियंत्रण, या प्रॉपर्टी पेज 'से एप्लिकेशन को प्रदर्शित नहीं किया जा सकता है। हमारे मामले में हम एक सरल छप स्क्रीन कि प्रदर्शित होंगे जब कुछ लंबे प्रक्रियाओं/रिपोर्ट के लिए प्रदर्शित उपयोगकर्ता पता है कि चल रहा था जाने के लिए किया था।

  2. मैं एक WPF प्रोजेक्ट में इंटरऑप के माध्यम से सीधे VB6 नियंत्रण जोड़ने में असमर्थ था। इस तरह के एक नए .NET "विंडोज फॉर्म कंट्रोल लाइब्रेरी" परियोजना के रूप में बनाया गया था। परियोजना में वीबी 6 ओसीएक्स का एक संदर्भ जोड़ा गया था। वीबी 6 कंट्रोल एस को फिर "राइट क्लिक" -> "आइटम जोड़ें" द्वारा नेट टूलबॉक्स में जोड़ा गया था और वीबी 6 कंट्रोल ओसीएक्स के कॉम संदर्भ को इंगित किया गया था। .NET नियंत्रण को तब VB6 नियंत्रण होस्ट/सेवा करने के लिए उपयोग किया गया था।

  3. होस्ट को वीबी 6 में एक फॉर्म प्रदर्शित करने के लिए और इसे आवश्यक प्रारंभिक कार्यक्षमता को आग लगाने के लिए प्राप्त करें, वीबी 6 ओसीएक्स नियंत्रण एक दृश्यमान में डिफ़ॉल्ट रूप से डिफॉल्ट किए गए थे। गलत तरीके से इसलिए उन्हें शुरुआत में .NET OCX में अदृश्य नियंत्रण के रूप में जोड़ा गया था। जब आवश्यक हो तो वीबी 6 नियंत्रण दृश्यमान = सही है जो UserControl_Show() ईवेंट को सक्रिय करता है। Form_Load() में पहले से मौजूद सभी कोड इस घटना में स्थानांतरित किए गए थे। शो इवेंट आवश्यकतानुसार Form_Load तक पहुंचने का सबसे आसान तरीका था। एमएसडीएन: "अगर नियंत्रण छिपा हुआ है और फिर दिखाया गया है, या यदि फॉर्म को कम किया गया है और फिर बहाल किया गया है तो नियंत्रण घटनाएं नहीं प्राप्त करता है। इन परिचालनों के दौरान नियंत्रण की खिड़की इस रूप में बनी हुई है, और इसकी दृश्यमान संपत्ति नहीं बदली है। "

  4. ए के भीतर vb6 नियंत्रण लपेटना।नेट विनफॉर्म नियंत्रण ने इस प्रश्न को मेरे प्रश्नों में से किसी एक में उल्लिखित के रूप में रेडियो/विकल्प बटन के रूप में काले रंग के रूप में प्रस्तुत किया जा रहा है, जिसमें फ्रेम्स को चित्र बॉक्स में कनवर्ट किए बिना कनवर्ट किया गया है।

  5. WPF ऐप में मेनू विकल्प के रूप में चुना गया है xaml कोड गतिशील रूप से बनाया गया है और WindowsFormsHost टैग के साथ एक रैपर के माध्यम से प्रदर्शित किया गया है। .Net Winform ऐप से एक गतिशील रूप से निर्मित नियंत्रण ऑब्जेक्ट को xaml पर WindowsFormsHost टैग में धकेल दिया जाता है और नियंत्रण .net प्रोजेक्ट पर दिखाई देता है जो vb6 UserControl_Show को फायर करता है और फिर vb6 फॉर्म को लोड और प्रदर्शित करता है।

+0

वाह, यह आश्चर्यजनक रूप से है। –

+0

बस कुछ गरीब आत्माओं को अपने सिर को धक्का देने से, कुछ क्रैनियल चोट लगने की कोशिश कर रहा है, कि मैं इसे पिछले कुछ हफ्तों से बाहर कर रहा हूं। – jasonk

1

क्या आप उस वीबी 6 फॉर्म को किसी अन्य वीबी 6 फॉर्म में भी लोड कर सकते हैं? मेरा सुझाव है कि आप पहले काम कर रहे हैं।

+0

मैं एक WPF फॉर्म में वीबी 6 फॉर्म लोड करना चाहता हूं। – jasonk

+1

@ जेसनक: मुझे पता है कि आप क्या करना चाहते हैं। मेरा सुझाव है कि आप पहले वीबी 6 फॉर्म में लोड वीबी 6 फॉर्म प्राप्त करें। एक बार ऐसा करने के बाद, आपको पता चलेगा कि फ़ॉर्म _some_ प्रकार के रूप में लोड किया जा सकता है। एक WPF रूप में लोड होने पर _Then_ कार्य करें। आपको इसे किसी अन्य रूप में लोड करने की अनुमति देने के लिए फ़ॉर्म को बदलना पड़ सकता है। आप वीबी 6 में भी ऐसा काम करेंगे, जिसे आप परिचित हैं। –

0

वीबी 6 फॉर्म के माता-पिता को सेट करने का कोई विश्वसनीय तरीका नहीं है। आप हमेशा इसे हैक कर सकते हैं या VB6 रूपों के बजाय यूआई कंटेनर के रूप में सादे ActiveX नियंत्रण (VB6 में UserControl) का उपयोग कर सकते हैं।

+0

मैं ओसीएक्स नियंत्रण के निर्माण से बहुत परिचित नहीं हूं। क्या इसका मतलब है कि वीबी 6 में प्रत्येक स्क्रीन को अपना नियंत्रण होना चाहिए या क्या एकल नियंत्रण में एकाधिक स्क्रीन होस्ट करने का कोई तरीका है? – jasonk

3

मुझे लगता है कि आपको क्या करना होगा VB6 फॉर्म सामग्री को ActiveX नियंत्रण में निकालना है। इसके बाद आप इसे अपने ActiveX डीएल में बेनकाब कर सकते हैं और अपने WPF फॉर्म में रख सकते हैं। मुझे संदेह है कि किसी भी अन्य प्रकार के फॉर्म में वीबी 6 फॉर्म होस्ट करना संभव है।

+0

+1, हालांकि नियंत्रण को एक डीएलएल की बजाय ActiveX ओसीएक्स में उजागर करने की आवश्यकता होगी। – MarkJ

+0

मैं ओसीएक्स नियंत्रण बनाने से बहुत परिचित नहीं हूं। क्या इसका मतलब है कि वीबी 6 में प्रत्येक स्क्रीन को अपना नियंत्रण होना चाहिए? – jasonk

+1

हां, अनिवार्य रूप से आप स्क्रीन से सब कुछ लेते हैं और इसे ActiveX नियंत्रण में रखते हैं। फिर आप इस नियंत्रण को अपने वीबी 6 फॉर्म पर रख सकते हैं (या इसे अपने .NET एप्लिकेशन में होस्ट करें)। मैं बस इस एमएसडीएन लेख में भाग गया जो आपकी मदद कर सकता है। http://msdn.microsoft.com/en-us/library/ms742735.aspx –

0

मुझे इस बिंदु पर WPF के बजाय WinForms के भीतर आवश्यक चीज़ों को करने का एक तरीका मिला। http://www.codeproject.com/KB/vb-interop/VB6formsinNET.aspx मुझे लगता है कि अगर मैं इसे 100% काम कर सकता हूं तो मैं इसे WPF पर बंद कर सकता हूं या खराब स्थिति में WPF फॉर्म में WinForm तत्व होस्ट कर सकता हूं यदि मेरे पास बिल्कुल भी है (यू-जी-एल-वाई)।

वैसे भी, मुझे थोड़ा करीब मिल गया है, लेकिन स्क्रीन पर पेंटिंग के कुछ नियंत्रणों के साथ एक बहुत ही अजीब समस्या है। रेडियो/विकल्प बटन के रूप में ठोस काला प्रदान कर रहे हैं:

http://www.evocommand.com/junk_delete_me/optionbuttons.png

मैं स्पष्ट रूप से एक निश्चित रंग के लिए buttonface से नियंत्रण 'पृष्ठभूमि रंग बदलने की कोशिश की है और यह अभी भी यह करता है। मुझे लगता है कि यह फ्रेम नियंत्रण के भीतर विकल्प बटन के साथ एक लेयरिंग मुद्दा है। चेकबॉक्स में विकल्प बटन बदलने के लिए वीबी 6 सामग्री के बड़े पैमाने पर पुनर्विक्रय के बिना आगे बढ़ने के तरीके पर मुझे कुछ नुकसान हुआ है। यह एक भारी ऐप है और एप्लिकेशन में 600+ विकल्प बटन नियंत्रण हैं जिन्हें मैं वास्तव में सौदा नहीं करना चाहता हूं।

संपादित करें: मैं यह पुष्टि करने में सक्षम था कि फ्रेम फ्रेम के भीतर विकल्प की परत के साथ इसका कुछ संबंध है। यदि आधार फार्म के लिए बाहर निकाला समस्या तब हो नहीं करता है: http://www.evocommand.com/junk_delete_me/optionbuttons2.png

+0

एक अजीब कामकाज मिला है कि यदि आप फ्रेमबक्स के बजाय एक विकल्प बॉक्स में विकल्पबूटन डालते हैं तो यह काला पृष्ठभूमि के बिना प्रदर्शित होगा। – jasonk

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