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

ممكن أن أجد أي مساعدة في فهم هذا الكود

ما دور MeasureString
ولمادا تم إستخدام Mid
وما مهمة currentChar
  و أيضا   chars    line    format


أنا جديد في Graphics
إعدروني

[صورة مرفقة: 883546737.jpg]

        Static currentChar As Integer
 
        Dim format As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
        Dim chars As Integer
        Dim line As Integer
 
        e.Graphics.MeasureString(Mid(TextToPrint, currentChar + 1), New Font("Lucida Console", 10, FontStyle.Bold), New SizeF(0, 0), format, chars, line)

        e.Graphics.DrawString(TextToPrint.Substring(currentChar, chars), New Font("Lucida Console", 10, FontStyle.Bold), Brushes.Black, New Rectangle(0, 0, 0, 0), format)
 


        currentChar = currentChar + chars
        If currentChar < TextToPrint.Length Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
            currentChar = 0
        End If
الرد }}}
تم الشكر بواسطة:
#2
اولا دعني اوضح لك أمرا هاما خاص بالجرافكس

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

لذلك حين تريد أن نرسم شيئا عليك أن تدرس و نفهم أبعاد السطح الذي نرسم عليه و كيف نرسم عليه

في الحياة العادية و عندما ترسم علي ورقة فأنت تحتاج الي أدوات لكي ترسم مثل قلم رصاص و ألوان و اشياء من هذا القبيل

اما في الكمبيوتر فأدواتك في الرسم هي Brushes و Fonts و Rectangle و Point و Color و StringFormat و اشياء اخري
وبدون فهم لهذا الاشياء و كيفية التعامل معها فأنت هنا لن تستطيع ان تجيد عملية الرسم

أهم شئ في الرسم هو وسيلة الرسم وفي الحياة العادية فإن اليد التي ترسم بها علي الورقة تمثل اداة الرسم وما يقابل هذا في البرمجه فهو Graphics كلاس

تستطيع اعتبار Graphics Class هو القلب النابض لكي شئ تراه علي شاشة الكمبيوتر او تراه مطبوع علي الطابعة
و طبعا و بدون القلب لا يصح الجسد

الدالة Mid دالة OverLoaded لذلك ستجد لها اكثر من صورة و الهدف منها هو تحديد بداية التكست او تحديد مكان كلمة في التكست
أمثلة علي ذلك:
-
كود :
       Dim textToDraw As String = "Graphis Demo"

       ' Example 1
       ' Mid (string, location of first char in the string/word)
       Dim startPoint As Integer = 5
       Dim s As String = Mid(textToDraw, startPoint + 1)
       Me.Text = s


       ' Example 2
       ' Mid (string, location of first char in the string/word, number of char in the string/word)

       Dim firstWord As String = Mid(textToDraw, 1, 7)
       Me.Text = firstWord


       ' Example 3
       Dim secondWord As String = Mid(textToDraw, 9, 4)
       Me.Text = secondWord


فيما يختص ببقية أسئلتك سهل جدا إن أنا أجاوبك عليها لكن لو فعلا أنت مهتم عليك أن تدرس الكلاسات الخاصة بالجرافكس و إن شاء الله سأرد علي اي استفسار لك خاص بالجرافكس

بشكل مبدئي افتح مشروع و اكتب الكود التالي في الحدث Paint الخاص بالفورم

كود :
Public Class Form1
   Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
       Dim priningFont As Font = New Font("Lucida Console", 10, FontStyle.Bold)
       Dim textToDraw As String = "Graphis Demo"
       Dim textSize As SizeF = e.Graphics.MeasureString(textToDraw, priningFont)

       Using sf As StringFormat = New StringFormat(StringFormatFlags.DirectionVertical)
           e.Graphics.DrawString(textToDraw, priningFont, Brushes.Black, New Rectangle(0, 0, 0, 0), sf)
       End Using

   End Sub
End Class



أعتذر للإطالة عليك
الرد }}}
تم الشكر بواسطة: الوادي , محمد كريّم , sniperjawadino
#3
طالما معاك الخبير عمر silverlight (خبير الجرافكس) فأنت محظوظ.
الرد }}}
تم الشكر بواسطة: sniperjawadino
#4
شكرا لك أخي silverlight
والإطالة هي لمصلحتي , حتى أستفذ أكثر
جزاك الله خيرا

في الحقيقة دالة Mid هي دالة لتقطيع نص معين من,,,, ألى,,,,,
كما شرحت لي

لكن ما لم أفهم
لمادا وضعت Mid في أحد باراميترات MeasureString
بل ما دور MeasureString أصلا
وإذا أمكن أريد فهم باراميتراتها format, chars, line

أحاول البحث في قوقل لكن المواضيع قليلة و معقدة قليلا
إصبر معي أخي
فأنا طامع في الإستفادة من خبرتك في هذا المجال تحت وصية الأستاذ الوادي Smile
الرد }}}
تم الشكر بواسطة:
#5
استفسار آخر
دالة Mid هي مشابهة لدالة Substring

لمادا استخدم Mid في MeasureString
و استخدم Substring في DrawString


لا تنسى أخي أن تشرح لي MeasureString


شكرااااااااااا
الرد }}}
تم الشكر بواسطة:
#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
#7
ما قصرت أخي silverlight
أفدتني كثيرا بشرحك في هذا المجال

سأحاول التدقيق في هذه الأمثلة التي كتبتها لي حتى أفهمها جيدا

شكراً لك يالغالي الله يبارك فيك ..تسلم و ربنا يخليك
الرد }}}
تم الشكر بواسطة: الوادي



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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم