انقر واسحب نموذج دلفي بدون شريط التسمية التوضيحية

click fraud protection

الطريقة الأكثر شيوعًا لتحريك النافذة هي سحبها من شريط العنوان الخاص بها. تابع القراءة لمعرفة كيف يمكنك توفير قدرات السحب لـ دلفنماذج i بدون شريط عنوان ، بحيث يمكن للمستخدم نقل نموذج بالنقر فوق أي مكان في منطقة العميل.

على سبيل المثال ، خذ بعين الاعتبار حالة تطبيق Windows لا يحتوي على شريط عنوان ، كيف يمكننا تحريك هذه النافذة؟ في الواقع ، من الممكن إنشاء نوافذ باستخدام شريط عنوان غير قياسي وحتى نماذج غير مستطيلة. في هذه الحالة ، كيف يمكن لـ Windows معرفة مكان حدود الزوايا وزواياها؟

رسالة Windows WM_NCHitTest

ال نظام تشغيل ويندوز يعتمد بشكل كبير على معالجة الرسائل. على سبيل المثال ، عند النقر فوق نافذة أو عنصر تحكم ، يرسل Windows رسالة wm_LButtonDown ، بمعلومات إضافية حول مكان مؤشر الماوس ومفاتيح التحكم الموجودة حاليًا مضغوط. يبدوا مألوفا؟ نعم ، هذا ليس أكثر من حدث OnMouseDown في دلفي.

وبالمثل ، يرسل Windows رسالة wm_NCHitTest كلما حدث الفأرة يحدث ، أي عندما يتحرك المؤشر ، أو عندما يتم الضغط على زر الماوس أو تحريره.

كود الإدخال

إذا استطعنا جعل Windows يعتقد أن المستخدم يقوم بسحب (النقر فوق) شريط العنوان بدلاً من منطقة العميل ، فيمكن للمستخدم سحب النافذة عن طريق النقر في منطقة العميل. أسهل طريقة للقيام بذلك هي "خداع" Windows في التفكير أنك بالفعل تنقر على شريط عنوان النموذج. إليك ما عليك فعله:

instagram viewer

1. أدخل السطر التالي في قسم "الإعلانات الخاصة" في نموذجك (إعلان إجراء معالجة الرسالة):

إجراء اختبار WMNCHit (فار Msg: TWMNCHitTest) ؛ رسالة WM_NCHitTest ؛ 

2. أضف التعليمات البرمجية التالية إلى قسم "التنفيذ" لوحدة النموذج الخاص بك (حيث يكون Form1 هو اسم النموذج المفترض):

إجراء TForm1.WMNCHitTest (فار Msg: TWMNCHitTest) ؛

ابدأ

وارث;

إذا رسالة. النتيجة = htClient ثم رسالة. النتيجة: = htCaption؛

النهاية; 

يستدعي السطر الأول من التعليمات البرمجية في معالج الرسائل الأسلوب الموروث للحصول على المعالجة الافتراضية لرسالة wm_NCHitTest. يعترض الجزء If في الإجراء ويغير سلوك نافذتك. هذا ما يحدث بالفعل: عندما يرسل نظام التشغيل رسالة wm_NCHitTest إلى النافذة ، مع إحداثيات الماوس ، ترجع النافذة رمزًا يوضح الجزء الذي يحتوي على نفسه أصيب. إن المعلومات المهمة ، بالنسبة لمهمتنا ، هي في قيمة الرسائل. حقل النتيجة. عند هذه النقطة ، لدينا فرصة لتعديل نتيجة الرسالة.

هذا ما نقوم به: إذا قام المستخدم بالنقر فوق منطقة العميل الخاصة بالنموذج ، فإننا نجعل Windows يعتقد أن المستخدم قام بالنقر فوق شريط العنوان. في كائن باسكال "الكلمات": إذا كانت قيمة إرجاع الرسالة هي HTCLIENT ، فسنقوم ببساطة بتغييرها إلى HTCAPTION.

لا مزيد من الأحداث الماوس

بتغيير السلوك الافتراضي لنماذجنا ، نزيل قدرة Windows على إعلامك عندما يكون الماوس فوق منطقة العميل. أحد الآثار الجانبية لهذه الحيلة هو أن النموذج الخاص بك لم يعد يولد أحداث للماوس الرسائل.

نافذة بدون حدود

إذا كنت تريد إطارًا بلا حدود بدون عنوان مشابهًا لشريط أدوات عائم ، فعيّن تسمية توضيحية للنموذج إلى سلسلة فارغة ، وقم بتعطيل جميع BorderIcons ، واضبط BorderStyle على bsNone.

يمكن تغيير النموذج بطرق مختلفة من خلال تطبيق تعليمات برمجية مخصصة في طريقة CreateParams.

المزيد من الحيل WM_NCHitTest

إذا نظرت بعناية أكبر في رسالة wm_NCHitTest ، فسترى أن قيمة الإرجاع للدالة تشير إلى موضع النقطة الفعالة للمؤشر. هذا يمكننا من اللعب أكثر مع الرسالة لخلق نتائج غريبة.

سيمنع جزء التعليمات البرمجية التالي المستخدمين من إغلاق النماذج الخاصة بك عن طريق النقر فوق الزر إغلاق.

إذا رسالة. النتيجة = htClose ثم رسالة. النتيجة: = htNowhere؛ 

إذا كان المستخدم يحاول نقل النموذج عن طريق النقر على شريط التسمية التوضيحية والسحب ، فإن الرمز يستبدل نتيجة الرسالة بنتيجة تشير إلى نقر المستخدم على منطقة العميل. هذا يمنع المستخدم من تحريك النافذة بالماوس (عكس ما كنا نفعله في بداية المقال).

إذا رسالة. النتيجة = htCaption ثم رسالة. النتيجة: = htClient؛ 

وجود مكونات في نموذج

في معظم الحالات ، سيكون لدينا بعض المكونات في النموذج. لنفترض ، على سبيل المثال ، أن كائن لوحة واحد موجود في نموذج. إذا تم تعيين خاصية محاذاة اللوحة إلى alClient ، فإن اللوحة تملأ منطقة العميل بالكامل بحيث يكون من المستحيل تحديد النموذج الأصلي بالنقر فوقه. الرمز أعلاه لن يعمل - لماذا؟ وذلك لأن الماوس يتحرك دائمًا فوق مكون اللوحة ، وليس النموذج.

لنقل نموذجنا عن طريق سحب لوحة في النموذج ، علينا إضافة بضعة أسطر من التعليمات البرمجية في إجراء حدث OnMouseDown لمكون اللوحة:

إجراء TForm1.Panel1MouseDown

(المرسل: الكائن ؛ زر: TMouseButton ؛
التحول: TShiftState ؛ X ، Y: عدد صحيح) ؛
ابدأ

 الإصدار

 SendMessage (Form1.Handle، WM_SYSCOMMAND، 61458، 0) ؛

النهاية; 

ملحوظة: لن يعمل هذا الرمز مع عناصر تحكم غير نافذة مثل مكونات TLabel.

instagram story viewer