Overriding WndProc اعتراض رسائل النظام - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : Overriding WndProc اعتراض رسائل النظام (/showthread.php?tid=4722) |
Overriding WndProc اعتراض رسائل النظام - RaggiTech - 01-10-12 كاتب الموضوع : samerselo
يرسل نظام التشغيل – الويندوز – جميع أنواع الرسائل للتطبيقات والتي تخبرها عن التغييرات في بيئة النوافذ. وهذه الرسائل تخبر النموذج بالقيام بعدة أشياء كإعادة الرسم، النقل، إعادة التحجيم، الإخفاء، التصغير، والإغلاق بالإضافة إلى الاستجابة للتغييرات في بيئة النوافذ أو القيام بأي شئ آخر متعلق بالنوافذ. ويكون لجميع تطبيقات النوافذ إجراء يتم إطلاقه للاستجابة لتلك الرسائل ويدعى هذا الإجراء في العادة WindowProc ويعالج فيجول بايزيك دوت نيت هذه الرسائل في إجراء يدعى WndProc الذي يمكنك تجاوزه لعمل أشياء مخصصة عند استقبال برنامجك لرسائل معينة. فمثلا الكود التالي يظهر كيف يضمن البرنامج إبقاء النافذة لنفس نسب قياسات الواجهة بحيث نقوم بتجاوز الإجراء WndProc الخاص بالنموذج والبحث عن الرسالة WM_SIZING التي تستقبل محددات تتضمن الحافة التي يقوم المستخدم بجرها لتغيير حجم النموذج وتركيب من النوع Rect يعطي للنموذج مكانه وحجمه الجديدين ويبدأ الكود بتحديد التركيب Rect ثم يعلن عن إجراء تجاوز للإجراء WndProc والذي يحدد بعض الثوابت والمتغيرات الساكنة التي تحمل القيم الأساسية للنموذج ثم يحدد الإجراء WndProc نوع الرسالة التي يقوم بمعالجتها فإن كانت WM_SIZING تستخدم الوظيفة PtrToStructure لنسخ m.LParam إلى التركيب Rect الذي يتم استخدامه لحساب العرض والطول الجديدين للنموذج والنسبة بينهما. فإن كانت هذه هي المرة الأولى التي يتم تنفيذ WndProc فيها فتكون بذلك قيمة المتغير الساكن fixed_aspect_ratio مساوية للصفر وعندما يرى أن قيمته مساوية للصفر يقوم بتخزين نسبة الطول والعرض الحاليين للنموذج في ذلك المتغير ثم يقوم WndProc بتحديد فيما إذا كانت النسبة الخاصة بالنموذج مختلفة عن القيمة الأصلية فإن تم تغييرها يقرر أي بعد (طول أو عرض) سيتم حفظه فإن كان المستخدم يقوم بالسحب من إحدى الزوايا يقوم الإجراء بحساب أي البعدين (طول أو عرض) هو الأكبر ثم يقوم بحساب قيمة البعد الآخر الذي يحقق نسبة الطول للعرض الخاصة بالنموذج. وإن كان المستخدم يقوم بسحب أحد الأطراف يقوم البرنامج بالحفاظ على العرض الجديد ويقوم بحساب الارتفاع المناسب حسب النسبة وكذلك إن كان يقوم بالسحب باستخدام إحدى الحافتين العلوية أو السفلية يقوم بتثبيت الارتفاع ويقوم بحساب العرض الملائم حسب النسبة ثم يقوم البرنامج بتقرير فيما إذا كان يجب عليه نقل النموذج بحيث يحرك الطرف الذي يقوم المستخدم بسحبه فمثلا إن كان المستخدم يسحب الزاوية اليسارية السفلى فالبرنامج يغير قيم اليسار والأسفل بحيث تبقى الزاوية العلوية اليمنى ثابتة ثم يقوم WndProc باستدعاء Marshal.StructureToPtr لينسخ التركيب Rect مجددا إلى m.LParam وأخيرا يقوم WndProc باستدعاء MyBase.WndProc ليترك المجال للإجراء WndProc الأب لاستخدام القيم الجديدة لتغيير حجم النموذج. واستدعاء الإجراء WndProc الخاص بالأب هام جدا فإن لم يقم البرنامح باستدعائه لكل رسالة لم يتم معالجتها بشكل كامل فإن تلك الرسالة لن يتم معالجتها وبالنتيجة فالنافذة لن تقوم بمعالجة جميع الرسائل الخاصة بها مما ينتج عن ذلك عدة مشاكل مختلفة كعدم قدرتها على إعادة رسم نفسها أو التحريك أو إظهار القوائم أو غيرها من الأمور الخاصة بالنموذج كود : Imports System.Runtime.InteropServices كود : Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) كود : msg=0x214 (WM_SIZING) hwnd=0x30b8c wparam=0x2 lparam=0x590e29c result=0x0 كود : Public Class NoCtxMnuTextBox |