تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيف تتحكم في أبعاد الفورم بإستخدام الماوس
#1
كاتب الموضوع : silverlight

الكثير منا يستخدمون الكود التالي في برامجهم لكي يتخلصوا من الشكل التقليدي للفورم
أو أيضا يمكن عمل نفس الشئ في مرحلة التصميم للفورم عن طريق تحديد هذه القيمة
وبالطبع عندما نستخدم الكود التالي قد نحتاج إلي إعطاء المستخدم الصلاحية لكي يتحكم في أبعاد الفورم مُثل تغيير إرتفاع الفورم أو عرض الفورم


كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None

End Sub
كيف نفعل ذلك ؟

الكود التالي يوضح كيفية عمل ذلك باستخدام بعض دوال API التي هي معروفة للجميع تقريبا
والفكرة ببساطة تعتمد علي إستخدام الدالتان SendMessage و ReleaseCapture بالإضافة الي بعض الثوابت Constants التي يعتمد عليها نظام التشغيل والتي يتم إرسالها الي الفورم من داخل أحداث الماوس مع الوضع في الاعتبار تغيير شكل Cusor طبقا لمكان الماوس علي الفورم

والمثال التالي يوضح الفكرة

ولتنفيذ المثال افتح فورم ثم أكتب الكود بالشكل التالي


كود :
Imports System.Runtime.InteropServices

Public Class Form1

Private rect As Rectangle
Private m_mode As Modes = Modes.None

#Region " Enum & Constants "

Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_DRAGMOVE As Integer = &HF012
Private Const SC_DRAGSIZE_N As Integer = &HF003
Private Const SC_DRAGSIZE_S As Integer = &HF006
Private Const SC_DRAGSIZE_E As Integer = &HF002
Private Const SC_DRAGSIZE_W As Integer = &HF001
Private Const SC_DRAGSIZE_NW As Integer = &HF004
Private Const SC_DRAGSIZE_NE As Integer = &HF005
Private Const SC_DRAGSIZE_SW As Integer = &HF007
Private Const SC_DRAGSIZE_SE As Integer = &HF008

Private Enum Modes

None
Bottom
BottomLeft
BottomRight
Left
Right
Top
TopLeft
TopRight

End Enum

#End Region

#Region " Methods "

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None

End Sub

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim rect As New Rectangle(0, 0, Me.Width, 29)

Using lgb As New Drawing2D.LinearGradientBrush(rect, Color.Cyan, Color.Blue, 90, True)

e.Graphics.FillRectangle(lgb, rect)

lgb.Dispose()

End Using

End Sub

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
'MyBase.OnMouseDown(e)

Dim hwnd As IntPtr = Me.Handle

Select Case m_mode

Case Modes.Bottom
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_S, 0)
Exit Select

Case Modes.Right
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_E, 0)
Exit Select

Case Modes.BottomRight
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_SE, 0)
Exit Select

Case Modes.TopRight
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_NE, 0)
Exit Select

Case Modes.Top
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_N, 0)
Exit Select

Case Modes.TopLeft
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_NW, 0)
Exit Select
Case Modes.Left
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_W, 0)
Exit Select

Case Modes.BottomLeft
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGSIZE_SW, 0)
Exit Select

Case Modes.None
NativeAPI.ReleaseCapture(hwnd)
NativeAPI.SendMessage(hwnd, WM_SYSCOMMAND, SC_DRAGMOVE, 0)
Exit Select

End Select

End Sub

Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
MyBase.OnMouseLeave(e)
Me.Cursor = Cursors.[Default]
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)

If (e.X < 5) AndAlso (e.Y < 5) Then
Me.Cursor = Cursors.SizeNWSE
m_mode = Modes.TopLeft

ElseIf (e.X < 5) AndAlso Math.Abs(e.Y - Me.ClientSize.Height) < 5 Then
Me.Cursor = Cursors.SizeNESW
m_mode = Modes.BottomLeft

ElseIf e.X < 5 Then
Me.Cursor = Cursors.SizeWE
m_mode = Modes.Left

ElseIf Math.Abs(e.X - Me.Width) < 5 AndAlso (e.Y < 5) Then
Me.Cursor = Cursors.SizeNESW
m_mode = Modes.TopRight

ElseIf Math.Abs(e.X - Me.Width) < 5 AndAlso Math.Abs(e.Y - Me.ClientSize.Height) < 5 Then
Me.Cursor = Cursors.SizeNWSE
m_mode = Modes.BottomRight

ElseIf Math.Abs(e.X - Me.Width) < 5 Then
Me.Cursor = Cursors.SizeWE
m_mode = Modes.Right

ElseIf Math.Abs(e.Y - Me.ClientSize.Height) < 5 Then
Me.Cursor = Cursors.SizeNS
m_mode = Modes.Bottom

ElseIf e.Y < 5 Then
Me.Cursor = Cursors.SizeNS
m_mode = Modes.Top

Else

Me.Cursor = Cursors.Default
m_mode = Modes.None

End If
End Sub

#End Region

#Region " Internal Class "

Private Class NativeAPI

<DllImport("USER32.DLL", EntryPoint:="SendMessage")> _
Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Integer
End Function

<DllImport("USER32.DLL")> _
Public Shared Function ReleaseCapture(ByVal hwnd As IntPtr) As Integer
End Function

End Class

#End Region

End Class

أخوكم عمر
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  حساب مكان الفورم علي شاشة الكمبيوتر silverlight 2 3,167 18-06-23, 03:26 PM
آخر رد: kebboud
Star [مقال] كيفية تحويل اسعار العملات بإستخدام Yahoo Exchange Rates Web Service Programmation 9 8,963 22-02-20, 12:58 PM
آخر رد: دمعة المقهور
  [VB.NET] كود يجعل الفورم فى المقدمة دائماً [ بناءاً لطلب احد الاخوة وحتى سيتفاد منه الجميع ] elgokr 5 2,910 16-06-19, 08:32 AM
آخر رد: sendbad100
Rainbow [VB.NET] كلاس ResizeControls وطريقة جديد ومميزة لتكبير وتصغير ادوات الفورم تلقائيا الماجيك مسعد 8 8,762 01-10-18, 03:03 AM
آخر رد: LEO
  الفورم بخاصية none محمود صالح 1 2,051 30-12-17, 03:52 AM
آخر رد: طالب برمجة
  رسم الفورم و طباعته silverlight 1 2,399 19-06-17, 05:44 PM
آخر رد: silverlight
  من المنتدى القديم - تحريك الفورم من اي مكان ( للاخ omar2205 ) المبرمج علي نوري 2 2,945 16-08-15, 05:09 PM
آخر رد: otman_bel
  إيجاد جميع الكونترول الموجودة في الفورم Recursively Find All Controls in Form silverlight 0 3,042 26-05-15, 12:31 AM
آخر رد: silverlight
  طريقة تغيير الوان الفورم من ListView 3booody 4 5,796 19-08-13, 05:01 PM
آخر رد: 3booody
  طريقة من أجمل الطرق لجعل الفورم على شكل صورة عندك أسامة أحمد 63 26,057 12-05-13, 10:39 PM
آخر رد: APP

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم