الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحكم فى الطباعة

مغلق
بدأه elgazar1986 في 31 يناير 2006 · 5 رد · 990 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اريد ان اطبع اشياء محددة وليس كل محتويات فورمة معينة

مثلا لدينا فورمة تحتوى 2 label الاول باسم "الاسم"وامامه textbox والثانى اسمه "السن" واماه textbox ايضا.

عند اصدار امر الطباعة اريده ان يطبع محتويات ال textboxes فقط ولا يطبع محتويات ال labels الموضوع شبيه بفاتورة التليفون مثلا نقوم بادخال الفاتورة فى الطابعة ثم يتم كتابة البيانات فى الاماكن المحددة رجاء اريد ان اعرف الطريقة لعمل ذلك وشكرا

#2

موضوع الطباعه يمكن أن يصبح معقدا قليلا في بعض الحالات , ولكن في طباعة أشياء بسيطه لن يكون هناك شئ أسهل منه.

كل الموضوع أنك تقوم بعمل أوبجكت من PrintDocument أو سحبه على الفورم , وبعد ذلك تقوم بعمل Handler للتعامل مع حدث الـ PrintPage الخاص به. وفي ذلك الـ Handler سيكون الكود كله الخاص بالطباعه موجود فيه. ولتجعل الحدث PrintPage هذا أصلا يتنفذ ... تقم باستدعاء الداله Print الخاصه بالأوبجكت الذي قمنا بعمله من الـ PrintDocument.

مثلا في ما تسأل عنه ,, قم بسحب PrintDocument من الـ ToolBox على الـ From واترك اسمه كما هو printDocument1 . أو قم بعمل أوبجكت منه بطريقه عاديه من خلال الكود بدلا من سحبه.

بعد ذلك من نافذة الخصائص الخاصه به افتح الـ Events واضغط ضغطه مزدوجه على PrintPage حتى يتم انشاء Handler لهذا الحدث.

كما ذكرت لك , فالكود سيكون كله هنا في هذا الـ Handler. فما علينا كتابته فيه هو أن نقوم بعمل أوبجكت من نوع Graphics ثم نقوم باستدعاء الدوال المناسبه من ذلك الأوبجكت ( يوجد دوال جاهزه في Graphics هذا خاصه بطباعة النصوص والصور ).

يوجد أكثر من طريقه لعمل أوبجكت من Graphics , الطريقه المناسبه هنا هى أن نستقبله من الـ PrintPageEventArgs ::

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics myG = e.Graphics;
// بقية كود الطباعه هنا 
}

الآن وبعد أن قمنا بعمل أوبجكت منه ( myG ) يمكننا استدعاء الدوال الخاصه برسم النصوص , وفي مثالك هذا تود أن تقوم بطباعة ما هو موجود في الـ TextBoxes , وبما أنني لا أعرف أين تود طباعتهما تماما على الصفحه ؟ هل بجانب بعضهما أم من المفترض وجود واحد أعلى الآخر أم ماذا وبأى لون تريد .. الخ ! فسأقوم بطباعتهما واحد في كل سطر ::

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics myG = e.Graphics;
myG.DrawString(yourTextBox1.Text,yourTextBox1.Font,Brushes.Black,0,0);
myG.DrawString(yourTextBox2.Text,yourTextBox2.Font,Brushes.Black,0,100);
}

أنا في الكود قمت باستدعاء DrawString الخاصه برسم النصوص ومررت اليها أولا النص الموجود في الـ TextBox الأول وبعدها مررت الخط الخاص بالـ TextBox الأول لأيتم طباعته بنفس الخط الذي يراه المستخدم أماما ( ولكن يمكنك تغييره حسب ماتريد من خلال عمل أوبجكت جديد من Font ) وأيضا جعلت لون النص أسود ( Brushes.Black ) وقمت بتمرير أيضا الاحداثي ( Zero Y و Zero X ) حتى يتم طباعته في أعلى يسار الشاشه. وفعلت نفس العمليه للـ TextBox الثاني بخلاف أنني جعلت الـ Y تساوي 100 بدلا من صفر حتى لا يتم طباعتهما فوق بعضهما !

أى أن هذه العمليه ستؤدي الى طباعة النصوص بحيث يظهر كل نص في سطر والفرق في المسافه بين السطر الأول والثاني هو 100 , طبعا اذا أردت أن تجعل الفرق بين السطرين أقل من ذلك فيمكنك من خلال التحكم في قيمة الـ Y الخاصه بالـ TextBox الثاني ... واذا أردت أن تجعل المسافه طبيعيه بين السطور فهناك طريقه تستخدم في ذلك من خلال استدعاء الداله MeasureString لأنه ليس من المعقول أن تظل تجرب التقليل من قيمة الـ Y أو زيادتها ثم تطبع صفحه لترى النتائج وان لم تكن النتائج مرجوه كأن مثلا تكون المسافه بين السطرين كبيره جدا أو قليله جدا تدخل مره أخرى على الكود وتعدله ثم تطبع مره أخرى لترى النتائج !! فهذا سيكلفك كثيرا وغير عملي. ولو استقريت على قيمه معينه في النهايه فربما ستضطر الى تغيير هذه القيمه مره أخرى اذا قررت تغيير حجم أو نوع الخط المستخدم في طباعة النصوص !

أى أنه لا ينصح أبدا ( في كثير من الحالات ) اسناد قيمه بطريقه مباشره الى Y بالذات وأيضا لا ينصح الى X(الخاصه بالأفقي) لو كنت تريد مثلا أن تطبع النصوص في منتصف الصفحه أو في أماكن معينه بناء على بعض اعدادات المستخدم أو الخ.

كما رأيت من الممكن أن تصبح عملية الطباعه معقده في بعض الاحيان ! على كل حال ., بالنسبه لـ MeasureString فهى تستخدم لقياس النص بناء على نوع الخط المكتوب به ( يمرر نوع الخط لها ) مثلا في مثالنا الحالي نود أن نعرف حجم النص المكتوب في الـ TextBox الاول ( خصوصا ارتفاعه ) بناء على الخط المكتوب به ( الذي سيطبع به ) حتى نحدد القيمه التي سنمررها للـ Y حين طباعة النص الموجود في الـ TextBox الثاني , وكل هذا حتى يظهر النص المكتوب في الـ TextBox الثاني بعد النص الموجود في الـ TextBox الأول مباشرة , على الورقه.

قم بتعديل الكود , فسنستخدم MeasureString في هذا ::

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics myG = e.Graphics;
float yForTheText2 = myG.MeasureString(yourTextBox1.Text,yourTextBox1.Font).Height;
myG.DrawString(yourTextBox1.Text,yourTextBox1.Font,Brushes.Black,0,0);
myG.DrawString(yourTextBox2.Text,yourTextBox2.Font,Brushes.Black,0,yForTheText2);
}

MeasureString ترجع أوبجكت من نوع SizeF والـ Objects من هذا النوع يكون بها خاصيه تسمى الـ Height ترجع لنا الارتفاع.

في الكود السابق عملت أوبجكت من Graphics بالطريقه المناسبه. ثم بعدها استخدمت MeasureString لكى أعرف ارتفاع النص الموجود في الـ TextBox الأول بناء على الخط المكتوب به ( الذي سيتم طباعته به ). بعد ذلك طبعت الـ TextBox الأول بالطريقه العاديه ثم بعد ذلك طبعت الـ TextBox الثاني ولكن مررت yFortheText2 بدلا من تمرير قيمه صريحه للـ Y. فاذا كان مثلا النص الأول ارتفاعه 8 , سيتم طباعة النص الأول في أعلى يسار الصفحه (0و0) وسيتم طباعة النص الثاني في أيضا يسار الصفحه ولكن ليس فوق النص الأول وانما بعده مباشرة ( 0 و 8 ).

ميزة استخدام MeasureString هو أنك لن تضطر الى تعديل كود الطباعه في كل مره تريد فيها تغيير نوع الخط الذي ستطبع به النصوص و تفيدك أيضا في التقليل من الوقت والتكلفه كما رأيت.

واذا أردت طباعة نص موجود في مربع نص ثالث , يمكنك تمرير الارتفاع وهو مضروب في 2 :

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics myG = e.Graphics;
float yForTheText2 = myG.MeasureString(yourTextBox1.Text,yourTextBox1.Font).Height;
myG.DrawString(yourTextBox1.Text,yourTextBox1.Font,Brushes.Black,0,0);
myG.DrawString(yourTextBox2.Text,yourTextBox2.Font,Brushes.Black,0,yForTheText2);
myG.DrawString(yourTextBox3.Text,yourTextBox3.Font,Brushes.Black,0,(yForTheText2*2));
}

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

أيضا كل مانكتبه في الـ Handler لن يتنفذ الا بعد استدعاء الداله Print , ففي مثالنا هذا استخدم الكود التالي في أى وقت تريد فيه الطباعه ::

printDocument1.Print();

وأيضا بعد الانتهاء من كود الطباعه ينصح بأن تقوم بعمل Dispose لأوبجكت الـ Graphics الذي تستخدمه ,, ففي مثالنا هنا اكتب هذا الكود في الـ Handler بعد الانتهاء ::

myG.Dispose();

وبالنسبه للداله DrawString الذتي استخدمناها فيوجد أكثر من شكل لها ( Overloads ) وأنا استخدمت شكل واحد هنا فقط , واعلم أنه يوجد الكثير من الدوال الأخرى موجوده في Graphics خاصه بطباعة الأشكال والصور ويمكنك مراجعة ردي الموجود في هذا الموضوع :

طباعة الصوره من Picture Box , عملية الطباعه.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

تمام يا معتز 10 /10 :) :)

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#4

بدك شغل نضيف؟

ما الك الا معتز ;)

#5

الف شكر يا مان على الموضوع الجامد جدا جدا والله افدتينى جدا لكن ليى سؤال

انا لم بقوم بالطباعه الان بالطريقه دى بيتم طباعة حجم الخط بنفس الحجم على الفورمه انا كنت عايز افهم لو عايز احدد حجم لطباعة الخط بعمل ايه لانى حاولة وفشلت

#6

حدد الخط الذي تريده وانت تستدعي دالة DrawString, مثلا :

//using System.Drawing;//

Font yourFONT = new Font("Arabic Transparent",30);
.
.
myG.DrawString(yourTextBox1.Text,yourFONT,Brushes.Black,0,0);
.
.
.

حيث Arabic Transparent هذا هو اسم الـ Family و 30 هي الحجم. فغيرها على حسب ما تريد.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

هذا الموضوع مغلق.

مواضيع مشابهة