س: عند محاولة ضغط زر
على شريط أدوات ToolStrip موضوع على نموذج، إذا كان هذا النموذج ظاهرا وغير
فعال، تقوم الضغطة بتفعيل النموذج، لكن لا يتم ضغط الزر، ما يجعل المستخدم يحتاج
إلى ضغطة إضافية.. كيف يمكن تفعيل النموذج وضغط زر شريط الأدوات بضغطة واحدة فقط؟
ج: هذه المشكلة لا تكون ملحوظة في
معظم الحالات، وتظهر إذا كان شريط الأدوات موضوعا على نموذج صغير الحجم يظهر دائما
أعلى باقي النوافذ:
Form1.TopMost = true
لحل هذه المشكلة، يمكن استخدام حدث
تفعيل النموذج Form1.Activated
الذي سينطلق بعد محاولة ضغط زر شريط الأدوات بالفأرة، واستخدام الوسيلة GetChildAtPoint الخاصة بالنموذج لمعرفة الأداة التي يوجد فوقها مؤشر
الفأرة حاليا، فإن كانت هذه الأداة هي شريط الأدوات، نستخدم الوسيلة GetItemAt الخاصة بشريط الأدوات للحصول على الزر الموجود
حاليا تحت مؤشر الفأرة، ونستدعي حدث ضغطه بأنفسنا باستخدام الوسيلة PerformClick، وبهذا يتم تفعيل النموذج وضغط الزر معا بضغطة
واحدة.
لاحظ أن مؤشر الفأرة قد يكون فوق
شريط الأدوات لكنه يمر فوق منطقة فارغة من الأزرار، وهذا سيجعل الوسيلة GetItemAt تعيد null (Nothing)
وهذا سيسبب خطأ عند استدعاء الوسيلة PerformClick، لهذا يجب كتابة شرط للتأكد من أن
القيمة العائدة من الوسيلة GetItemAt ليست null أو يمكن اختصار الكود إذا كنت
تستخدم دوت نت 2015 باستخدام العلامة ؟ التي لا تنفذ ما بعدها إلا إذا كان لما
قبلها قيمة غير منعدمة.. مثال:
T.GetItemAt(p)?.PerformClick( )
سأضع لكم الكود بلغة C# ثم بلغة VB.NET.. هذا هو كود سي شارب:
private void Form1_Activated(object sender, EventArgs e)
{
// تحويل
موضع مؤشر الفأرة من إحداثيات الشاشة إلى إحداثيات النموذج
Point p = this.PointToClient(Cursor.Position);
Control c = this.GetChildAtPoint(p);
if (c is ToolStrip)
{
ToolStrip T = (ToolStrip)c;
// تحويل موضع مؤشر
الفأرة من إحداثيات الشاشة إلى إحداثيات شريط الأدوات
p = T.PointToClient(Cursor.Position);
T.GetItemAt(p)?.PerformClick( );
}
}
وهذا هو الكود بلغة VB.NET:
Private Sub Form1_Activated(ByVal sender As Object,
ByVal e As EventArgs) Handles Me.Activated
' تحويل موضع مؤشر
الفأرة من إحداثيات الشاشة إلى
إحداثيات النموذج
Dim p As Point = Me.PointToClient(Cursor.Position)
Dim c As Control = Me.GetChildAtPoint(p)
If TypeOf c Is ToolStrip Then
Dim T As ToolStrip = CType(c, ToolStrip)
' تحويل موضع مؤشر
الفأرة من إحداثيات الشاشة إلى
إحداثيات شريط الأدوات
p = T.PointToClient(Cursor.Position)
T.GetItemAt(p)?.PerformClick( )
End If
End Sub