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

مشكلة مع الدالة Measurestring لا تعيد قيمة دقيقة !

بدأه hfsh80 في 25 أبريل 2008 · 6 رد · 729 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

في البداية أيها الاخوة وحتى يصحح لي المفهوم إن كنت مخطئ أعتقد أن استخدام :

e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias

أفضل من استخدام :

e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit

للمواد المطبوعة فهل هذا صحيح ؟

عندما نضع الكود التالي في حدث Paint للفورم فإننا نحصل على نتائج مختلفة فهل الخطأ في الكود أم في اللغة نفسها ؟

Dim r As Double = 0
		Dim y As Integer = 0
		Dim sz As SizeF
		e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
		Dim st As String = "منتديات الفريق العربي للبرمجة"
		Dim strFormat As New StringFormat(StringFormatFlags.DirectionRightToLeft)

		Dim pn As New Pen(Color.Black, 2)

		sz = e.Graphics.MeasureString(st, New Font("AL-Mohanad", 20, FontStyle.Bold))

		r = (Me.Width / 2) + (sz.Width / 2)
		y = 30

		e.Graphics.DrawString(st, New Font("AL-Mohanad", 20, FontStyle.Bold), Brushes.Black, CInt(r), y, strFormat)
		e.Graphics.DrawRectangle(pn, CInt(r) - sz.Width, y - 25, sz.Width, 20)

		e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
		y += 70

		sz = e.Graphics.MeasureString(st, New Font("AL-Mohanad", 20, FontStyle.Bold))

		r = (Me.Width / 2) + (sz.Width / 2)

		e.Graphics.DrawString(st, New Font("AL-Mohanad", 20, FontStyle.Bold), Brushes.Black, CInt(r), y, strFormat)
		e.Graphics.DrawRectangle(pn, CInt(r) - sz.Width, y - 25, sz.Width, 20)

لكم أجمل تحية

#2

التجربة على الفورم لا تفيد كثيرا فالنتائج لاتطابق ما سيظهر على الطابعة

جرب استخدام الكود للطباعة على الورق وأضف خاصية PrintPreview تعطيك نتائج أقرب لما سيظهر على الطابعة

عند تجربة كودك للطباعة على الفورم ظهرت مشكلة ولكن عند وضع كودك بدل الكود الموجود في الحدث Pdoc_PrintPage في البرنامج المرفق في موضوعي سؤال: حول طباعة النصوص ظهرت نتائج المعاينة قبل الطباعة بصورة ممتازة

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 25 أبريل 2008 في 10:37

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

أستاذي الفاضل محمد سامر أبو سلو

فعلا أساس هذا الكود في حدث الطباعة نقلته على هذا الشكل ليسهل تطبيقه .

الآن لاحظ معي هذا الكود مقتبس من البرنامج الذي أقوم بإعداده الآن :

Public Class Form1
	Dim st As String

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

		st = InputBox("أدخل النص المراد طباعته وتوسيطه")

		Try
			PrintPreviewDialog1.Document = PrintDocument1
			PrintPreviewDialog1.ShowDialog()

		Catch
			MessageBox.Show("واجه البرنامج خطأ أثناء محاولة الطباعة", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)

		End Try

	End Sub

	Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

		Dim pn As New Pen(Color.Black, 2)
		Dim strFormat As New StringFormat(StringFormatFlags.DirectionRightToLeft)
		e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
		Dim r As Double
		Dim sz1 As SizeF

		sz1 = e.Graphics.MeasureString(st, New Font("AL-Mohanad", 20, FontStyle.Bold))
		r = (e.PageBounds.Width / 2) + (sz1.Width / 2)
		e.Graphics.DrawString(st, New Font("AL-Mohanad", 20, FontStyle.Bold), Brushes.Black, CInt(r), 100, strFormat)


	End Sub

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

		Dim ps As New Printing.PageSettings
		ps.Margins.Left = 50
		ps.Margins.Right = 50
		ps.Margins.Top = 50
		ps.Margins.Bottom = 50
		PrintDocument1.DefaultPageSettings = ps

	End Sub

End Class

طبعا لست أطلب من المستخدم إدخال سلسلة نصية لتوسيطها ولكن فقط للتوضيح .

الآن عندما أدخل سلسلة نصيه مثل ( منتديات الفريق العربي للبرمجة - قسم الفيجوال بيسك دوت نت ) فإن التوسيط غير دقيق ولو دققت النظر في ناتج الطباعة سترى أن النص مائل جهة اليمين !!

هل الخطأ في الكود ؟

أتمنى أن أصل للتوسيط الدقيق كما في برنامج الوورد مثلا .

ولك وللجميع أجمل تحية .

#4

لا أرى مشكلة بالكود

ومع التجربة الفرق بسيط جدا ولا يكاد يؤثر

على كل حال الفرق يكون غالبا بسبب التحويل إلى Integer حاول إضافة أو انقاص عدد ثابت 1 أو 2 مثلا لمعادلة حساب المنتصف

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

شكرا لسعة صدرك أستاذي الفاضل محمد سامر أبو سلو

الغريب في الأمر أن استخدام الدالة MeasureString التابعة للوسيط الممرر للطباعة e يختلف عن استخدام نفس الدالة الخاصة بالرسم بمعنى آخر :

Dim gr As Graphics = Me.CreateGraphics
sz1 = e.Graphics.MeasureString(st, New Font("AL-Mohanad", 20, FontStyle.Bold))
sz2= gr.MeasureString(st, New Font("AL-Mohanad", 20, FontStyle.Bold))

القيمة التي تعيدها الدالة في السطر الثاني تختلف قليلاً عن السطر الثالث ( أقصد بالقيمة عرض النص ) لماذا ؟؟ :resentful:

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

لك ولجميع من مر هنا أجمل تحية

#6

طبيعي أن لاتعطي نفس النتيجة

أنت عندما أنشأت gr استخدمت Me.CreateGraphics و Me هو مؤشر دال على الفئة الحالية - النموذج هنا - أي أن gr هنا مرتبطة بالشاشة في النهاية وليس بالطابعة. وعندما استخدمت e من داخل إجراء معالجة الحدث PrintDocument1.PrintPage هذه الـ e مرتبطة بالطابعة ونتيجة الاختلاف في طبيعة الجهازين ودقة الاظهار عليهما من الطبيعي أن لاتعطي الدالة MeasureString نفس النتيجة في الحالتين

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 26 أبريل 2008 في 14:30

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#7

أشكرك على المتابعة المستمرة وسرعة الرد أستاذي العزيز .

كلما تعلمت شيئاً في الدوت نت علمت أنني أجهل الكثير :)

لك أجمل التحايا

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