2009-12-09 18 views
7

मेरी समस्या यह है कि मैंने एक "विस्तारित" रिचटेक्स्टबॉक्स नियंत्रण बनाया है जो मानक नियंत्रण से अनुपलब्ध कई RichEdit सुविधाओं को जोड़ने के लिए देशी एपीआई का उपयोग करता है (यानी: चयन पर एक फ़ॉन्ट गुण को संशोधित करना w/o अन्य फ़ॉन्ट गुणों को बदलना, प्रिंटर को शब्द लपेटना [वर्डपैड की तरह] आदि)। नियंत्रण के हिस्से के रूप में मैं एक प्रिंट डॉक्यूमेंट का पर्दाफाश करता हूं जिसका उपयोग RichTextBox की स्वरूपित सामग्री को मुद्रित करने के लिए किया जाता है। जब वर्डव्रैप "प्रिंटर के लिए लपेटें" पर सेट होता है, तो मैं RichMextBox को EM_SETTARGETDEVICE संदेश भेजता हूं और उचित लंबाई तक लपेटता हूं।सी # प्रिंट डॉक्यूमेंट चेंज इवेंट

यह सब ठीक काम करता है जब कुछ (उपयोगकर्ता/कोड) मेरे नियंत्रण की वर्डवाप संपत्ति को बदलता है। हालांकि अगर प्रिंट डॉक्यूमेंट को संशोधित किया गया है तो मेरे पास इसे जानने का कोई तरीका नहीं है। तो भले ही उपयोगकर्ता ने PrintDocument पर मार्जिन बदल दिया हो, फिर भी मेरा RichTextBoxEx WordWrap प्रॉपर्टी बदल जाने तक नई चौड़ाई के लिए EM_SETTARGETDEVICE को फिर से नहीं भेजता है।

मुझे इस पर काबू पाने के लिए कुछ विकल्प दिखाई देते हैं लेकिन मैं उनमें से किसी का भी बड़ा प्रशंसक नहीं हूं। यहाँ मैं क्या है:

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

  2. एक नया, प्रिंट डॉक्यूमेंटएक्स क्लास बनाएं जो प्रिंट डॉक्यूमेंट से आधारित है और आवश्यक "बदली" घटनाओं को लागू करता है। विपक्ष: पर्याप्त नहीं हो सकता है, प्रिंटसेटिंगएक्स, पेजसेटिंगएक्स, आदि बनाने की आवश्यकता हो सकती है .. प्रो: एक बार कार्यान्वित करें और किसी को भी इसके बारे में चिंता करने की ज़रूरत नहीं है।

मैं वास्तव में लगता है कि # 2 विकल्प मैं साथ जाने के लिए है करने के लिए जा रहा हूँ है, लेकिन इसे अगले उदाहरण मैं कुछ समान कार्यक्षमता की जरूरत के लिए बहुत पुन: प्रयोज्य नहीं है। मुझे लगता है कि मैं जो खोज रहा हूं वह किसी भी मौजूदा वर्ग संपत्ति में "जेनेरिक प्रॉपर्टी चेंज इवेंट" संलग्न करने का एक तरीका है क्योंकि यह भविष्य की परिस्थितियों में लागू होगा। यह देखने के लिए चिंतित है कि आपके पास मेरे पास क्या है :-)

+0

समय का मुद्दा है इसलिए मैं आगे बढ़ गया और PrintDocumentEx को लागू करना शुरू कर दिया। जैसा कि मैंने उम्मीद की थी कि WinForms प्रिंट संवाद नई पेजसेटिंग, प्रिंटर सेटिंग्स, आदि नहीं बनाते हैं, लेकिन मौजूदा गुणों को संशोधित करते हैं, इसलिए मुझे सभी ऑब्जेक्ट्स के लिए "एक्स" कक्षाएं बनाने की आवश्यकता होगी और प्रत्येक पत्ती की संपत्ति के लिए मेरे "बदले" ईवेंट को वापस PrintDocumentEx पर बबल करना होगा । यह बुरा है लेकिन इसकी प्रगति है। यह देखने के लिए अभी भी चिंतित है कि कोई और सामान्य समाधान है जो मुझे याद आ रहा है। –

+0

बस मेरा पीछा करते हुए मेरा प्रिंट डॉक्यूमेंटएक्स (और संबद्ध) वर्गीकृत नहीं हुआ।PrintDialog और संबंधित नियंत्रणों को देखते हुए ऐसा इसलिए होता है क्योंकि वे प्रिंट डॉक्यूमेंट को सटीक रूप से अद्यतन करने के लिए देशी विधियों का उपयोग करते हैं। तो मेरे "एक्स" वर्गों में गुणों से जुड़ी घटनाओं को कभी नहीं निकाल दिया गया क्योंकि सेट एक्सेसर कभी नहीं बुलाया गया था। अभी के लिए मैं UpdatePrintDocument() विधि के साथ गया लेकिन अभी भी एक बेहतर समाधान की तलाश में हूं। –

+0

दिलचस्प है कि मैं एक बेकार सवाल कर सकता हूं (जिसने एक अस्वीकार्य उत्तर के साथ बक्षीस दिया था) एक समुदाय विकी पोस्ट। –

उत्तर

1

बस मेरे प्रिंट डॉक्यूमेंटएक्स (और संबद्ध) वर्गीकृत काम नहीं कर रहे थे। PrintDialog और संबंधित नियंत्रणों को देखते हुए ऐसा इसलिए होता है क्योंकि वे प्रिंट डॉक्यूमेंट को सटीक रूप से अद्यतन करने के लिए देशी विधियों का उपयोग करते हैं। तो मेरे "एक्स" वर्गों में गुणों से जुड़ी घटनाओं को कभी नहीं निकाल दिया गया क्योंकि सेट एक्सेसर कभी नहीं बुलाया गया था।

+0

हां, आपने किया: 'प्रश्न आईडी पर 100 प्रतिनिधि का बक्षीस निर्माण = 1871103 15 दिसंबर को 4: 4 9 –

1

यदि मैं आपका प्रश्न सही ढंग से समझ गया हूं, तो आपको आवश्यक जानकारी को WordWrap प्रॉपर्टी बदल दी जाती है।

जब अन्य चीजें बदली जाती हैं, तो कोई भी ईवेंट प्रिंट दस्तावेज़ अपडेट नहीं करता है। अगली बार WordWrap संपत्ति बदल दी गई है सभी जानकारी भेजी जाती है।

यह ठीक करने के लिए हैक तरीका WordWrap प्रॉपर्टी को बदलने के लिए है, जब भी आप एक ऐसी संपत्ति बदलते हैं जिसे आप प्रिंट दस्तावेज़ में भेजना चाहते हैं। इसे अस्थायी मान में बदलें, फिर इसे दोबारा बदलें।

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