المتابعون للمدونة

الجمعة، 7 يوليو 2017

هامش وهمي لمربع النص


 
ذكرت في منشور سابق عن الأداة TimeSpanPicker أنني وضعت مربع نص على أداة المستخدم وجعلت بينهما هامشا وجعلت مربع النص بلا إطار BorderStyle = None، وجعلت لأداة المستخدم نفس لون خلفية مربع النص (الأبيض) حتى لا يلحظ المستخدم الفرق بينهما.. وفي الحدث GotFocus الخاص بأداة المستخدم، الذي ينطلق كلما انتقل المؤشر إليها، أنقل المؤشر إلى مربع النص، بحيث لو ضغط المستخدم الهامش المحيط بمربع النص، يعود المؤشر إلى مربع النص ويستطيع أن يغير قيمة النص المحدد مباشرة.

بقيت هناك مشكلتان:
- أن مؤشر الفأرة فوق هذا الهامش سيكون على شكل سهم، بينما فوق مربع النص سيكون على شكل حرف I.. حل هذا بسيط، بتغيير الخاصية Cursor لأداة المستخدم إلى IBeam.. لكن انتبه إلى أن هذا سيغير قيمة هذه الخاصية أيضا في كل الأدوات الموضوعة على أداة المستخدم ومنها أداة زر الزيادة وزر الإنقاص، لهذا عليك إعادة قيمة الخاصية Cursor الخاصة بها إلى Default.

- أن المستخدم لو ضغط بالفأرة فوق الهامش وهو يظن أنه جزء من مربع النص، فسينتقل المؤشر إلى مربع النص لكن لن ينتقل مؤشر الكتابة في مربع النص إلى موضع الفأرة.. يعني لو كان الحرف المحدد في مربع النص قبل الضغط هو الحرف رقم 10 وضغط المستخدم بالفأرة على الهامش فوق أو تحت الحرف رقم 5 فسيظل الحرف المحدد في مربع النص هو رقم 10!

من الممكن حل هذه المشكلة، بمعرفة رقم الحرف المناظر لموضع الفأرة باستخدام الوسيلة TextBox.GetCharIndexFromPosition.. لكن الأمر لن يكون مباشرا، لأن الفأرة خارج مربع النص (فوقه أو تحته أو على يمينه أو يساره)، لهذا يجب أن نفحص موضع الفأرة الأفقي:
- فإن كان أصغر من الحافة اليسرى لمربع النص (كما توضحها الخاصية Left) نجعل قيمته صفرا.
- وإن كان أكبر من الحافة اليمنى لمربع النص (Left + Width) نجعل قيمته Width - 4 .

والأمر نفسه بالنسبة لموضع الفأرة الرأسي:
- فإن كان أصغر من الحافة العليا لمربع النص (كما توضحها الخاصية Top) نجعل قيمته صفرا.
- وإن كان أكبر من الحافة السفلى لمربع النص (Top + Height) نجعل قيمته Height - 4 . 

ملحوظة: حدثت ملف المشروع في رابط التحميل وفيه الحل:

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر