الطباعة Printing

فى هذا الفصل نشرح كيفيه توجيه المخرجات الى الة الطباعة (Printer) وكيفيه إظهار صندوق حوار الطباعة لتحرير مواصفات الطباعة من عدد النسخ ونوع الة الطباعة وغير ذلك.

أولاً : الطباعة

توجيه المخرجات إلى الة الطباعة جزء مهم وهو متعدد الطرق حسب فكرة البرنامج فإذا كنت تعمل فى برنامج قواعد البيانات (تم تخليقه بإستعمال VC++) وتريد توجيه المخرجات إلى الة الطباعة فإنك تستعمل أداة توليد التقارير Crystal Report التى تتولى تخليق التقارير وعرضها على الشاشه وتوجيهها إلى الة الطباعة ، وتتولى هذه الأداة تنظيم عمليه الطباعة (وهذا ما سوف نراه فى الجزء الثانى من الكتاب).

أما إذا كنت تعمل خلال برنامج غير برنامج قواعد البيانات فإنك تتولى تنظيم عمليه توجيه المخرجات إلى الة الطباعة ، وذلك بالتعاون مع معالج التطبيقات فى VC++ (App Wizard) ، ويوفر برنامج المعالج VC++ بعض المساعدات للطباعة ولتوضيح ذلك سوف نشرح كيف يوفر VC++ جميع عمليات الطباعة فى بعض التطبيقات وذلك من خلال المثال التالى :

مثال

فى هذا البرنامج نوضح كيف يوفر برنامج VC++ جميع عمليات الطباعه من مواصفات صفحه الطباعة ، مواصفات الة الطباعة ، عدد نسخ الطباعة وغير ذلك بدون كتابة أوامر ، وقبل متابعة خطوات تصميم البرنامج .

- افتح ملف البرنامج Vcex 26 من الفهرس الفرعى Chpt15 ونفذه تحصل على نتيجه التنفيذ ابدأ فى كتابة سطور داخل صفحه البرنامج كما فى الشكل 15-1.

clip_image002[4]

شكل 15-1

- من القائمه الرئيسيه للبرنامج اختار File ثم Print Preview وهو اختيار معينة قبل الطباعة لترى شكل المخرجات قبل توجيها إلى الة الطباعة تحصل على شكل 15-2.

clip_image004[4]

15-2

جرب استعمال اختيارات هذا الشكل مثل Prev Page , Next Page , Two Page , One Page ولاحظ النتيجه ، (تلاحظ أنها تعمل بكفاءة).

- من القائمه الرئيسيه من الاختيار File اختار Print تحصل على صندوق حوار الطباعة كما فى الشكل 15-3.

clip_image005[4]

15-3

من هذا الشكل تستطيع ضبط مواصفات الطباعة جرب ذلك ثم انقر زر موافق يبدأ البرنامج فى توجيه المخرجات إلى الة الطباعة فإذا كانت لديك الة طباعة وكانت مفتوحه تلاحظ طباعة المخرجات.

خطوات تصميم البرنامج

فى هذا البرنامج لا يتم كتابة أى أوامر برمجه حيث يضيف برنامج VC++ جميع الأوامر اللازمة لعمليات الطباعة حسب مواصفات البرنامج ، ويتم تخليق البرنامج بالخطوات التاليه :

1. ابدأ تطبيق جديد وذلك باختيار File ثم New ثم Project Work Space ، اكتب اسم للبرنامج وليكن VCex26.

2. فى الخطوه رقم 1 اختار نوع التطبيق من النوع Multiple document وهو النوع الإفتراضى ثم انقر Next ، ثم Next فى الخطوه 3.

3. فى الخطوة رقم 4 (Step 4 of 6) تلاحظ وجود الاختيار Printing and Print Preview وهذا الاختيار معناه إضافه هذا الاختيار للبرنامج وإضافة الدوال المسؤلة عن عملياته ، اتركه كما هو وانقر Next ثم Next.

4. فى الخطوة رقم 6 (Step 6 of 6) تظهر شاشه فصائل البرنامج ، اختار الفصيلة C-View وحولها إلى النوع CEdit View كما فى الشكل 15-4 ، حيث تسمح الفصيله CEditView للمستخدم بكتابه بيانات فى خلفيه البرنامج كما فى معالج كتابة الرسائل..

clip_image007[4]

شكل 15-4

انقر Finish ثم Ok ليتم تخليق برنامج بهذه المواصفات.

ملحوظه : الفصيلة CEdit View توفر خدمات برنامج كتابة رسائل متكامل ، حيث تسمح للمستخدم بالكتابه والنسخ واللصق والقص ، وتسمح بتخزين واسترجاع هذه البيانات ، وتسمح أيضاً بعمليات الطباعة.

5. ترجم ونفذ البرنامج (بدون التعديل فيه) وذلك بالضغط على المفتاحين Ctrl + F5 تحصل على نتيجه التنفيذ ، جرب استعمال البرنامج بكتابه سطور فى صفحه الكتابة وجرب اختيارات الطباعة مثل Print Preview ، Print و Print Setup تلاحظ أنها تعمل جيداً ، وجرب توجيه المخرجات إلى الة الطباعة تلاحظ طباعة المخرجات بدون مشاكل ، وبهذا رأينا كيف يوفر معالج VC++ دوال التعامل مع آلة الطباعة بدون تدخل المبرمج ، وفيما يلى عرض لخطوات عملية الطباعة والدوال المسئوله عن ذلك.

دوال الطباعة

توجد مجموعة من الدوال المسؤلة عن تنظيم عملية الطباعة والتى يتم إضافتها للبرنامج عند وجود اختيار الطباعة فيه تعرضها فيما يلى :

* الداله On_Begin_Printing ( )

يتم استدعاء هذه الداله بعد ظهور صندوق حوار الطباعة ، وهى مسؤلة عن تحديد مواصفات نصوص الطباعة من حيث نوع وحجم الخط وغير ذلك.

* الداله On_End_Printing ( )

يتم استدعاء هذه الدالة بعد إنهاء عمليه الطباعة واغلاق صندوق حوار الطباعة.

* الداله On Prepare DC ( )

تتابع هذه الدالة صفحات الطباعة وتختبر إنتهاء عملية الطباعة بدون مشاكل.

* الداله On Print ( )

تخرج محتويات الصفحه إلى الة الطباعة وتستدعى الداله On Draw لطباعة محتويات صفحه الشاشه.

خطوات عمليه الطباعة

تمر عملية الطباعة بجموعة خطوات يوفرها VC++ كما يلى :

- يتم استدعاء الداله On Draw ( ) المسئولة عن اظهار البيانات على الشاشه ولكن بإستدعائها مع الة الطباعة.

- توجيه مؤشر إلى الة الطباعة.

- توجيه مؤشر إلى مواصفات الطباعة وذلك من الفصيلة CPrint Info التى تحدد مواصفات صفحه الطباعة ، وصفحه البداية والنهايه.

تجهيز مواصفات الطباعه

يتم تجهيز مواصفات الطباعة باستخدام الداله On Prepare DC حيث تحدد مواصفات محتويات صفحه الطباعة ، فإذا كانت المحتويات نصوص تكون الحاله MM-TEXT أما إذا كانت صفحه الطباعة تحتوى على رسومات يتم تحديد حاله الرسومات وهكذا.

التحكم فى عمليه الطباعه

فى المثال السابق شرحنا كيف تتم عمليه الطباعه بسهوله وبدون تدخل المبرمج ، ولكن كانت عمليه الطباعه بسيطه وهى طباعة محتويات صفحات الكتابة والتحكم فيها ، بينما هناك حالات ليست بهذه البساطه بل تفرض على المبرمج التدخل فى عملية الطباعة وتنظيم خطواتها.


مثال 2

فى هذا المثال نشرح شكل مختلف من عمليات الطباعة ، حيث يقوم البرنامج برسم مجموعه من الدوائر على الشاشه وعند الطباعة يتم طباعة مواصفات الدوائر بدلاً من طباعة الدوائر ، وهذا يوضح التحكم فى توجيه المخرجات كما يشاء المبرمج وليس مجرد طباعة المخرجات الموجهه إلى الشاشه على آلة الطباعة بل يمكن إظهار معلومات على الشاشه وطباعة معلومات آخرى.

- افتح الملف Vcex27 من الفهرس الفرعى Chpt15 ونفذه تحصل على نتيجه التنفيذ كما فى الشكل 15-5.

clip_image008[4]

شكل 15-5

والشكل 15-5 عبارة عن برنامج من نوع MDI به مجموعه الدوائر.

- اختار Print Preview من الاختيار File تحصل على القيم الممثله لهذه الدوائر كما فى الشكل 15-6.

clip_image009[5]

شكل 15-6

- اختار Print من File ثم Ok فيتم طباعة القيم المقابلة للدوائر على الة الطباعة.

(هذا إذا كان لديك آلة طباعة ، فإذا لم يكن عندك جرب اختيار Print Preview).

خطوات تصميم البرنامج

1. ابدأ برنامج جديد واترك الاختيارات الافتراضيه كما هى مع اعطاء التطبيق الاسم Vcex27 ثم اختار Finsh فتحصل على برنامج من نوع MDI.

- تعديل الملف Vcex27 Doc.h يتم تعريف مجموعه من المتغيرات المطلوبه كما يلى :

- افتح الملف Vcex27 Doc.h واكتب السطور التاليه داخل الفصيلة    Doc كما يلى :

Public :

1 : CRect m-ellipse Array [50] ;

2 : int m-nEllipseQty ;

3 : int nLinesPerPage ;

فى هذه السطور

فى السطر رقم 1 تم اعلان مصفوفة من الأهداف من نوع الفصيلة Crect والفصيلة Crect تعطى هدف له أربعة أحدثيات كأحدثيات المستطيل.

فى السطر رقم 2 يتم الاعلان متغير من نوع صحيح لاستعماله للاشارة إلى عدد الدوائر.

فى السطر رقم 3 يتم الاعلان عن متغير من نوع صحيح للاشارة إلى عدد السطور فى الصفحه.

- تعديل الملف Vcexe27 Doc.CPP يتم كتابة مجموعه من الأوامر فى دالة بناء الفصيلة Vcexe27 Doc تؤدى إلى وضع قيم عشوائيه فى مصفوفه القيم كما يلى :

- افتح الملف Vcexe27 Doc.CPP وفى دالة البناء اكتب السطور التالية :

Vcexe 27 Doc : : Vcexe 27 Doc ( )

{

1 : int n1, n2, n3 ;

2 : Srand ( (unsigned) time (Null)) ;

3 : m-n Ellipse Qty = 50 ;

4 : for (int I = 0; i<m-n Ellipse Qty; I++) {

5 : n1 = (Long) rand ( ) * 600L / RAND-MAX ;

6 : n2 = (Long) rand ( ) * 600L / RAND-MAX ;

7 : n3 = (Long) rand ( ) * 50L / RAND-MAX ;

8 : m-ellipse Array [i] = Crect (n1, -n2, n1+n3, -(n2+n3) ;

9 : } }

فى هذه السطور فى السطر رقم 2 يتم استخدام دالة اخراج أرقام عشوائية تعتمد على الوقت .

فى السطر رقم 4 تبدأ دوارة for للتكرار من القيمه 0 إلى القيمه 50.

فى السطر رقم 6 يتم توليد أرقام عشوائيه بإستعمال الداله rand ( ) وتخزينها فى المتغير n1 ، بالمثل السطر 7 والسطر رقم 8.

فى السطر رقم 9 يتم تخزين القيم العشوائيه فى عناصر المصفوفه m-ellipse Array بتغير قيمه المتغير i ، وهكذا حتى تنتهى الدوارة for ، وبالتالى أصبحت المصفوفة m-ellipseArray تحتوى على مجموعه من الأرقام العشوائيه.

إضافه دوال

يجب إضافة الدالتين OnPrint ( ) ، On Prepeare DC ( ) لتحقيق عمليه الطباعة ويتم ذلك كما يلى :

- اضغط المفتاحين Ctrl +W للوصول إلى Class Wizard.

- من صندوق الفصائل (Class Name) اختار الفصيله Cvcex27 View.

- من صندوق الرسائل (Messages) اختار On Print ثم Add function.

- بنفس الطريقه اختار On Prepeare DC وأضف الداله On Prepear DC ( ).

رسم الدوائر على الشاشه

لرسم دوائر على الشاشه يتم كتابه مجموعة من الأوامر فى الداله On Draw التى تنفذ عند تنفيذ البرنامج كما يلى :

- اختار الداله On Draw واكتب السطور التاليه :

1 : int I , j ;

2 : Vcxe27 Doc * PDoc = Get Document ( ) ;

3 : j = P Doc ® m-n Ellipse Qty ;

4 : for (i = 0, i< j , i++) {

5 : PDC ® Ellipse (Pdoc ® m-ellipse Array [i]) ;}

فى هذه السطور

فى السطر رقم 2 يتم تعريف المتغير Pdoc من نوع الفصيلة Cvcxe27 Doc لإستعمال للاشارة إلى بيانات الفصيلة.

فى السطر رقم 3 يتم تخزين قيمه المتغير m-nEllipseQty الموجودة فى الفصيلة Cvxe27 Doc فى المتغير j.

فى السطر رقم 5 يتم رسم دوائر باستعمال الداله Ellipse ( ) وإحداثيات هذه الدوائر هى قيم عناصر المصفوفه mellipse Array التى أخذت قيم عشوائيه مسبقاً.

تحديد مواصفات حالة الطباعة

توجد اكثر من حاله لظهور البيانات بها سواء على الشاشه أو الة الطباعة وهذه الحالات يتم تحديدها بإستخدام الداله Set Map Mode ( ) التى تأخذ معامل واحد هو متغير يعبر عن الحالة المطلوبة.

والجدول التالى (شكل 15-7) يعرض الحالات المختلفه ومعنى كل حاله.

الحاله

المعنى

MM-ENGLISH

تحول وحدة الرسم (الكتابه) إلى 0.001 من البوصه.

MM-HIMETRIC

تحول وحدة الرسم إلى 0.01 ملى متر.

MM-LOENGLISH

تحول وحدة الرسم إلى 0.01 من البوصة.

MM-LOMETRIC

تحول وحدة الرسم إلى 0.1 ملى متر.

MM-TEXT

تحول وحدة الرسم إلى الوحدة الوضعية لكتابة النصوص.

MM-TWIPS

تحول وحدة الرسم إلى 1/20 من النقطة حيث تساوى Twip القيمه 1/1440 من البوصة.

جدول 15-7

الحالات المختلفه للشاشه والة الطباعة

ويتم تحديد الحالة المطلوبه داخل الداله On Prepare DC كما يلى :

- اضغط المفتاحين Ctrl + W ، من صندوق العناصر اختار Cvcex27 View ومن صندوق الرسائل اختار On Prepare DC ثم Edit Code واكتب السطر التالى :

PDC ® Set Map Mode (MM-LOENGLISG) ;

- توجيه المخرجات إلى الطباعة

يتم توجيه المخرجات إلى الطباعه بإستخدام الداله On Print ( ) ويتم ذلك كما يلى :

- عن طريق Class Wizard اختار الداله On Print التى تم إضافتها من قبل واكتب فيها السطور التاليه :

1 : int I, nStart, n End, n Height ;

2 : char temp [130] ;

3 : C point Point (720, -1440) ;

4 : C Font Font ;

5 : Text Metric tm ;

6 : PDC ® SetMapMode (MM-TWIPS) ;

7 : Cvcxe27 Doc * Pdoc = GetDocument ( ) ;

8 : m-n Page = Pinfo ® nLinesPerPage ;

9 : n Start = (m-n Page-1) * Pdoc ® NLinesPerPage ;

10 : font. CreateFont (-280,0,0,0,400, FALSE, FALSE, 0, ANSI-CHRSET, Out-DEFAULT-PRECIS, CLIP-DEFAULT-PRECIS, DEFAULT-PITCH : FF-MODERN, “Courier New”) ;

11 : C Font * pold Font = ( C Font *) (PDC ® SelectObject (& Font) ;

12 : PDC ® Get Text Metrics (&tm) ;

13 : n Hieght = tm. tm Hieght + tm. tm ExteonalLeading ;

14 : for (i = n Start , i < n End ; i++) {

15 : if (i > = PDoc ® m-nEllipseQty)

16 : break ;

17 : VS Print f (temp, “%d %d %d %d %d” ,

i+1, PDoc ®m- ellipse Array [i]. Left, PDoc ® m-ellips Array [i]. Top,

PDoc ® m-ellips Array [i]. right ,

PDoc ® m-ellips Array [i]. bottom) ;

18 : Point.y -= n Heught ;

19 : PDC ® TextOut (Point. x, Point. y, temp) ;

20 : }

21 : PDC ® Select Object (pOld Font) ;

فى هذه السطور

فى السطر رقم 1 إلى السطر رقم 5 يتم الاعلان عن مجموعه متغيرات مختلفه الأنواع.

فى السطر رقم 6 يتم استدعاء الداله SetMapMode ( ) لتغيير حاله الرسم إلى حاله MM-TWIPS.

فى السطر رقم 7 اعلان عن المتغير Pdoc من نوع الفصيلة Cvcxe27Doc لاستعماله للإشارة لمتغيرات (بيانات) الفصيلة.

فى السطر رقم 8 يتم تخزين رقم الصفحه الحاليه فى المتغير m-n Page وبالمثل السطر رقم 9.

فى السطر رقم 10 يتم تغيير مواصفات خط الكتابة بإستعمال الداله CreateFont ( ) كما سبق فى فصل خطوط الكتابة (فصل ).

فى السطر رقم 12 يتم تحديد أبعاد شاشه الرسم وتسجيلها فى المتغير tm.

فى السطر رقم 13 يتم تحديد أرتفاع شاشه الرسم فى المتغير n Height.

فى السطر رقم 15 يتم إختبار قيمه المتغير i ، إذا وصلت إلى قيمه المتغير m-nEllipseQty وهى عدد القيم يتم الخروج من الدوارة for.

فى السطر رقم 17 يتم استعمال الداله V Print f ( ) لطباعة قيم عناصر المصفوفه الممثلة لاحدثيات الدوائر فى المتغير temp.

فى السطر رقم 19 يتم طباعة محتويات المتغير Temp وهى القيم التى تم تخزينها.

فى السطر رقم 21 يتم إسترجاع مواصفات الخط القديمه قبل التعديل.

- ضبط القيمه الابتدائيه لعدد الصفحات

يتم ضبط القيمه الابتدائيه للطباعه فى الداله OnPreparePrinting ( ) ، افتح هذه الداله واكتب السطرين التاليين :

1 : Cvexe27Doc * Pdoc = Get Document ( ) ;

2 : PInfo ® SetMaxPage (PDoc ® m-n Ellipse Qty % Cvcxe27 Doc : : n Lines PerPge+1) ;

فى السطر رقم 1 اعلان عن المتغير Pdoc من نوع الفصيلة Cvexe27 Doc.

فى السطر رقم 2 استدعاء الداله SetMaxPage ( ) لتحديد الحد الأقصى لصفحات الطباعه.

- ترجمة وتنفيذ البرنامج

ترجم ونفذ البرنامج بالضغط على المفتاحين Ctrl + F5 تحصل على نتيجه التنفيذ ، جرب استعمال البرنامج بإختيار Print View واختيار Print وملاحظه النتيجه ، تلاحظ ظهور دوائر عشوائيه على شاشه الرسم فى حين يعطى اختيار معاينه قبل الطباعة (Print Prieview) إحداثيات هذه الدوائر ، ويطبع إختيار Print هذه الإحداثيات على آلة الطباعة.

وبهذا يتضح كيفيه التحكم فى المخرجات وتوجيها إلى الشاشه وتوجيها إلى آلة الطباعة.

التسميات: