تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] ممكن مساعدة في فهم هذا الكود Graphics
#6
مقدمة :

الدالة 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(NothingGraphics)
 
   Dim fontTextHeight As Single 20.0F
    Dim result 
As SizeF CType(NothingSizeF)
 
   Dim chars As Integer CType(NothingInteger)
 
   Dim line As Integer CType(NothingInteger)
 
   Dim currentChar As Integer CType(NothingInteger)

 
   ' 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 ObjectAs EventArgsHandles Button1.Click

        Dim r 
As RectangleF = New RectangleF(1515result.Widthresult.Height)
 
       g.DrawString(demoString, New Font(Me.Font.FontFamilyfontTextHeight), SystemBrushes.WindowTextr)
 
       g.DrawRectangle(SystemPens.ActiveBorderRectangle.Round(r))
 
   End Sub
End 
Class 

سؤال : هل يوجد طرق أخري لقياس ارتفاع و عرض اي String بدون اللجوء الي الجرافكس كلاس؟
الجواب يمكن استخدام TextRender كلاس حيث ستجد به أيضا بعض الدوال التي يمكن استخدامها لقياس ارتفاع و عرض التكست
و بعضا من هذه الدوال لا يحتاج الي تمرير الكلاس Graphics و بالتالي يمكن استخدامها من اي مكان داخل الكود

سؤال: هل يوجد طرق أخري لقياس ابعاد التكست بدون استخدام الدوال التي كتبتها مايكروسوفت؟
نعم يوجد وذلك باستخدام شاشة الكمبيوتر او باستخدام صورة

بالنسبة لسؤالك : لمادا استخدم Mid في MeasureString و استخدم Substring في DrawString
هذا تسأل فيه صاحب الكود الأصلي لكني أعتقد انه يحاول تحديد بداية و نهاية الحروف المكونة للتكست 
و بشكل عام هذ ليس له  تأثير كبير علي الكود

أ
الرد }}}
تم الشكر بواسطة: الوادي , sniperjawadino , sniperjawadino


الردود في هذا الموضوع
RE: ممكن مساعدة في فهم هذا الكود Graphics - بواسطة silverlight - 16-08-16, 10:12 PM


التنقل السريع :


يقوم بقرائة الموضوع: