مقدمة :
الدالة MeasureString القيمة المستردة منها عبارة عن SizeF و الهدف منها هو قياس ارتفاع و عرض أي String
هذه الدالة OverLoaded و المقصد بهذا أنها لها أكثر من صورة لتمرير المتغيرات
الدالة MeasureString لها 6 أشكال لتمرير المتغيرات و طبقا لإحتياج المبرمج فهو يختار الصورة التي تناسبه لإسترجاع البيانات
قد تسأل نفسك لماذا نسترد منها SizeF و ليس Size
الجواب علي ذلك هو أن SizeF أكثر دقة من Size
عموما سهل إننا تغير من SizeF الي Size وهذا مرتبط بإحتياجات الرسم
لكن المهم في الأمر هنا هو السطح الذي سوف تظهر عليه الكلمات المرسومة او المطبوعة لأننا غالبا إما أن ترسم علي سطح أبعاده معروفة مسبقا او سوف ترسم علي سطح قد تتغير أبعاده
مثلا ورقة الطباعة لها اكثر من حجم و بالتالي و لأنك لا تعلم ما هو النوع الذي سوف يستخدمه مستخدم برنامجك عند الطباعة لذلك عليك هنا ان تضع في اعتبارك ان ابعاد السطح قد تتغير
نفس الأمر ينطبق علي الرسم علي الفورم او علي الكونترول حيث ان الفورم تتغير ابعاده إما عن طريق الماوس او عن طريق Maximize وبنفس المنطق يجب أن تضع كل هذا في اعتبارك
عموما في جميع الحالات و سواء انت تطبع علي ورقة او ترسم علي الفورم فأنت هنا تتعامل مع سطع غير محدد الأبعاد لهذا نحتاج لقياس طول و عرض String خاصة أن الطول يؤثر في الارتفاع الإجمالي للرسم و عرض التكست أيضا يؤثر في العرض الإجمالي للسطح المراد الرسم عليه
طبعا إرتفاع String يحدده حجم الفونت لذلك ستجد أن الفونت أحد المتغيرات الهامة المستخدمة في الدالة
أمثلة للتوضيح :
المثال الأول:
في هذا المثال نحسب ابعاد التكست و منها نحسب عرض و ارتفاع مستطيل نرسمه خارج حدود التكست
مكان الرسم الخاص بالمستطيل شئ تحدده انت اما ابعاد المستطيل قتم حسابها من حساب عرض و ارتفاع التكست
ولتنفيذ الكود افتح مشروع و ضع به باتون و اكتب الكود بالشكل التالي
حاول تغير ارتفاع الفونت أكثر من مرة و لتري ما سيحدث معاك
الطريف في الأمر ستكتشف انه و بالرغم من أن أبعاد المستطيل تساوي ابعاد التكست
لكنك ستلاحظ ان المستطيل تم رسمه خارج حدود التكست و السبب في ذلك ان الدالة MeasureString لا نسترد منها أبعاد التكست بكل دقة و لكنها أيضا تضيف قيمة صغيرة لعرض و ارتفاع التكست
كود :
Public Class Form1
Dim demoString As String = "Demo String"
Dim g As Graphics = CType(Nothing, Graphics)
Dim fontTextHeight As Single = 20.0F
Dim result As SizeF = CType(Nothing, SizeF)
' Example: Measure String With CreateGraphics
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
g = Me.CreateGraphics
Using f As New Font(Me.Font.FontFamily, fontTextHeight)
Dim stringSize As SizeF = g.MeasureString(demoString, f)
result = stringSize
End Using
Me.Text = result.Width & " , " & result.Height
' Convert SizeF to Size
' Uncomment the below code to see the difference
'Dim txtSize As Size = Size.Round(result)
'Me.Text = txtSize.Width & " , " & txtSize.Height
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim r As RectangleF = New RectangleF(15, 15, result.Width, result.Height)
g.DrawString(demoString, New Font(Me.Font.FontFamily, fontTextHeight), SystemBrushes.WindowText, r)
g.DrawRectangle(SystemPens.ActiveBorder, Rectangle.Round(r))
End Sub
End Class
المثال الثاني:
هو خليط من الكود الخاص بك و الذي تفضلت بكتابته في سؤالك الذي تستخدمه في قياس ارتفاع وعرض التكست و لسوف استخدم نفس الفكرة الموجودة في المثال الأول
PHP كود :
Public Class Form1
Dim demoString As String = "Demo String"
Dim g As Graphics = CType(Nothing, Graphics)
Dim fontTextHeight As Single = 20.0F
Dim result As SizeF = CType(Nothing, SizeF)
Dim chars As Integer = CType(Nothing, Integer)
Dim line As Integer = CType(Nothing, Integer)
Dim currentChar As Integer = CType(Nothing, Integer)
' Example: Measure String With CreateGraphics
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
g = Me.CreateGraphics
Dim sf As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
Using f As New Font("Lucida Console", fontTextHeight, FontStyle.Bold)
Dim stringSize As SizeF = g.MeasureString(Mid(demoString, currentChar + 1), f, New SizeF(0, 0), sf, chars, line)
result = stringSize
End Using
' لا حظظ هنا القيم الناتجة من قياس التكست ستجد انها تحدد بداية و عدد الحروف الموجودة في التكست
Me.Text = line & " , " & chars
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim r As RectangleF = New RectangleF(15, 15, result.Width, result.Height)
g.DrawString(demoString, New Font(Me.Font.FontFamily, fontTextHeight), SystemBrushes.WindowText, r)
g.DrawRectangle(SystemPens.ActiveBorder, Rectangle.Round(r))
End Sub
End Class
سؤال : هل يوجد طرق أخري لقياس ارتفاع و عرض اي String بدون اللجوء الي الجرافكس كلاس؟
الجواب يمكن استخدام TextRender كلاس حيث ستجد به أيضا بعض الدوال التي يمكن استخدامها لقياس ارتفاع و عرض التكست
و بعضا من هذه الدوال لا يحتاج الي تمرير الكلاس Graphics و بالتالي يمكن استخدامها من اي مكان داخل الكود
سؤال: هل يوجد طرق أخري لقياس ابعاد التكست بدون استخدام الدوال التي كتبتها مايكروسوفت؟
نعم يوجد وذلك باستخدام شاشة الكمبيوتر او باستخدام صورة
بالنسبة لسؤالك : لمادا استخدم Mid في MeasureString و استخدم Substring في DrawString
هذا تسأل فيه صاحب الكود الأصلي لكني أعتقد انه يحاول تحديد بداية و نهاية الحروف المكونة للتكست
و بشكل عام هذ ليس له تأثير كبير علي الكود
أ