مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
منتدى المنتدى
قسم لغات البرمجة
أبو هاجر الحلوة
الجزائر
2007
مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
بسم الله الرحمن الرحيم و الصلاة و السلام على سيدنا محمد و على آله و صحبه و التابعين
و بعد :
يمكن التعامل مع ملفات الفلاش ذات الإمتداد swf في البيسك بفضل الأداة ShockwaveFlash بسهولة إذا أحسن التعامل مع بعض ما تعرضه من خصائص و طرق و أحداث بل يمكن التعامل حتى مع العروض التنفيذية ذات الإمتداد exe كما سنرى ذلك لاحقا لكن قبل ذلك سنتطرق في هذا الجزء إلى بعض الأمور الأولية و الأساسية
الجزء الأول : الأساسيات
نقوم بإضافة الأداة ShockwaveFlash إلى مشروعنا كأي أداة أخرى من خلال القائمة Project/Components ثم نختار الأداة في قائمة الأدوات المعروضة ثم نضغط على Ok
تحميل و قراءة العروض :
بعد إضافة الأداة إلى النموذج يمكننا تحميل أي عرض فلاش ذي امتداد swf في الخاصية Movie و لقراءته نستعمل الطريقة Play .
مثال :
كود:
ShockwaveFlash1.Movie="C:\Test.swf"
ShockwaveFlash1.Play
التعامل مع العروض :
لاسترجاع أو تعديل لون خلفية العرض نستعمل الخاصية BackgroundColor
مثال :
كود:
ShockwaveFlash1.BackgroundColor=RGB(0,0,0)'لجعل لون الخلفية سوداء
لتكبير و تصغير العرض نستعمل الخاصية Zoom
مثال :
كود:
ShockwaveFlash1.Zoom=0 'العرض بحجمه العادي
ShockwaveFlash1.Zoom=95 'تكبير العرض
ShockwaveFlash1.Zoom=105 'تصغير العرض
ShockwaveFlash1.Zoom=100 'ليس هناك أي تعديل
لتعديل جودة العرض نستعمل الخاصية Quality2
مثال :
كود:
ShockwaveFlash1.Quality2="Low" 'جودة منخفضة
ShockwaveFlash1.Quality2="Medium" 'جودة متوسطة
ShockwaveFlash1.Quality2="High" 'جودة عالية
لضبط و استرجاع حجم العرض نستعمل الخاصية ScaleMode
مثال :
كود:
ShockwaveFlash1.ScaleMode =0 'عرض الكل دون مراعاة التناسب
ShockwaveFlash1.ScaleMode =1 'العرض في المنطقة المتاحة دون مراعاة التناسب
ShockwaveFlash1.ScaleMode =2 ' عرض الكل مع مراعاة التناسب
ShockwaveFlash1.ScaleMode =3 'عدم تحجيم العرض
لضبط و استرجاع مكان العرض نستعمل الخاصية AlignMode
مثال :
كود:
ShockwaveFlash1.AlignMode =0 'توسيط
ShockwaveFlash1.AlignMode =1 'يسار
ShockwaveFlash1.AlignMode =2 ' يمين
ShockwaveFlash1.AlignMode =4 'أعلى
ShockwaveFlash1.AlignMode =8 'أسفل
لضبط حجم و مكان العرض نستعمل الطريقة SetZoomRect و القيم محسوبة بالـ Twips
مثال :
كود:
ShockwaveFlash1.ScaleMode =0 'عرض الكل دون مراعاة التناسب
ShockwaveFlash1.SetZoomRect 0,0,3000,3000
لاسترجاع عدد الشرائح في العرض نستعمل الخاصية TotalFrames
لاسترجاع رقم الشرائحة الحالية في العرض نستعمل الخاصية CurrentFrame
لعرض شريحة معلومة نستعمل الطريقة GotoFrame
مثال :
كود:
MsgBox ShockwaveFlash1.TotalFrames 'لمعرفة عدد الشرائح في العرض
TotalFrames.GotoFrame 0 'لعرض الشريحة الأولى
MsgBox ShockwaveFlash1.CurrentFrame 'لمعرفة رقم الشرائحة الحالية
و فيما يلي بعض الطرق و الخواص و الأحداث للتحكم الجيد بالعرض:
الطريقة Stop لتوقيف العرض
الطريقة Rewind للف العرض و الرجوع به إلى الشريحة الأولى
الطريقة Back للتراجع بالعرض إلى الخلف
الطريقة Forward للتقدم بالعرض إلى الأمام
الخاصية Loop تجعل القراءة متواصلة إذا كانت قيمتها True أو غير متواصلة إذا كانت قيمتها False
الخاصية Playing لمعرفة حالة القراءة حسب القيمة المسترجعة (True or False)
الخاصية ReadyState لمعرفة حالة العرض حسب القيمة المسترجعة ( 1: الخاصية Movie="" , 3: عملية تحميل العرض جارية , 4: تم تحميل كل العرض)
الحدث OnReadyStateChange يسمح بتتبع حالة العرض من خلال البارامتر newState
الخاصية PercentLoaded لمعرفة النسبة المئوية المحملة من العرض
تم الجزء الأول بحمد الله و يليه الجزء الثاني نتطرق فيه إنشاء الله لكيفية التحكم بالكائنات التي يحويها العرض من خلال الفجوال بيسك.
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
مشكور أخى العزيز وبارك الله فيك
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
مشكورين على التواصل
آسف على التأخير في نشر الجزء الثاني , إنشاء الله سيتم إكمال المذكرة في أقرب أجل
إلى الملتقى.
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
:) ..
هذا المجال يهمني كثيرا ..
تعلمت الدمج بينهما منذ زمن ..
لكن قعدنا أنا وساموجي .. وسوينا أفكار رهيبة ..
هو صاحب اللب وأنا ساعدته :) ..
سترى النتائج في لعبة أسد الفلوجة قريبا :):)..
لو تكتب عن طريقة تبادل الأوامر بينهما أكون شاكر لك ..
صحيح أنني أعرف طريقة لكنها ركيكة ..
مثال لما أطلب :
عند الضغط على (Button1) الفلاش تظهر (MsgBox) فيها ("Pressed") ـ
وفقك الله
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
فعلا لقد اطلعت على أمثلة الأخ ساموجي و هي فعلا رائعة أرجو أن تجد فيما يلي بعض الفائدة
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
الجزء الثاني: التحكم بالكائنات التي يحويها العرض من خلال الفجوال بيسك
لتغيير محتوى كائن معين
نستعمل الطريقة SetVariable
لاسترجاع محتوى كائن معين
نستعمل الطريقة GetVariable
أمثلة
: على فرض أن العرض يحتوي على مربع نص Text
لتغيير محتوى مربع نص
كود:
ShockwaveFlash1.SetVariable "Text","Hello world" 'Text
لاسترجاع محتوى مربع نص
كود:
MsgBox ShockwaveFlash1.GetVariable("Text") 'Text
فائدة :
لاسترجاع نسخة الفلاش نستعمل الطريقة
GetVariable مع مع الثابت "$version"
مثال
كود:
MsgBox ShockwaveFlash1.GetVariable("$version")
القيمة المسترجعة تكون من الشكل
WIN x,x,0 و هي على الترتيب نظام التشغيل المستعمل , رقم النسخة الأكبر, رقم النسخة الأصغر.
لتغيير خاصية معينة لكائن ما في العرض نستعمل الطريقة TSetProperty
مثال : لإخفاء الكائن Object
لإخفاء الكائن
كود:
ShockwaveFlash1.TSetProperty "Object ","7","0" 'Object
حيث
Object اسم الكائن , "7" رقم الخاصية Visible , ثم 0 قيمة الخاصية
فيما يلي أرقام بعض الخصائص :
كود:
0 :Left (Pixels)
1 : Top (Pixels)
6 : transparency(%)
7 : Visible(0 / 1)
8 : Width(Pixels)
9 : Height (en Pixels)
10:Rotation (degree)
13:Name
19:Quality(LOW,MEDIUM,HIGH)
للتنبيه : رغم أننا نستعمل أرقام للتعامل مع هذه الخصائص لكن ينبغي أن نستعملها كثوابت نصية
(String) كما هو مستعمل في المثال أعلاه.
لاسترجاع قيمة خاصية معينة لكائن ما في العرض نستعمل الطريقة TGetProperty
مثال :
لاسترجاع قيمة الخاصية 7 للكائن
كود:
ShockwaveFlash1.TGetProperty "Object ","7" 'Object
الحدث
FSCommand يمكننا من معرفة الأوامر المرسلة إلى العرض و البارامترات الخاصة بهذه الأوامر بواسطة المتغيرتين command و args
مثال : إذا كان العرض ملء الشاشة و وضعنا الأمر التالي في الحدث
FSCommand
كود:
MsgBox command & VbCrlf & args
فإءن النتيجة تكون من الشكل
fullscreen
true
ملاحظات :
لم أتمكن من تجربة الطريقتين
TSetProperty و TGetProperty و إنما نقلتهما هنا كما و جدتهما.
تم الجزء الثاني بحمد الله ويليه الجزء الثالث نتطرق فيه لبعض المسائل المتقدمة في برجمة الأداة ShockwaveFlash إنشاء الله
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
اقتباس:
مثال : إذا كان العرض ملء الشاشة و وضعنا الأمر التالي في الحدث
ليس جيداً ..
لا فرق بينها وبين إعطاء قيمة لمتغير ما ..
يبدوا أنني سأضل على طريقة ساموجي :) ..
على كل حال .. الموضوع سيفيد الكثيرين :):) ..
شكرا لك ..
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
أكيدأن إستعمال MsgBox في الحدث FSCommand غير ذي فائدة و لكنه مجرد مثال لإظهار طريقة اعتراض الأوامر المرسلة للأداة
ممكن أن تستعمل Select case و تعالج الثوابت المرسلة لتحدث تفاعلا بين البرنامج و العرض حسب الأوامر التي قمت بأدراجها بواسطة الفلاش
إنشاء الله يكون الجزء الثالث أكثر نفعا من هذا الجزء
و إنشاء الله تكون الفائدة أعم و أحسن عندما خروج لعبة أسد الفلوجة
بالتوفيق بعون الله
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
ممكن المذكرة دى فى كتاب بى دى اف ؟
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
اقتباس:
ممكن أن تستعمل Select case و تعالج الثوابت المرسلة لتحدث تفاعلا بين البرنامج و العرض حسب الأوامر التي قمت بأدراجها بواسطة الفلاش
طيب أنا أريد أن أعرف وبالضبط .. طريقة تبادل إستدعاء الدوال!
يعني لما أضغط على زر معين بالفلاش .. يستدعي الدالة (show_the_result) والموجودة بأكواد الفيجوال بيسك ـ
أدري إن الأمر معقد .. لكن هذا ما نريده بالضبط!
اقتباس:
إنشاء الله يكون الجزء الثالث أكثر نفعا من هذا الجزء
إن شاء الله ..
أدري أن أسئلتي محيرة لكن هذا طبعي
:):):)
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
بنفس الطريقة التي تستعمل بها MsgBox و التي ما هي إلا دالة
مثال نفرض أنك قمت بإدراج الأمر التالي للزر في العرض عن طريق الفلاش
كود:
on (release) {
fscommand ("show_the_result");
}
في الفجوال بيسك و في الحدث FSCommand للأداة تستطيع أن تدرج الأمر Select Case كما يلي
كود:
Select Case command
Case "show_the_result"
show_the_result
Case .........................
.
.
.
.
End Select
هذا طبعا مجرد مثال و إذا كنت متمكنا من الـ Action Script فأظن أنك تستطيع فعل ما هو أحسن أنا صراحة ضعيف فيها و ليس لي تجربة كبيرة معها و لا أستعمل الفلا ش في البيسك إلا لتحسين الواجهة فقط و حتى هذا التفاعل الذي نتكلم عنه أعتقد أن إستعماله سيكون محدودا مثلا لإظهار نافذة About... أو أشياء من هذا القبيل يعني أمور جمالية
فيما يخص اللعبة التي تكلمت عنها لما لا تقوم بإنجازها كليا بالفلاش و تستغني عن البيسك أو تنجز كل الأوامر بالـ Action Script و تستعمل البيسك كحاو فقط للعرض للأسف معلوماتي عن مرادك بالضبط تكاد تكون معدومة ربما إذا توفرت لدي عناصر أكثر أستطيع مساعدتك
بالتوفيق إنشاء الله
1 مرفق
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
الجزء الثالث و الأخير : بعض الطرق و الفوائد المتعلقة بالأداة Shockwave
أولا : إسترجاع مقبض نافذة الأداة :
لعلك لاحظت أن الأداة لا توفر أي خاصية لإسترجاع مقبض النافذة (hwnd) الخاص بها مما يجعل التعامل معها بواسطة واجهة برمجة التطبيقات (api) صعبا إن لم يكن مستحيلا لهذا نلجأ إستعمال بعض الحيل لاسترجاع هذا المقبض (hwnd) وهذه حسب رأيي أحد أحسن الطرق و أسهلها :
1 - قم بإضافة PictureBox إلى النافذة ثم قم بإدراج أداة Shockwave داخل الـ PictureBox السابقة
2 - ثم أضف الكود التالي
كود:
Private Const GW_CHILD = 5
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Sub Form_Load()
Dim hFlh as Long
hFlh = GetWindow(Pic.hwnd, GW_CHILD)
End Sub
بهذا نكون قد استرجعنا مقبض الأداة في المتغيرة hFlh
ربما تتساءل عن الفائدة من استرجاع هذا المقبض و الجواب هناك فوائد كثيرة هذه بعضها :
1 - 1 - التخلص من القائمة المنبثقة للأداة و تعويضها بقائمة منبثقة من تصميمنا :
على إفتراض أننا نريد تعويض قائمة الفلاش المنبثقة بالقائمة mnuPopUp التي قمنا بتميمها نتبع الخطوات التالية :
نقوم أولا باسترجاع مقبض الأداة ثم نقوم باستعمال تقنية الـ Sub classing كما يلي :
نقوم بإضافة وحدة Module نمطية و ندرج فيها الكود التالي :
كود:
Option Explicit
Public OrgProc As Long
Private Const WM_RBUTTONDOWN = &H204
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_RBUTTONDOWN Then
frmMain.PopupMenu frmMain.mnuPopUp
SendKeys "{ESC}"
End If
WindowProc = CallWindowProc(OrgProc, hwnd, Msg, wParam, lParam)
End Function
في الحدث Form_Load نظيف السطر التالي :
كود:
OrgProc = SetWindowLong(hFlh, GWL_WNDPROC, AddressOf WindowProc)
و في الحدث Form_QueryUnload نظيف الكود التالي :
كود:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
SetWindowLong hFlh, GWL_WNDPROC, OrgProc
End Sub
1 - 2 - حفظ أي شريحة في العرض في شكل Bitmap
نقوم باسترجاع مقبض الأداة كما سبق ثم نقوم باستدعاء الإجراء التالي :
كود:
Private Sub SaveFrame()
Dim hdcf As Long
Dim hr As Long
Picture1.AutoRedraw = True
hdcf = GetWindowDC(hFlh)
hr = BitBlt(Pic.hDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, hdcf, 0, 0, vbSrcCopy)
SavePicture Pic.Image, "C:\Test.bmp"
Pic.AutoRedraw = False
Pic.Cls
End Sub
لا تنسى أن hFlh هو مقبض الأداة Shockwave الذي قمنا باسترجاعه لذا إذا أردت أن تستفيد منه هنا فيجب أن نصرح به في قسم التصريحات و ليس داخل الحدث Form_Loadكما فعلنا سابقا.
كما لا تنسى تغيير المسار "C:\Test.bmp" بالمسار الذي يناسبك.
ثانيا : استخراج ملفات الـ swf من العروض التنفيذية ( ذات الامتداد EXE )
المبدأ بسيط يقوم على الافتراض التالي :
Exe File = Flash Player + Swf File
طبعا هذا الافتراض غير دقيق تماما لكنه الإجراءات التي تعتمد عليه ستكون ناجحة بنسبة عالية ربما 80% أو 90% الطريقة تتمثل في البحث عن موقع آخر ثابت "swf" في الملف ثم اقتطاع الجزء الممتد من هذا الموقع و حتى آخر الملف .
الإجراء التالي مثال على ذلك :
كود:
Public Function ExtractSwf(szFile As String) As Boolean
Dim NumFile As Integer
Dim Buffer As String
Dim SwfData As String
Dim StarPos As Long
NumFile = FreeFile
StarPos = 1
Open szFile For Binary As #NumFile
Buffer = String(LOF(NumFile), 0)
Get #NumFile, StarPos, Buffer
Close #NumFile
Do While StarPos > 0
DoEvents
StarPos = InStr(StarPos, UCase(Buffer), "FWS")
If StarPos > 0 Then
SwfData = Right(Buffer, Len(Buffer) - StarPos + 1)
StarPos = StarPos + 3
End If
Loop
If Len(SwfData) = 0 Then
ExtractSwf = False
Else
If Dir(App.Path & "\Temp.swf") <> "" Then Kill App.Path & "\Temp.swf"
NumFile = FreeFile
StarPos = 1
Open App.Path & "\Temp.swf" For Binary As #NumFile
Put #NumFile, StarPos, SwfData
Close #NumFile
ExtractSwf = True
End If
End Function
أنظر المرفقات
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك
بعد اعتماد المشاركة ظهر لي أن بعض أجزاء الكود غير منسقة بصورة جيدة لهذا قم بنسخها في نافذة محرر أكواد البيسك لتتمكن من قراءتها بصورة أوضح
فييما يخص الملف المرفق فهو عبارة عن مشروع يبين كيفية تعويض القائمة المنبثقة للفلاش بقائمة مخصصة كما هو مشروح في المذكرة
سأقوم إنشاء الله بإعادة تحرير هذه المذكرة و إدراجها هنا في شكل ملف Pdf كما هو مراد بعض الإخوة
إلى الملتقى
رد: مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك