السؤال الأول للعضو ( الذيب ) :
عذرا ً لم أستطع الشرح بالصور ...
\\\
قبل أن أبدأ بالدرس أحب التنويه إلى أن المثال الناتج لدينا هنا إنما هو بذرة أو أساس لأي برنامج Screen Saver وعليه يمكن التعديل عليه
ليصبح أي شكل تريد .. فعلى بركة الله نبدأ
أولاً سنفتح مشروع جديد من نوع Standard EXE ولن يحتاج برنامجنا لأي شي سوى شاشة Form واحدة وهي الافتراضية
فلنقم الآن بتبديل اسمها Name إلى frmMain لا تسألني عن سبب التغيير حيث أنني سأقوم إن شاء الله بكتابة مقال مفصل عن سبب
هذا التبديل والذي لن يؤثر مباشرة على عمل البرنامج لكنه سيؤثر لاحقاً فيه
والآن لنبدل الخصائص التالية في هذا الفورم
WindowState بدلها إلى 2 أي أن النافذة ستغطي كل شاشة الكمبيوتر
BackColor غيرها إلى &H00000000& أي اللون الأسود
BorderStyle غيرها إلى 0 أي عدم وجود شريط عنوان في النافذة
انتبه : فإذا قمت بتشغيل البرنامج الآن فلن تستطيع إيقافه إلا بالضغط على زري Ctrl+Break
والآن وبعد الانتهاء من تصميم واجهة البرنامج فلندخل في التفاصيل البرمجية
من المعروف أنك إذا ضغطت أي زر على لوحة المفاتيح أثناء عمل الـ Screen Saver فإن البرنامج سيتوقف وعليه يمكن أن نكتب المود التالي
كود:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
End
End Sub
والآن قد يسأل سائل لماذا كتبنا هذا الكود في KeyDown ولم نكتبه في KeyPress أو KeyUp ؟ والجواب أنني بحاجة لإيقاف البرنامج لحظة
ضغط أي زر على لوحة المفاتيح وليس بعد رفع يدي عن المفتاح ولذلك لم أستعمل KeyUp .. وأيضاً لم أستعمل KeyPress لأن هذا الحدث لا
يتم تنفيذه عند الضغط على بعض الأزرار مثل الأسهم
نأتي الآن إلى الفأرة .. فالبرنامج يجب أن يتوقف عند ضغط أي زر من أزرار الفأرة وعليه يمكن أن نكتب الكود التالي :
كود:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
End
End Sub
ولنفس السبب السابق لم يوضع الكود في MouseUp أو Click
والآن نأتي إلى الجزء الدسم في مشروعنا ألا وهو حركة الفارة .. للوهلة الأولى الموضوع بسيط بحيث يمكن استخدام الكود التالي :
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
End
End Sub
لكن إن قمت بتنفيذ هذا البرنامج فسترى أن البرنامج بمجرد تشغيله بتوقف أي يتم تنفيذ الأمر End .. لماذا لأن البرنامج سيستشعر بأن
الفأرة قد تحركت من مكانها نظراً لتغير حجم النافذة frmMain فما الحل ؟
الحل يكمن في تعريف ثلاثة متحولات :
الأول ولنسميه MouseState وهو يجيب على السؤال التالي : هل تم تنفيذ حدث MouseMove من قبل فإن كان الجواب نعم لكانت قيمة
المتحول True وإلا فهي False
الثاني والثالث ولنسميهما MouseX و MouseY وهما يمثلان موقع المشيرة عند أول تنفيذ للحدث MouseMove أي عندما تكون قيمة
المتحول MouseState مساوية لـ False
ويتم تعريف المتحولات في قسم General كما يلي :
Dim MouseState As Boolean
Dim MouseX As Single
Dim MouseY As Single
عندها يتم استبدال الكود الموجود في الحدث MouseMove إلى التالي :
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MouseState Then
If MouseX <> X Or MouseY <> Y Then
End
End If
Else
MouseX = X
MouseY = Y
MouseState = True
End If
End Sub
حيث أننا نختبر قيمة المتحول MouseState فإن كانت False أي أن هذا الحدث ينفذ للمرة الأولى عندها سيتم تحميل قيمة المتحولين
MouseX و MouseY بقيم X و Y الحالية أي يتم تعيين موقع المشيرة لحظة تنفيذ البرنامج
وإن كانت قيمة المتحول MouseState مساوية لـ True أي أن هذا الحدث تم تنفيذه من قبل وعليه سيتم مقارنة موقع الفأرة الحالي مع
موقعها عند تنفيذ هذا الحدث أول مرة والمطابق لموقعها عند أول تنفيذ للبرنامج فإن لم تتطابق فعندها يتم إيقاف البرنامج
الآن يمكننا القول أن 80% من البرنامج قد تم تنفيذه لكن يبقى لدينا مشكلة واحدة وهي مشيرة الفأرة .. فلو رأيت كل برامج الـ Screen
Saver لعلمت أن المشيرة يجب أن تكون مخفية .. أي لا وجود لهذا السهم وعليه يتوجب إخفاؤها
يتم إخفاء وإظهار مشيرة الفأرة بالاعتماد على أحد دوال API (وهي مجموعة من الأوامر مبنية ضمن Windows وليست ضمن VB ولكن
يمكن استدعاؤها والعمل بها) وهو إجراء بسيط جداً بحيث يتم الإعلان عنه في قسم General كما يلي :
كود:
Private Declare Function ShowCursor Lib "user32" (ByVal bShow
As Long) As Long Form_Load
كود:
Dim Result As Long
Result = ShowCursor(0)
وحتى تظهر مرة أخرى يجب استبدال الأمر End في جميع الأحداث بالكود التالي :
كود:
Dim Result As Long
Result = ShowCursor(-1)
End
ولكننا هنا لم نختبر نجاح العملية من فشلها حيث أن المشيرة تبقى مخفية طالما قيمة Result أصغر من الصفر وتبقى ظاهرة طالما قيمة
Result أكبر أو تساوي الصفر وعليه يجب يجب استبدال الكودين السابقين بما يلي :
كود:
Dim Result As Long
Do Until Result < 0
Result = ShowCursor(0)
Loop
و
كود:
Dim Result As Long
Do
Result = ShowCursor(-1)
Loop While Result < 0
End
وعليه تكون الشيفرة البرمجية لكامل البرنامج كما يلي :
كود:
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
Dim MouseState As Boolean
Dim MouseX As Single
Dim MouseY As Single
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim Result As Long
Do
Result = ShowCursor(-1)
Loop While Result < 0
End
End Sub
Private Sub Form_Load()
Dim Result As Long
Do Until Result < 0
Result = ShowCursor(0)
Loop
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Result As Long
Do
Result = ShowCursor(-1)
Loop While Result < 0
End
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MouseState = False Then
MouseX = X
MouseY = Y
MouseState = True
Else
If MouseX <> X Or MouseY <> Y Then
Dim Result As Long
Do
Result = ShowCursor(-1)
Loop While Result < 0
End
End If
End If
End Sub
انتهى
\\\