الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

وجدت مثال عن القائمة المنسدلة لكني لا أفهمه

مغلق
بدأه TreasureMaster في 18 يوليو 2005 · 4 رد · 688 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عند استخدام أزرار مثلاً من فلاش داخل الفيجوال بيزيك تظهر قائمة منسدلة

لقد وجدت هذا المثال في التحكم في هذه القائمة المنسدلة ولكني لا أفهم معظم أجزائه خاصة المديولات

أرجو توضيح كيف يمكن تغيير عناصر القائمة المنسدلة أو إلغائها تماماً في هذا المثال.

Custom_Rep101820742002.zip

#2

شكرا كثيرا لك يا أخي..

وكهدية لك سأقوم بشرح هذا الكود لك..

هذا المبرمج ذو الاسم العجيب Ravindra Deuskar .. كان كل ما يشغل باله هو الحصول علي مقبض أداة ال ActiveX التي قمت بوضعها علي الفورم أثناء وقت التشغيل..وهذا هو الشيء الوحيد الذي كنت أبحث عنه وهو كيف يمكن الحصول علي مقبض اداة ال ActiveX؟

وبالحصول علي مقبض أداة ال ActiveX نستطيع أن نقوم بعمل Hook أو إلقاء خطاف للرسائل التي تصل إلي تلك ال ActiveX ومنها الرسالة WM_RBUTTONDOWN او قيمتها الحقيقية بالهكس H204&

وعند وصول تلك الرسالة سنقوم بإعتراضها كما أعترضها المبرمج ونكون بهذا قد منعنا وصولها إلي أداة ال ActiveX

If uMsg = WM_RBUTTONDOWN Then

Exit Function

المهم سأبدا بشرح الكود من البداية وسأفترض أنك ملم بموضوع كيفية إلقاء خطاف وإرساله إلي تصنيف فرعي SubClass.

وإذا لم تكن سمعت عن هذا الأمر يمكنك مراجعة هذا الدرس الثالث من هذا الموضوع

/index.php?showtopic=59622

أو وصلة التحميل للدرس مباشرة

/index.ph...e=post&id=15933

ولن يأخذ منك سوي 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

#3

شكراً جزيلاً أخي على هذا الجهد العظيم

ولكن هلا ساعدتني بوضع مثال فيه لا تظهر أي قائمة عند الضغط الأيمن للماوس؟؟؟؟؟؟

#4

قم بتحويل هذا الكود داخل 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

وأرجو منك أن تحاول فهم المشروع .. حتي تستطيع التعامل معه بكل سهوله..

#5

أخي الكريم

أشكر لرحب صدرك وصبرك

أظن كلمة شكراً قليلة عليك فأنت ساعدتني جدددددددددددددددداااااااااااااًًًًًًًًً

أدعو لك بالجنة

هذا الموضوع مغلق.

مواضيع مشابهة