02-10-12, 06:41 PM
هل من الممكن أن نرسم الصور المتحركة؟
هل من الممكن رسم الصور المتحركة بأبعادها الأصلية أو بأبعاد جديدة داخل الفورم أو داخل الكونترول هذا النوع من الأسئلة قد يخطر بعقل القارئ
طبعا و أكيد من الممكن أن نعيد رسم الصورة المتحركة بل و نعدل في أبعادها بدون أن تفقد شيئا من خواصها
وهذا يتم عن طريق استخدام احد الكلاس الهامة وهو ImageAnimator Class و هذا الكلاس لا يمكن استخدام الوراثة Inheritance معه لأنه Not Inheritable Class ومن أهم عناصر هذا الكلاس التي يهمنا أن نركز عليها هي الطرق Methods التالية حيث يتم استخدامها في التعامل مع ملفات الصور المتحركة
1- Animate وهي عبارة عن Public Shared Sub
2- CanAnimate وهي عبارة عن Public Shared Function
3- ٍStopAnimate وهي عبارة عن Public Shared Sub
4- UpdateFrames وهي عبارة عن Public Shared Sub
ولمن يريد مزيدا من التفاصيل عن هذا الكلاس يمكنه أن يقرأ ملف Help الموجود في الفيجوال استوديو
الأن لنري كيف يتم إعادة رسم الصورة المتحركة مرة أخري أو حتى تغيير أبعادها والمثال التالي يوضح ذلك
المثال الخامس:
أولا: نفتح مشروعا جديدا ولنطلق عليه AnimatedImage مثلا
ثانيا: نضيف الي المشروع وتحديدا في Resources صورة لها امتداد GIF
ثالثا: نضيف الي المشروع متغير يرمز لهذه الصورة
رابعا: في حدث الفورم Load نقوم بتحديد قيمة Form1.DoubleBuffered ونجعلها True حيث أننا نرسم داخل الفورم مباشرو وكما أوضحنا سابقا في أول المقال الهدف من ذلك هو تجنب حدوث Flickering أثناء رسم الصورة
وداخل نفس الحدث نقوم باستخدام جملة If…..Then…..End If ونستخدمها لنحدد هل الصورة المستخدمة صورة متحركة أم لا فإذا كانت الصورة متحركة نقوم [تنفيذ الكود وإن لم تكن متحركة ممكن نضع أي شرط أخر مثل رسالة مثلا
خامسا: نقوم بإضافة Invalidate من داخل الحدث Resize وهو نفس الحدث الي سوف نشير إليه عند استخدام ImageAnimator.Animate
سادسا: من داخل الحدث Paint الخاص بالفورم نقوم برسم الصورة داخل أي مستطيل نحدده مسبقا وأيضا نقوم باستخدام ImageAnimator.UpdateFrames من داخل نفس الحدث وبالتالي نستخدم الأمر e.Graphics.DrawImage لكي نرسم الصورة داخل المستطيل الذي حددنا أبعاده مسبقا
وبالتالي يكون الكود النهائي كالتالي
هل من الممكن رسم الصور المتحركة بأبعادها الأصلية أو بأبعاد جديدة داخل الفورم أو داخل الكونترول هذا النوع من الأسئلة قد يخطر بعقل القارئ
طبعا و أكيد من الممكن أن نعيد رسم الصورة المتحركة بل و نعدل في أبعادها بدون أن تفقد شيئا من خواصها
وهذا يتم عن طريق استخدام احد الكلاس الهامة وهو ImageAnimator Class و هذا الكلاس لا يمكن استخدام الوراثة Inheritance معه لأنه Not Inheritable Class ومن أهم عناصر هذا الكلاس التي يهمنا أن نركز عليها هي الطرق Methods التالية حيث يتم استخدامها في التعامل مع ملفات الصور المتحركة
1- Animate وهي عبارة عن Public Shared Sub
2- CanAnimate وهي عبارة عن Public Shared Function
3- ٍStopAnimate وهي عبارة عن Public Shared Sub
4- UpdateFrames وهي عبارة عن Public Shared Sub
ولمن يريد مزيدا من التفاصيل عن هذا الكلاس يمكنه أن يقرأ ملف Help الموجود في الفيجوال استوديو
الأن لنري كيف يتم إعادة رسم الصورة المتحركة مرة أخري أو حتى تغيير أبعادها والمثال التالي يوضح ذلك
المثال الخامس:
أولا: نفتح مشروعا جديدا ولنطلق عليه AnimatedImage مثلا
ثانيا: نضيف الي المشروع وتحديدا في Resources صورة لها امتداد GIF
ثالثا: نضيف الي المشروع متغير يرمز لهذه الصورة
رابعا: في حدث الفورم Load نقوم بتحديد قيمة Form1.DoubleBuffered ونجعلها True حيث أننا نرسم داخل الفورم مباشرو وكما أوضحنا سابقا في أول المقال الهدف من ذلك هو تجنب حدوث Flickering أثناء رسم الصورة
وداخل نفس الحدث نقوم باستخدام جملة If…..Then…..End If ونستخدمها لنحدد هل الصورة المستخدمة صورة متحركة أم لا فإذا كانت الصورة متحركة نقوم [تنفيذ الكود وإن لم تكن متحركة ممكن نضع أي شرط أخر مثل رسالة مثلا
خامسا: نقوم بإضافة Invalidate من داخل الحدث Resize وهو نفس الحدث الي سوف نشير إليه عند استخدام ImageAnimator.Animate
سادسا: من داخل الحدث Paint الخاص بالفورم نقوم برسم الصورة داخل أي مستطيل نحدده مسبقا وأيضا نقوم باستخدام ImageAnimator.UpdateFrames من داخل نفس الحدث وبالتالي نستخدم الأمر e.Graphics.DrawImage لكي نرسم الصورة داخل المستطيل الذي حددنا أبعاده مسبقا
وبالتالي يكون الكود النهائي كالتالي
كود :
Public Class Form1
Dim AnimatedImage As Bitmap = My.Resources.Mohd_01
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DoubleBuffered = True
If ImageAnimator.CanAnimate(AnimatedImage) Then
ImageAnimator.Animate(AnimatedImage, New EventHandler(AddressOf Form1_Resize))
Else
MessageBox.Show("Exit Application....Bitmap used is not Animated", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information)
Application.Exit()
End If
End Sub
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
ImageAnimator.UpdateFrames(AnimatedImage)
Dim m_rect As Rectangle = Me.ClientRectangle
e.Graphics.DrawImage(AnimatedImage, m_rect)
End Sub
Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
Me.Invalidate()
End Sub
End Class