2010-02-10 16 views
9

मेरे पास एक ड्राइंग फ़ंक्शन है जो केवल एक एचडीसी लेता है। लेकिन मुझे प्रिंट करने के लिए एक सटीक स्केल संस्करण दिखाना होगा।मैं win32 C++ में प्रिंट पूर्वावलोकन कैसे करूं?

तो वर्तमान में, मैं प्रिंटर के HDC के साथ एक प्रिंटर HDC और CreateCompatibleBitmap() के साथ CreateCompatibleDC() का उपयोग करें।

मुझे लगता है कि डीसी के पास प्रिंटर की सटीक चौड़ाई और ऊंचाई होगी। और जब मैं इस एचडीसी में फोंट का चयन करता हूं, तो प्रिंटर के रूप में पाठ ठीक से स्केल किया जाएगा।

दुर्भाग्यवश, मैं इस एचडीसी के पिक्सेल को नियंत्रण के एचडीसी में कॉपी करने के लिए एक स्ट्रैचब्लैट() नहीं कर सकता क्योंकि वे अलग-अलग एचडीसी प्रकारों के अनुमान हैं।

अगर मैं एक ही साथ एक खिड़की HDC से "स्मृति कैनवास" w, प्रिंटर के पृष्ठ के रूप में ज बनाने के लिए, फोंट रास्ता नन्हा क्योंकि वे स्क्रीन, नहीं पेज के लिए बढ़ाया रहे हैं बाहर आ ...

क्या मुझे प्रिंटर के डीसी या कुछ से विंडो के डीसी और CreateCompatibleBitmap() से कॉम्पैक्टिक डीसी() बनाना चाहिए ??

अगर कोई ऐसा करने के लिए सही तरीके से समझा सकता है। (और अभी भी कुछ ऐसा है जो प्रिंटर पर सटीक रूप से दिखता है) ...

अच्छा, मैं इसकी सराहना करता हूं !!

... स्टीव

+0

मुझे जिस मार्ग पर मैंने फैसला किया है उस पर मुझे कोई गर्व नहीं है ...:/प्रिंटर डीसी जानकारी प्राप्त करें - चौड़ाई, ऊंचाई, और logpixelsy। CreateCompatibleDC, प्रिंट पूर्वावलोकन विंडो के डीसी से बिटमैप, लेकिन चौड़ाई के साथ, प्रिंटर की ऊंचाई (मोन्डो आकार की मेमोरी हत्या बिटमैप) और जब मैं CreateFont करता हूं, तो मैं ऊंचाई के लिए :: MulDiv (पॉइंट, logPxlY, 72) का उपयोग करता हूं (प्रिंटर डीसी से logPxlY का उपयोग करके)। Soooooo, मैं इसे बहुत इष्टतम समाधान पर फिर से देखने की उम्मीद कर रहा हूं, लेकिन मुझे पहले जोड़ने के लिए अन्य कार्यक्षमता मिली है ...:/http://pianocheater.com fyi :) –

+0

Argh !! यह एक अच्छा समाधान नहीं है (जिस पर मुझे गर्व नहीं है)। 4 गीगा रैम के साथ मेरी विस्टा मशीन पर, मैं प्रिंटर के डब्ल्यू, एच के साथ स्क्रीन संगत बिटमैप के कॉम्पैक्टिव बिटमैप नहीं बना सकता - स्मृति से बाहर - शायद ग्राफिक्स कार्ड मेमोरी की मात्रा के रूप में मुझे यकीन है कि 4 गीगा में फिट होगा नियमित स्मृति ड्राइंग बोर्ड पर वापस ... –

+0

मुझे पता है कि यह थोड़ी देर पहले था, लेकिन क्या आपने कभी प्रिंटर संगत डीसी से बिटमैप बनाने का प्रयास किया था और फिर इसे अचयनित कर दिया था और इसे स्ट्रैचब्लैट के लिए एक नई स्क्रीन संगत डीसी में चुन रहा था? इसके अलावा आप बिटमैप के आयामों और समन्वय को 2 से विभाजित कर सकते हैं ताकि इसे बहुत अधिक विकृति के जोखिम के बिना फिट किया जा सके। –

उत्तर

10

इस पर निर्भर करता है कि आप कितना सटीक होना चाहते हैं, यह मुश्किल हो सकता है।

कई दृष्टिकोण हैं। ऐसा लगता है कि आप प्रिंटर आकार के बिटमैप पर आकर्षित करने की कोशिश कर रहे हैं और फिर इसे कम करें। ऐसा करने के लिए कदम हैं:

  1. प्रिंटर के लिए डीसी (या बेहतर अभी तक, आईसी - सूचना संदर्भ) बनाएं।
  2. क्वेरी प्रिंटर डीसी संकल्प पता लगाने के लिए, पृष्ठ आकार, शारीरिक ऑफसेट, आदि
  3. खिड़की/स्क्रीन के लिए एक डीसी बनाएँ।
  4. एक संगत डीसी (मेमोरी डीसी) बनाएँ।
  5. विंडो/स्क्रीन के लिए एक संगत बिटमैप बनाएं, लेकिन आकार प्रिंटर पेज का पिक्सेल आकार होना चाहिए। (इस दृष्टिकोण के साथ समस्या यह है कि यह एक बड़ा बिटमैप है और यह असफल हो सकता है।)
  6. स्मृति डीसी में संगत बिटमैप का चयन करें।
  7. वास्तविक प्रिंटर पर ड्राइंग करते समय उसी निर्देशांक का उपयोग करके स्मृति डीसी को आकर्षित करें।(जब आप फोंट का चयन करें, सुनिश्चित करें कि आप प्रिंटर की तार्किक इंच, न कि स्क्रीन के तार्किक इंच करने के लिए उन्हें पैमाने पर कर सकते हैं।)
  8. StretchBlt स्मृति डीसी खिड़की है, जो पूरी छवि स्केल करेगा करने के लिए। आप खिंचाव मोड के साथ प्रयोग करना चाह सकते हैं यह देखने के लिए कि आप किस प्रकार की छवि प्रदर्शित करने जा रहे हैं, उसके लिए सबसे अच्छा क्या काम करता है।
  9. सभी संसाधनों को जारी करें।

लेकिन इससे पहले कि आप उस दिशा में सिर, विकल्पों पर विचार। इस दृष्टिकोण में एक विशाल ऑफ़-स्क्रीन बिटमैप आवंटित करना शामिल है। यह संसाधन-गरीब कंप्यूटरों पर असफल हो सकता है। यहां तक ​​कि यदि ऐसा नहीं होता है, तो हो सकता है कि आप अन्य ऐप्स को भूखा हो।

किसी अन्य उत्तर में दिए गए मेटाफाइल दृष्टिकोण कई अनुप्रयोगों के लिए एक अच्छा विकल्प है। मैं इसके साथ शुरू करूंगा।

एक और दृष्टिकोण कुछ काल्पनिक उच्च संकल्प इकाई में सभी आकार यह पता लगाने की है। उदाहरण के लिए, मान लें कि सबकुछ एक इंच के 1000 वें स्थान पर है। फिर आपके ड्राइंग दिनचर्या इस काल्पनिक इकाई को लक्ष्य डिवाइस द्वारा उपयोग की जाने वाली वास्तविक डीपीआई में स्केल करेंगे।

यह पिछले दृष्टिकोण (और संभवतः मेटाफ़ाइल एक) के साथ समस्या यह है कि GDI फोंट पूरी तरह से रैखिक पैमाने पर नहीं है। लक्ष्य संकल्प के आधार पर अलग-अलग वर्णों की चौड़ाई tweaked हैं। एक उच्च-रिज़ॉल्यूशन डिवाइस (जैसे 300+ डीपीआई लेजर प्रिंटर) पर, यह ट्वीविंग न्यूनतम है। लेकिन एक 96-डीपीआई स्क्रीन पर, tweaks एक रेखा की लंबाई पर एक महत्वपूर्ण त्रुटि में जोड़ सकते हैं। इसलिए मुद्रित पृष्ठ पर आपके पूर्वावलोकन विंडो में टेक्स्ट ऑफ़-ऑफ-अनुपात (आमतौर पर व्यापक) दिखाई दे सकता है।

इस प्रकार कट्टर दृष्टिकोण प्रिंटर संदर्भ में पाठ को मापने के लिए, और स्क्रीन संदर्भ में फिर से मापने, और विसंगति के लिए समायोजित है। उदाहरण के लिए (बनाई गई संख्याओं का उपयोग करके), आप प्रिंटर संदर्भ में कुछ पाठ की चौड़ाई को माप सकते हैं, और यह 900 प्रिंटर पिक्सल तक आता है। मान लीजिए प्रिंटर पिक्सल का स्क्रीन पिक्सेल स्क्रीन का अनुपात 3: 1 है। आप स्क्रीन पर एक ही पाठ 300 स्क्रीन पिक्सेल चौड़े होने की उम्मीद करेंगे। लेकिन आप स्क्रीन संदर्भ में मापते हैं और आपको 325 स्क्रीन पिक्सेल की तरह एक मान मिलता है। जब आप स्क्रीन पर आते हैं, तो आपको किसी भी तरह टेक्स्ट 25 पिक्सल को संकुचित करना होगा। आप पात्रों को एक साथ घूम सकते हैं, या थोड़ा छोटा फ़ॉन्ट चुन सकते हैं और फिर उन्हें बाहर खींच सकते हैं।

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

मैं बड़े बिटमैप का एक संकर और कट्टर दृष्टिकोण के साथ अच्छी किस्मत लिया है। पूरे पृष्ठ के लिए एक विशाल बिटमैप बनाने के बजाय, मैं टेक्स्ट की एक पंक्ति के लिए काफी बड़ा बना देता हूं। फिर मैं प्रिंटर आकार को ऑफस्क्रीन बिटमैप और StretchBlt पर स्क्रीन आकार पर खींचता हूं। यह फ़ॉन्ट गुणवत्ता की थोड़ी गिरावट पर आकार विसंगति से निपटने को समाप्त करता है। यह वास्तविक प्रिंट पूर्वावलोकन के लिए उपयुक्त है, लेकिन आप इस तरह एक WYSIWYG संपादक बनाना नहीं चाहते हैं। इस लाइन को व्यावहारिक बनाने के लिए एक-पंक्ति बिटमैप काफी छोटा है।

अच्छी खबर केवल पाठ कठिन है। अन्य सभी चित्रण निर्देशांक और आकारों का एक सरल स्केलिंग है।

मैं GDI + अधिक इस्तेमाल नहीं किया है, लेकिन मुझे लगता है कि यह गैर रेखीय फ़ॉन्ट स्केलिंग के साथ दूर किया था। तो यदि आप जीडीआई + का उपयोग कर रहे हैं, तो आपको केवल अपने निर्देशांक को स्केल करना होगा। दोष यह मुझे नहीं लगता कि उस पर GDI + फॉन्ट गुणवत्ता के रूप में अच्छा है।

और अंत में, आप Vista या बाद में एक स्थानीय एप्लिकेशन हैं, सुनिश्चित करें कि आप "DPI-aware" के रूप में अपनी प्रक्रिया में चिह्नित किए गए हैं। अन्यथा, यदि उपयोगकर्ता एक उच्च डीपीआई स्क्रीन पर है, विंडोज आप से झूठ और दावा संकल्प केवल 96 डीपीआई है और फिर एक फजी ऊपर स्केलिंग जो कुछ भी आप आकर्षित करना है कि होगा।यह दृश्य गुणवत्ता को कम करता है और आपके प्रिंट पूर्वावलोकन को और भी जटिल बना सकता है। चूंकि बहुत सारे कार्यक्रम उच्च डीपीआई स्क्रीन पर अच्छी तरह अनुकूल नहीं होते हैं, इसलिए माइक्रोसॉफ्ट ने Vista में डिफ़ॉल्ट रूप से "उच्च डीपीआई स्केलिंग" जोड़ा।

संपादित जोड़ें

एक और चेतावनी: आप प्रिंटर आकार बिटमैप के साथ स्मृति डीसी में एक HFONT चुनते हैं, तो यह संभव है कि आप जब कि एक ही का चयन क्या मिलेगा तुलना में एक अलग फॉन्ट मिलता है वास्तविक प्रिंटर डीसी में HFONT। ऐसा इसलिए है क्योंकि कुछ प्रिंटर ड्राइवर सामान्य फ़ॉन्ट्स को स्मृति वाले लोगों के साथ प्रतिस्थापित करेंगे। उदाहरण के लिए, कुछ पोस्टस्क्रिप्ट प्रिंटर कुछ सामान्य ट्रू टाइप फ़ॉन्ट्स के लिए एक आंतरिक पोस्टस्क्रिप्ट फ़ॉन्ट को प्रतिस्थापित करेंगे।

आप पहले प्रिंटर आईसी में HFONT चयन कर सकते हैं, तो GetTextFace, GetTextMetrics, और शायद GetOutlineTextMetrics तरह GDI कार्यों का उपयोग चयनित वास्तविक फॉन्ट के बारे में पता लगाने के लिए। फिर आप प्रिंटर का उपयोग करने के लिए अधिक निकटता से मिलान करने के लिए एक नया LOGFONT बना सकते हैं, इसे HFONT में बदल दें, और इसे अपनी मेमोरी डीसी में चुनें। यह वास्तव में एक अच्छा कार्यान्वयन का प्रतीक है।

+0

पवित्र guacamole। सभी विवरण के लिए धन्यवाद। किसी को सही दिशा में इंगित करना ya के लिए पर्याप्त नहीं है, आह? ईंटों और रेत एम चिकनी के साथ जमीन को गुजरना होगा ... :) ऐसा लगता है कि मुझे परीक्षण करने के लिए कुछ चीजें मिल गई हैं। बहुत बहुत धन्यवाद! –

+0

जीडीआई + आउटपुट के लिए सबसे अच्छा विकल्प नहीं हो सकता है, लेकिन यह बहुत अच्छा स्केलिंग बनाता है - मुझे लगता है कि StretchBlt से बेहतर परिणाम। –

+0

@MarkRansom: प्रिंट पूर्वावलोकन के लिए स्केलिंग करते समय, स्क्रीन पर पाठ की सुवार्ता आमतौर पर सर्वोच्च प्राथमिकता नहीं होती है। –

2

खैर यह एक ही है क्योंकि आप प्रिंटर डीसी में एक उच्च संकल्प है देखने के लिए नहीं होगा, तो आप एक तरह के रूपांतरण समारोह लिखने के लिए होगा। मैं उस विधि के साथ जाऊंगा जो आपको काम करने के लिए मिला था लेकिन पाठ बहुत छोटा था और प्रिंटर विंडो चौड़ाई द्वारा बस प्रत्येक स्थिति/फ़ॉन्ट आकार को गुणा करें और स्रोत विंडो चौड़ाई से विभाजित करें।

+0

जो मेरा प्रारंभिक विचार भी था। लेकिन, ऐसा लगता है कि मुझे अब बहुत कुछ मिला है :) –

3

एक चीज जो कोशिश करने योग्य हो सकती है वह एक उन्नत मेटाफाइल डीसी बनाना है, इसे सामान्य के रूप में खींचें और फिर प्रिंटर मेट्रिक्स का उपयोग करके इस मेटाफाइल को स्केल करें। यह WTL BmpView नमूना द्वारा उपयोग किया जाने वाला दृष्टिकोण है - मुझे नहीं पता कि यह कितना सटीक होगा लेकिन यह देखने लायक हो सकता है (यह Win32 के लिए प्रासंगिक कक्षाओं को बंद करना आसान है लेकिन डब्ल्यूटीएल Win32 प्रोग्रामिंग के लिए एक महान प्रतिस्थापन है इसलिए उपयोग करने लायक हो सकता है।)

+0

बहुत बुरा मैं 2 उत्तरों नहीं चुन सकता:/ मैं निश्चित रूप से इस दृष्टिकोण (भी) को आजमा रहा हूं। बहुत बहुत धन्यवाद! –

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