المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : مذكرة في التعامل مع ملفات الفلاش في بيئة الفجوال بيسك



أبو هاجر الحلوة
26-02-2007, 10:48 PM
منتدى المنتدى
قسم لغات البرمجة
أبو هاجر الحلوة
الجزائر
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 لمعرفة النسبة المئوية المحملة من العرض
تم الجزء الأول بحمد الله و يليه الجزء الثاني نتطرق فيه إنشاء الله لكيفية التحكم بالكائنات التي يحويها العرض من خلال الفجوال بيسك.

amr161978
27-02-2007, 10:10 AM
مشكور أخى العزيز
تحياتى

احمد منيب
05-03-2007, 11:15 AM
مشكور أخى العزيز وبارك الله فيك

أبو هاجر الحلوة
06-03-2007, 02:05 PM
مشكورين على التواصل
آسف على التأخير في نشر الجزء الثاني , إنشاء الله سيتم إكمال المذكرة في أقرب أجل
إلى الملتقى.

عمر
20-03-2007, 10:06 AM
:) ..

هذا المجال يهمني كثيرا ..
تعلمت الدمج بينهما منذ زمن ..

لكن قعدنا أنا وساموجي .. وسوينا أفكار رهيبة ..
هو صاحب اللب وأنا ساعدته :) ..
سترى النتائج في لعبة أسد الفلوجة قريبا :):)..

لو تكتب عن طريقة تبادل الأوامر بينهما أكون شاكر لك ..
صحيح أنني أعرف طريقة لكنها ركيكة ..
مثال لما أطلب :
عند الضغط على (Button1) الفلاش تظهر (MsgBox) فيها ("Pressed") ـ

وفقك الله

أبو هاجر الحلوة
20-03-2007, 12:39 PM
فعلا لقد اطلعت على أمثلة الأخ ساموجي و هي فعلا رائعة أرجو أن تجد فيما يلي بعض الفائدة

أبو هاجر الحلوة
20-03-2007, 12:58 PM
الجزء الثاني: التحكم بالكائنات التي يحويها العرض من خلال الفجوال بيسك




لتغيير محتوى كائن معين نستعمل الطريقة 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 إنشاء الله

عمر
20-03-2007, 01:33 PM
مثال : إذا كان العرض ملء الشاشة و وضعنا الأمر التالي في الحدث

ليس جيداً ..
لا فرق بينها وبين إعطاء قيمة لمتغير ما ..

يبدوا أنني سأضل على طريقة ساموجي :) ..
على كل حال .. الموضوع سيفيد الكثيرين :):) ..
شكرا لك ..

أبو هاجر الحلوة
20-03-2007, 02:21 PM
أكيدأن إستعمال MsgBox في الحدث FSCommand غير ذي فائدة و لكنه مجرد مثال لإظهار طريقة اعتراض الأوامر المرسلة للأداة
ممكن أن تستعمل Select case و تعالج الثوابت المرسلة لتحدث تفاعلا بين البرنامج و العرض حسب الأوامر التي قمت بأدراجها بواسطة الفلاش
إنشاء الله يكون الجزء الثالث أكثر نفعا من هذا الجزء
و إنشاء الله تكون الفائدة أعم و أحسن عندما خروج لعبة أسد الفلوجة
بالتوفيق بعون الله

jack r3d
25-03-2007, 02:56 PM
ممكن المذكرة دى فى كتاب بى دى اف ؟

عمر
26-03-2007, 12:49 AM
ممكن أن تستعمل Select case و تعالج الثوابت المرسلة لتحدث تفاعلا بين البرنامج و العرض حسب الأوامر التي قمت بأدراجها بواسطة الفلاشطيب أنا أريد أن أعرف وبالضبط .. طريقة تبادل إستدعاء الدوال!
يعني لما أضغط على زر معين بالفلاش .. يستدعي الدالة (show_the_result) والموجودة بأكواد الفيجوال بيسك ـ
أدري إن الأمر معقد .. لكن هذا ما نريده بالضبط!


إنشاء الله يكون الجزء الثالث أكثر نفعا من هذا الجزءإن شاء الله ..


أدري أن أسئلتي محيرة لكن هذا طبعي
:):):)

أبو هاجر الحلوة
26-03-2007, 04:12 AM
بنفس الطريقة التي تستعمل بها 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 و تستعمل البيسك كحاو فقط للعرض للأسف معلوماتي عن مرادك بالضبط تكاد تكون معدومة ربما إذا توفرت لدي عناصر أكثر أستطيع مساعدتك
بالتوفيق إنشاء الله

أبو هاجر الحلوة
26-04-2007, 09:21 PM
الجزء الثالث و الأخير : بعض الطرق و الفوائد المتعلقة بالأداة 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

أنظر المرفقات

أبو هاجر الحلوة
26-04-2007, 09:33 PM
بعد اعتماد المشاركة ظهر لي أن بعض أجزاء الكود غير منسقة بصورة جيدة لهذا قم بنسخها في نافذة محرر أكواد البيسك لتتمكن من قراءتها بصورة أوضح
فييما يخص الملف المرفق فهو عبارة عن مشروع يبين كيفية تعويض القائمة المنبثقة للفلاش بقائمة مخصصة كما هو مشروح في المذكرة

سأقوم إنشاء الله بإعادة تحرير هذه المذكرة و إدراجها هنا في شكل ملف Pdf كما هو مراد بعض الإخوة
إلى الملتقى

ْ مي ْ
28-04-2007, 09:14 PM
شكرا لك وبارك الله فيك