عند استخدام أزرار مثلاً من فلاش داخل الفيجوال بيزيك تظهر قائمة منسدلة
لقد وجدت هذا المثال في التحكم في هذه القائمة المنسدلة ولكني لا أفهم معظم أجزائه خاصة المديولات
أرجو توضيح كيف يمكن تغيير عناصر القائمة المنسدلة أو إلغائها تماماً في هذا المثال.
عند استخدام أزرار مثلاً من فلاش داخل الفيجوال بيزيك تظهر قائمة منسدلة
لقد وجدت هذا المثال في التحكم في هذه القائمة المنسدلة ولكني لا أفهم معظم أجزائه خاصة المديولات
أرجو توضيح كيف يمكن تغيير عناصر القائمة المنسدلة أو إلغائها تماماً في هذا المثال.
شكرا كثيرا لك يا أخي..
وكهدية لك سأقوم بشرح هذا الكود لك..
هذا المبرمج ذو الاسم العجيب Ravindra Deuskar .. كان كل ما يشغل باله هو الحصول علي مقبض أداة ال ActiveX التي قمت بوضعها علي الفورم أثناء وقت التشغيل..وهذا هو الشيء الوحيد الذي كنت أبحث عنه وهو كيف يمكن الحصول علي مقبض اداة ال ActiveX؟
وبالحصول علي مقبض أداة ال ActiveX نستطيع أن نقوم بعمل Hook أو إلقاء خطاف للرسائل التي تصل إلي تلك ال ActiveX ومنها الرسالة WM_RBUTTONDOWN او قيمتها الحقيقية بالهكس H204&
وعند وصول تلك الرسالة سنقوم بإعتراضها كما أعترضها المبرمج ونكون بهذا قد منعنا وصولها إلي أداة ال ActiveX
If uMsg = WM_RBUTTONDOWN Then
Exit Function
المهم سأبدا بشرح الكود من البداية وسأفترض أنك ملم بموضوع كيفية إلقاء خطاف وإرساله إلي تصنيف فرعي SubClass.
وإذا لم تكن سمعت عن هذا الأمر يمكنك مراجعة هذا الدرس الثالث من هذا الموضوع
أو وصلة التحميل للدرس مباشرة
ولن يأخذ منك سوي 5 دقائق . ثم أقرأ الشرح التالي والذي لن تحتاجه بعد مراجعتك للموضوع السابق.
======================================================
في البداية استخدم المبرمج الدالة EnumChildWindows والتي لم أكن أعرفها من قبل والتي تتيح لك معرفة جميع المقابض handles للنوافذ الفرعية تحت نافذة معينة رئيسية .
وسيتم التمرير لتلك الدالة في المعامل الأول المقبض الرئيسي للنافذة التي نريد معرفة جميع المقابض تحتها, وسنمرر في تلك الحالة مقبض الفورم Form.hwnd..وتحت نافذة الفورم سنحاول أن نعرف مقبض أداة ال ActiveX وسيلي شرح ذلك بعدين..
المهم الأن المعامل الثاني للدالة EnumChildWindows وهو يشير إلي تصنيف فرعي يتم إستقبال الردود CallBacks -التي تأتي من النظام إلي برنامج - عليه.
وبواسطة الدالة Address of نستطيع إإستقبال الردود التي تخص الدالة EnumChildWindows وقد وضع المبرمج اسم التصنيف الذي سيستقبل تلك الردود بــ EnumChildProc
أما بالنسبة للمعامل الثالث فليس له أي فائدة حيث أننا لن نرسل عبره أي قيمة للتصنيف الفرعي EnumChildProc
خليك فاكر الآن أن الفكرة كلها في أننا نستقبل مقابض النوافذ الفرعية -ومنها مقبض نافذة أداة ال ActiveX- من النافذة الرئيسية Form.
الآن نحن داخل دالة التصنيف الفرعي EnumChildProc وهو محدد لمعاملين
lhWnd وهو مقبض النافذة التي سنستقبلها.
lParam معلومات إضافية للمقبض وستظل قيمته بصفر طوال التنفيذ لأننا لن نستقبل أي معلومات غير قيمة المقبض في المعامل الأول lhWnd.
الآن أصبح عندنا جميع المقابض التابعة للنافذة الرئيسية Form.hwnd , ونريد أن نستخلص من تلك المقابض مقبض أداة ال ActiveX فكيف بربك سنستطيع استخلاص قيمة عددية long تتغير كلما تغير مقبض النافذة الرئيسية Form.hwnd
فتفتق ذهن هذا المبرمج - عجيب الاسم - إلي أنه يستطيع أن يأتي باسم فئة كل نافذة فرعية بدلالة مقبضها عن طريق استخدام دالة GetClassName
فمثلا اسم فئة الزرار CommandButton هو ThunderCommandButton, وتستطيع الحصول علي هذا الأسم إذا قمت بتمرر مقبض الزرار إلي دالة GetClassName.
واسم فئة أداة ال ActiveX هو ATL:036CEB60 , وهذا الأسم ثابت ثابت لا يتغير إلا بتغيير أداة ال Active X نفسها.
فمثلا الأداة التي عندي اسم الفئة لها هو ATL:036CEB60
ولكن توجد أدوات ActiveX أخر يكون اسم الفئة بها هو MacromediaFlashPlayerActiveX
وبالتالي فقد احتاط المبرمج ووضع كلا الأسمين..
المهم الأن هو دالة GetClassName نفسها فتلك الدالة لها ثلاث معاملات ..
المعامل الأول : ونحدد فيه المقبض الذي نريد معرفة اسم الفئة له. وفي تلك الحالة سنمرر له جميع المقابض التي نحصل عليها من دالة EnumChildWindows حتي نصل إلي مقبض أداة ال ActiveX .
المعامل الثاني: عبارة عن مخزن Buffer يتم حجز حجمه مقدما وقد حجز له المبرمج حجم مناسب وهو 255 حرف ونستقبل في هذا المخزن اسم الفئة التي قمنا بتمرير مقبضها
وقد وضع المبرمج المتغير WinClassBuf ليستقبل اسم الفئة.
المعامل الثالث: حجم البيانات التر نريد نقلها إلي المخزن Buffer.
ولاحظ أن حجم المخزن WinClassBuf هو 255 وبالتالي إذا أستقبلنا اسم فئة وليكن ThunderCommandButton فحجم اسم الفئة أصغر بكثير من حجم المخزن فبالتالي سيكون هناك قيم null ببقية حجم المخزن بعد اسم الفئة .. وبالتالي لابد من وضع كود لحذف قيم ال Null السابقة إن وجدت وبالتالي فقد وضع المبرمج كود لذلك..
If (InStr(WinClassBuf, Chr(0)) > 0) Then
WinClass = Left(WinClassBuf, InStr(WinClassBuf, Chr(0)) - 1)
End If
والآن المتغير WinClassBuf سيحمل كل مرة اسم الفئة Class Name لكل النوافذ الفرعية الموجودة داخل الForm ومن تلك النوافذ سيكون اسم الفئة لأداة ال ActiveX وهو كما اتفقنا إما ATL:036CEB60أو MacromediaFlashPlayerActiveX وقد وضع المبرمج شرط إذا وجد ذلك الأسم لفئة أداة ال ActiveX فيقوم بتخزين مقبض تلك الأداة في المتغير FHW
FHW = lhWnd
ثم إيقاف الردود CallBacks التي نستقبلها من النظام والتي تحمل قيم المقابض للنوافذ الفرعية
لأننا قد حصلنا علي مقبض أداة ال ActiveX الذي نريده وبالتالي فلا داعي لأستمرار استقبال المقابض الأخري .
ولإيقاف تلك الردود نضع قيمة دالة التصنيف الفرعي بصفر أو False كما فعل المبرمج
EnumChildProc = False
وفي تلك الحالة قمنا بإيقاف إستقبال التصنيف الفرعي EnumChildProc لأي ردود.
بينما إذا لم نستقبل مقبض نافذة أداة ال ActiveX فنستمر في استقبال الردود لإستقبال باقي المقابض ثم إتيان اسم الفئة لكل منها ومقارنتها باسم الفئتين لأداة ال ActiveX
ولإستمرار استقبال مقابض النوافذ الفرعية نضع دالة التصنيف الفرعي بواحد أو True كما فعل المبرمج
EnumChildProc = True
=======================================================
خلاص ..... أخيرا..... وقد حصلنا علي مقبض أداة ال ActiveX والذي كان سيجعلني أنتحر قريبا لأنه كانت العقبة أمامي .. فلم أستطع الحصول عليه أبدا..
نستطيع بكل بساطة أن نقوم بعمل Hook علي هذا المقبض .. بمعني أننا سنتجسس علي الرسائل التي تصل لبرنامجنا وبالأخص الرسائل التي تذهب إلي مقبض أداة ال ActiveX ومنها رسالة الزر الأيمن للماوس والتي سنمنع وصولها أو نستطيع تنفيذ أمر أخر تماما عند وصولها ..
الآن ومن هنا أصبح الموضوع يدخل ضمن نطاق إلقاء خطاف وإستقبال الردود علي تصنيف فرعي والذي تستطيع فهمه تماما, إذا قمت بمراجعة الموضوع الذي سبق وأن طلبت منك مراجعته.
=======================================================
وشكرا مرة أخري علي هذا المشروع ويبدو أنه مرفق حديثا بموقع Pscode.com ,, حيث أنني بحثت في هذا الموقع كثيرا لكن من
زماااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااان
ومعذرة لهذا التكرار ...أصله من زمان قوي ..
ولا تنسي أن تصوت -أقصد vote وليس الصويت طبعا - للمبرمج صاحب هذا المشروع ..
تم تعديل هذه المشاركة بواسطة Pharaonic_Guy في 18 يوليو 2005 في 22:19
شكراً جزيلاً أخي على هذا الجهد العظيم
ولكن هلا ساعدتني بوضع مثال فيه لا تظهر أي قائمة عند الضغط الأيمن للماوس؟؟؟؟؟؟
قم بتحويل هذا الكود داخل Module2
If uMsg = WM_RBUTTONDOWN Then
Form1.Caption = "Right Button Down"
Form1.PopupMenu Form1.mnuPop
Exit Function
إلي
If uMsg = WM_RBUTTONDOWN Then
Form1.Caption = "Right Button Down"
Exit Function
وأرجو منك أن تحاول فهم المشروع .. حتي تستطيع التعامل معه بكل سهوله..
أخي الكريم
أشكر لرحب صدرك وصبرك
أظن كلمة شكراً قليلة عليك فأنت ساعدتني جدددددددددددددددداااااااااااااًًًًًًًًً
أدعو لك بالجنة
هذا الموضوع مغلق.