مقال- تطوير الفورم رسم الفورم باستخدام +GDI وتحريكه Moving و تغيير أبعاده Resize - RaggiTech - 05-10-12
كاتب الموضوع : silverlight
تطوير الفورم : كيفية رسم الفورم وتحريكه وتغيير أبعاده
اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم
السبب الرئيسي لكتابة هذا الموضوع هو سؤال لأحد الأخوة في المنتدى عن كيفية رسم الفورم باستخدام +GDI
وبالرغم أن الفورم أصلا مشتق من الكونترول وهناك مقالات كثيرة قمت بكتابتها عن تطوير الكونترول وبالطبع نفس الأفكار الموجودة تحت هذه المقالات يمكن استخدامها مع الفورم مع تعديلات قليلة جدا عموما لن أطيل عليكم ولنتحدث مباشرة عن كيفية رسم الفورم أو من الممكن أن نطلق عليه تطوير الفورم.
أفترض أن من سيقوم بتنفيذ الكود المكتوب تحت هذا المقال لدية خلفية مناسبة عن كيفية التعامل مع +GDI
أولا: لرسم الفورم نحتاج أن نقوم بتعريف بعض المستطيلات Rectangles وهذه المستطيلات نقوم برسمها باستخدام +GDI داخل الفورم وعملية الرسم تتم كلها داخل الحدث Paint الخاص بالفورم أو الأفضل أن يتم ذلك عن طريق عمل Overrides للحدث OnPaint الذي يخص الفورم ومن الممكن أن تتم عملية الرسم أيضا عن طريق عمل Overrides للحدث OnPaintBackGround و الكود التالي يعطي شكل الحدث لكل من هذه Events الأحداث
الحدث Paint يكون شكل الكود كالأتي
كود :
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
End Sub
الحدث OnPaint يكون شكل الكود كالأتي
كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
End Sub
الحدث OnPaintBackGround يكون شكل الكود كالأتي
كود :
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaintBackground(e)
End Sub
ثانيا: نقوم بعمل Invalidate للمستطيلات المرسومة في الحدث Resize الذي يخص الفورم أو أيضا عن طريق عمل Overrides للحدث OnResize والهدف هنا من استخدام Invalidate من داخل هذا الحدث هو إجبار الفورم علي إعادة رسم نفسه مرة أخري طبقا للكود الموجود في الحدث Paint أو الحدث OnPaint
الحدث OnResize سيكون شكل الكود كالأتي
كود :
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
End Sub
الحدث Resize سيكون شكل الكود كالأتي
كود :
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
End Sub
ثالثا: نقوم بعمل Overrides للحدث WndProc وهو الحدث المسئول عن Window Messages والتعامل معها وهذا الحدث وطبقا لتوصيات مايكروسوفت يجب أن نضيف إليه Security Permission Attribute كما موضح بالكود أدناه
الحدث WndProc سيكون شكل الكود كالأتي
كود :
<System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
End Sub
طريقة رسم الفورم
طبعا نفتح مشروع جديد ونطلق عليه أي اسم نريد ثم نقوم بتغيير بعض Properties الصفات التي تخص الفورم في مرحلة التصميم أو مرحلة Design وهي كالأتي:
DoubleBuffered = True والهدف هنا هو تقليل Flicker أثناء عملية الرسم في الفورم بشكل عام
FormBorderSyle = None الهدف منها إلغاء Borders المعتادة
MinimumSise = (200, 200) والهدف كما تعلمون هو تحديد أقل أو أصغر أبعاد للفورم
طبعا ممكن تغيير هذه الصفات برمجيا أي بكتابتها مثلا داخل الحدث Load الخاص بالفورم
الأن لنذهب معا إلي منطقة الكود التي تخص الفورم
وسنري الكود بالشكل الأتي
كود :
Public Class Form1
End Class
الأن لنقوم بعمل Overrides للحدث OnPaint وهو يكتب يدويا أي أننا سنكتب Protected Overrides Sub وطبعا IntelliSense سيساعدنا أثناء عملية الكتابة وهنا من الممكن أن نختار الحدث الذي نريده وهو OnPaint
تحت هذا الحدث سوف نقوم بتعريف مجموعة من المستطيلات بحيث تكون أبعادها وخصوصا العرض Width و الارتفاع Height مرتبطين بصفة موجودة بالفورم وهي ClientSize.Width وأيضا ClientSize.Height
الأن نقوم بتعريف المستطيلات ثم نقوم برسمها داخل الفورم وهنا يمكننا أن نقوك بتعريف كل مستطيل علي حده وترسمه أو كما فعلت أنا بالمثال المرفق قمت بتغطية المستطيلات بأحد الألوان طبعا نستطيع أن نفعل الكثير هنا مثلا ممكن نستخدم LinearGradientBrushes أو SolidBrush أو PathGradienBrush ونستخدمها جميعها أو بعضها في تلوين المستطيلات
أيضا قمت برسم Text في وسط الفورم باستخدام ControlPaint Class وهذا الكلاس تحدثت عنه أيضا في أحد المقالات السابقة تحت عنوان الكلاس التائه بين +GDI & System Windows Form
طبعا من يحتاج أن يعطي أو يلون أو يبدع كما يريد يمكنه استخدام نفس الأفكار الموجودة تحت سلسلة المقالات الخاصة بتطوير الكونترول أو يفعل هو ما يريد إذا كان لدية الخبرة الكافية في استخدام +GDI
علي العموم لن أركز كثيرا علي طريقة الرسم نفسها لأنه وكما قلت من يقوم بتنفيذ هذا الكود يجب أن يكون لدية معلومات مناسبة عن كيفية التعامل مع +GDI
الكود الكامل للحدث OnPaint سيكون كالأتي
كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'
' First let us Draw the Background of the form
Dim winBounds As New Rectangle(0, 0, Me.Width, Me.Height)
Using brush As New System.Drawing.Drawing2D.LinearGradientBrush(winBounds, Color.LightCoral, Color.Red, 90, True)
e.Graphics.FillRectangle(brush, winBounds)
End Using
' Let us Paint the Other Rectangles
Dim NC_Rectangles As Rectangle() = {New Rectangle(5, 5, ClientSize.Width - 10, 24), _
New Rectangle(6, 0, ClientSize.Width - 12, 5), _
New Rectangle(0, 0, 6, 6), _
New Rectangle(ClientSize.Width - 6, 0, 6, 6), _
New Rectangle(0, 6, 5, ClientSize.Height - 12), _
New Rectangle(ClientSize.Width - 5, 6, 5, ClientSize.Height - 12), _
New Rectangle(6, ClientSize.Height - 5, ClientSize.Width - 12, 5), _
New Rectangle(0, ClientSize.Height - 6, 6, 6), _
New Rectangle(ClientSize.Width - 6, ClientSize.Height - 6, 6, 6)}
Using NC_Brush As New SolidBrush(Color.FromArgb(255, Color.DarkBlue))
e.Graphics.FillRectangles(NC_Brush, NC_Rectangles)
End Using
' Draw some Text too
Dim r As Rectangle = Me.ClientRectangle
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
Dim DrawFont As New Font(Font.FontFamily, 40, FontStyle.Regular, GraphicsUnit.Pixel)
ControlPaint.DrawStringDisabled(e.Graphics, "Hello World", DrawFont, BackColor, RectangleF.op_Implicit(r), sf)
End Sub
الأن سنقوم بعمل Overrides للحدث OnResize وسنضيف له جملة واحدة فقط وهي Invalidate وسيكون الكود كالأتي
كود :
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
Invalidate()
End Sub
الأن نأتي الي كيفية عمل Overrides للحدث WndProc وكما أسلفنا فهو الحدث المسئول Window Messages أو عن إرسال الرسائل المختلفة التي يتم إرسالها الي الفورم
ومن بعض هذه الرسائل مثلا
WM_NCHITTEST وهذه الرسالة تفسيرها Window Message Non Client Hit Test أي انها المسئولة عن ارسال ارسائل تخض Mouse Click علي الفورم وفي مناطق معينة
WM_NCMOUSEMOVE وهي عبارة عن Window Message Non Client Mouse Move وهي المسئولة عن حركة الماوس في منطقة Non Client وهي المنطقة المحددة بيمين ويسار الفورم و اسفل وأعلي الفورم والمنطقة التي بها Minimize و Maximize و Close باتون
WM_ACTIVATEAPP وهي عبارة عن Window Message Active Form وهي تقوم بتحديد حالة الفورم إذا كان Active أم لا
وهناك الكثير والكثير من الرسائل بعضها ولقد أضفت الي الملف المرفق ملف به تقريبا معظم هذه الثوابت التي تخص الفورم والكونترول المختلفة
مرحليا ما يهمنا الأن هو مجموعة من الرسائل Window Messages التي تختص بعملية تحريك الفورم Form Move وتكبير أو تصغير الفورم form Resize في مرحلة التشغيل تحديدا أو ما يطلق عليها Non Design Mode وجميعها تستخدم مع WM_NCHITTEST و هذه الرسائل تعريفها كالأتي
HTCAPTION وهي رسالة تحدد ماذا سوف يفعل الفورم عندما يتم الضغط بالماوس علي منطقة Caption وهي المنطقة التي توجد في أعلي الفورم ويتواجد بها Form.Text والأيقونة المخصصة للفورم وهي شريحة بعرض الفورم بالكامل
HTLEFT وهي تحدد حركة الماوس في يسار الفورم وهي المنطقة التي يقوم الماوس فيها بتكبير أو تصغير الفورم أفقيا من ناحية يسار الفورم
HTRIGHT وهي تحدد حركة الماوس في يمين الفورم وهي المنطقة التي يقوم الماوس فيها بتكبير أو تصغير الفورم أفقيا من ناحية يمين الفورم
HTTOP وهي منطقة رفيعة جدا فوق منطقة Caption وهي المنطقة العلوية من الفورم التي يقوم الماوس فيها بتكبير أو تصغير الفورم رأسيا من ناحية أعلي الفورم
HTBOTTOM وهي المنطقة السفلية من الفورم وفيها يقوم الماوس بتكبير الفورم رأسيا من ناحية أسفل الفورم
HTBOTTOMLEFT و HTBOTTOMRIGHT هما يعبران عن أقصي يسار ويمين الفورم من الناحية السفلية حيث يتم تصغير وتكبير الفورم بزاوية ميل 45 علي الفورم أي في الاتجاه Diagonal علي الفورم من أسفل نقطة في أقصي اليمين وأقصي اليسار
HTTOPLEFT و HTTOPRIGHT وهما يعبران عن أقصي يسار ويمين الفورم من الناحية العلوية حيث يتم تصغير وتكبير الفورم بزاوية ميل 45 علي الفورم أي في اتجاه Diagonal علي الفورم من أعلي نقطة في أقصي اليمين أو أقصي اليسار
عموما كل هذه الرسائل هي عبارة عن أرقام وتستخدم كثوابت في البرنامج وكل هذه الرسائل يمكن أن تجدها في ملف موجود في الويندوز اسمه window.h أو كما يطلق علي هذا النوع من الملفات Header Files وهي ملفات مكتوبة بلغة Pure C
الأن وقبل أن نقوم بعمل Overrides الي الحدث WndProc سنقوم بإضافة مجموعة من الثوابت الي الفورم كود وكل هذه الثوابت سوف نستخدمها في التعامل مع الفورم وهذه الثوابت ممكن إضافتها علي سبيل المثال كأنها Public Constants أو Friend Constantsوهذه الثوابت سيتم إضافتها الي في أول الفورم كالأتي
كود :
#Region "Constants"
' Define Hit Test Constants refer to "windows.h" header file
' Non Client Area Hit Test
Friend Const WM_NCHITTEST As Integer = &H84
' Hit Test in Caption Rectangle
Friend Const HTCAPTION As Integer = &H2
' Hit Test in Left Rectangle
Friend Const HTLEFT As Integer = &HA
' Hit Test in Right Rectangle
Friend Const HTRIGHT As Integer = &HB
' Hit Test in Top Rectangle
Friend Const HTTOP As Integer = &HC
' Hit Test in Top Left Rectangle
Friend Const HTTOPLEFT As Integer = &HD
' Hit Test in Top Right Rectangle
Friend Const HTTOPRIGHT As Integer = &HE
' Hit Test in Bottom Rectangle
Friend Const HTBOTTOM As Integer = &HF
' Hit Test in Bottom Left Rectangle
Friend Const HTBOTTOMLEFT As Integer = &H10
' Hit Test in Bottom right Rectangle
Friend Const HTBOTTOMRIGHT As Integer = &H11
#End Region
مقال- تطوير الفورم رسم الفورم باستخدام +GDI وتحريكه Moving و تغيير أبعاده Resize - RaggiTech - 05-10-12
الأن وتحت الحدث WndProc نقوم بإضافة شرط أنه سيتم تنفيذه هذه الرسائل Messages في مرحلة التشغيل فقط ويتم ذلك عن طريق DesignMode Property ثم نقوم بتحديد أو تعريف نقطة Point وهذه النقطة ستعبر عن مكان الماوس في المستطيلات التي قمنا بتعريفها في الحدث OnPaint وهذه المستطيلات سنقوم بتعريفها ثانية في هذا الحدث طبعا من الممكن تقليل حجم الكود عن طريق تعريف هذه المستطيلات مرة واحدة باستخدام Structure مثلا ولكني قمت بتعريفها ثانية بغرض توضيح الأمر للقارئ ليس إلا بعد ذلك وباستخدام Select Case سوف نحدد Window Message ونضع بعض الجمل الشرطية باستخدام If ….End If للحصول علي نتائج الحدث في حالاته المختلفة والكود التالي يوضح شكل الكود
كود :
<System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If Not DesignMode Then
Dim m_Point As Point
' Define Hit Test Imaginary Rectangles
Dim CaptionRect As New Rectangle(5, 5, ClientSize.Width - 10, 24)
Dim TopRect As New Rectangle(6, 0, ClientSize.Width - 12, 5)
Dim TopLeftRect As New Rectangle(0, 0, 6, 6)
Dim TopRightRect As New Rectangle(ClientSize.Width - 6, 0, 6, 6)
Dim LeftRect As New Rectangle(0, 6, 5, ClientSize.Height - 12)
Dim RightRect As New Rectangle(ClientSize.Width - 5, 6, 5, ClientSize.Height - 12)
Dim BottomRect As New Rectangle(6, ClientSize.Height - 5, ClientSize.Width - 12, 5)
Dim BottomLeftRect As New Rectangle(0, ClientSize.Height - 6, 6, 6)
Dim BottomRightRect As New Rectangle(ClientSize.Width - 6, ClientSize.Height - 6, 6, 6)
Select Case m.Msg
Case WM_NCHITTEST
m_Point = PointToClient(New Point(m.LParam.ToInt32()))
If CaptionRect.Contains(m_Point) Then
m.Result = CType(HTCAPTION, IntPtr)
Return
ElseIf TopRect.Contains(m_Point) Then
m.Result = CType(HTTOP, IntPtr)
Return
ElseIf LeftRect.Contains(m_Point) Then
m.Result = CType(HTLEFT, IntPtr)
Return
ElseIf RightRect.Contains(m_Point) Then
m.Result = CType(HTRIGHT, IntPtr)
Return
ElseIf TopLeftRect.Contains(m_Point) Then
m.Result = CType(HTTOPLEFT, IntPtr)
Return
ElseIf TopRightRect.Contains(m_Point) Then
m.Result = CType(HTTOPRIGHT, IntPtr)
Return
ElseIf BottomRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOM, IntPtr)
Return
ElseIf BottomLeftRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOMLEFT, IntPtr)
Return
ElseIf BottomRightRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOMRIGHT, IntPtr)
Return
End If
Exit Select
End Select
End If
MyBase.WndProc(m)
End Sub
طبعا ممكن التعامل مع Mouse Events واستخدامها أيضا في تحريك الفورم وتغيير أبعاده في أثناء التشغيل والأمر ببساطة ينحصر في اننا نحدد نقطة ما ونربطها بالماوس وعندما توجد هذه النقطة داخل أحد المستطيلات التي قمنا بتعريفها فان الفورم يتحرك أو تتغير أبعاده مثلا أيضا من الممكن رسم أي شئ وربطه بحركة الماوس مثل الباتون في اعلي يمين الفورم وهي Close و Maximize و Minimize
شئ أخير لمن يريد عمل Skin للفورم يمكنه مراجعة المقال المنشور تحت تطوير الكونترول Skin Control وتنفيذه مع الفورم سيحصل علي فورم له Skin
إضافة أخيرة يمكن أن تستخدم الوراثة وتقوم بعمل Inherits للفورم وهناك تقوم بعمل Overrides للكثير من الصفات و الطرق كما سبق وناقشنا ذلك تحت المقالات الخاصة بتطوير الكونترول بل أيضا يمكنك أن تبني Designer خاص بك للفورم ولكن الأمر يختلف قليلا عن الكونترول فالفورم عبارة عن حالة خاصة جدا من الكونترول وأرجو أن لا تنسوا دائما أن الفورم أصله كونترول
النسخة المستخدمة : الفيجوال استوديو 2008
اللغة المستخدمة: الفيجوال بيسك دوت نت
يمكنك إنزال الكود المرفق من الرابط التالي
http://vb4arb.com/vb/uploaded/18_01349449210.zip
أتمني لكم التوفيق
أخوكم عمر
مقال- تطوير الفورم رسم الفورم باستخدام +GDI وتحريكه Moving و تغيير أبعاده Resize - RaggiTech - 05-10-12
بالنسبة لمستخدمي نسخة الفيجوال استوديو 2005 يمكنهم فتح فورم وفي الفورم كود يمكنهم نسخ الكود الأتي ووضعه في الفورم رقم واحد
وسيحصلون علي نفس النتائج
كود :
'
'
' By Omar amin
' Greetings from Egypt
' e-mail (silverlight1212@yahoo.com)
'
'
Public Class Form1
#Region "Constants"
' Define Hit Test Constants refer to "windows.h" header file
' Non Client Area Hit Test
Friend Const WM_NCHITTEST As Integer = &H84
' Hit Test in Caption Rectangle
Friend Const HTCAPTION As Integer = &H2
' Hit Test in Left Rectangle
Friend Const HTLEFT As Integer = &HA
' Hit Test in Right Rectangle
Friend Const HTRIGHT As Integer = &HB
' Hit Test in Top Rectangle
Friend Const HTTOP As Integer = &HC
' Hit Test in Top Left Rectangle
Friend Const HTTOPLEFT As Integer = &HD
' Hit Test in Top Right Rectangle
Friend Const HTTOPRIGHT As Integer = &HE
' Hit Test in Bottom Rectangle
Friend Const HTBOTTOM As Integer = &HF
' Hit Test in Bottom Left Rectangle
Friend Const HTBOTTOMLEFT As Integer = &H10
' Hit Test in Bottom right Rectangle
Friend Const HTBOTTOMRIGHT As Integer = &H11
#End Region
#Region "Methods"
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'
' First let us Draw the Background of the form
Dim winBounds As New Rectangle(0, 0, Me.Width, Me.Height)
Using brush As New System.Drawing.Drawing2D.LinearGradientBrush(winBounds, Color.LightCoral, Color.Red, 90, True)
e.Graphics.FillRectangle(brush, winBounds)
End Using
' Let us Paint the Other Rectangles
Dim NC_Rectangles As Rectangle() = {New Rectangle(5, 5, ClientSize.Width - 10, 24), _
New Rectangle(6, 0, ClientSize.Width - 12, 5), _
New Rectangle(0, 0, 6, 6), _
New Rectangle(ClientSize.Width - 6, 0, 6, 6), _
New Rectangle(0, 6, 5, ClientSize.Height - 12), _
New Rectangle(ClientSize.Width - 5, 6, 5, ClientSize.Height - 12), _
New Rectangle(6, ClientSize.Height - 5, ClientSize.Width - 12, 5), _
New Rectangle(0, ClientSize.Height - 6, 6, 6), _
New Rectangle(ClientSize.Width - 6, ClientSize.Height - 6, 6, 6)}
Using NC_Brush As New SolidBrush(Color.FromArgb(255, Color.DarkBlue))
e.Graphics.FillRectangles(NC_Brush, NC_Rectangles)
End Using
' Draw some Text too
Dim r As Rectangle = Me.ClientRectangle
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
Dim DrawFont As New Font(Font.FontFamily, 40, FontStyle.Regular, GraphicsUnit.Pixel)
ControlPaint.DrawStringDisabled(e.Graphics, "Hello World", DrawFont, BackColor, RectangleF.op_Implicit(r), sf)
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
Invalidate()
End Sub
<System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If Not DesignMode Then
Dim m_Point As Point
' Define Hit Test Imaginary Rectangles
Dim CaptionRect As New Rectangle(5, 5, ClientSize.Width - 10, 24)
Dim TopRect As New Rectangle(6, 0, ClientSize.Width - 12, 5)
Dim TopLeftRect As New Rectangle(0, 0, 6, 6)
Dim TopRightRect As New Rectangle(ClientSize.Width - 6, 0, 6, 6)
Dim LeftRect As New Rectangle(0, 6, 5, ClientSize.Height - 12)
Dim RightRect As New Rectangle(ClientSize.Width - 5, 6, 5, ClientSize.Height - 12)
Dim BottomRect As New Rectangle(6, ClientSize.Height - 5, ClientSize.Width - 12, 5)
Dim BottomLeftRect As New Rectangle(0, ClientSize.Height - 6, 6, 6)
Dim BottomRightRect As New Rectangle(ClientSize.Width - 6, ClientSize.Height - 6, 6, 6)
Select Case m.Msg
Case WM_NCHITTEST
m_Point = PointToClient(New Point(m.LParam.ToInt32()))
If CaptionRect.Contains(m_Point) Then
m.Result = CType(HTCAPTION, IntPtr)
Return
ElseIf TopRect.Contains(m_Point) Then
m.Result = CType(HTTOP, IntPtr)
Return
ElseIf LeftRect.Contains(m_Point) Then
m.Result = CType(HTLEFT, IntPtr)
Return
ElseIf RightRect.Contains(m_Point) Then
m.Result = CType(HTRIGHT, IntPtr)
Return
ElseIf TopLeftRect.Contains(m_Point) Then
m.Result = CType(HTTOPLEFT, IntPtr)
Return
ElseIf TopRightRect.Contains(m_Point) Then
m.Result = CType(HTTOPRIGHT, IntPtr)
Return
ElseIf BottomRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOM, IntPtr)
Return
ElseIf BottomLeftRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOMLEFT, IntPtr)
Return
ElseIf BottomRightRect.Contains(m_Point) Then
m.Result = CType(HTBOTTOMRIGHT, IntPtr)
Return
End If
Exit Select
End Select
End If
MyBase.WndProc(m)
End Sub
#End Region
End Class
أتمني للجميع التوفيق
أخوكم عمر
|