والدوال المستخدمة فى ذلك هى
كود
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
1: شرح الوسائط المستخدمة فى الدوال
( CreateRectRgn و CreateEllipticRgn )
1 : الوسيط الأول فى الدالة الاولى وهو ( X1 ) و هو يعبر عن من اين يبدأ من يسار الفورم
2 : الوسيط الثانى فى الدالة الأولى وهو ( Y1 ) و هو يعبر عن من اين يبدأ من أعلى الفورم
3 : الوسيط الثالث فى الدالة الأولى وهو ( X2 ) و هو يعبر عن عرض الفورم = Form.ScaleWidth
4 : الوسيط الرابع فى الدالة الأولى وهو (ْْY2 ) و هو يعبر عن ارتفاع الفورم = Form.ScaleWidth
* هذه الوسائط تعتبر من أشهر الوسائط المستخدمة فى دوال الرسم عموما
2 : الدالة (CreateEllipticRgnIndirect)
مثلهم تماما لكن بدلا من تمرير الوسائط مباشرة تم تمريرها عبر نوع منشىء بواسطة المستخدم وهو النوع (Rect) وطبعا ده بيكون بناء على ما تطلبه الدالة فسوف تجد ان الدالة تقول لنا انا واسئطها تعرف بواسطة النوع (Rect) وقد فهمنا ان النوع (Rect) هو المستخدم من هذه العبارة (IpRect As Rect)
و للنوع (Rect) اربعة خصائص وهى
1 : Bottom ) ) وهى تعنى بالأنجليزية كلمة (قاع) وهى تساوى فى الوسائط التى ذكرت بالاعلى الوسيط رقم 4 ( Y2 )
2 : ) Left ) وهى تعنى بالأنجليزية كلمة (اليسار) وهى تساوى فى الوسائط التى ذكرت بالاعلى الوسيط رقم 1 ( X1 )
3: ) Right ) وهى تعنى بالأنجليزية كلمة (اليمين) وهى تساوى فى الوسائط التى ذكرت بالاعلى الوسيط رقم 3 ( X2 )
4: Top ) ) وهى تعنى بالأنجليزية كلمة (قمه) وهى تساوى فى الوسائط التى ذكرت بالاعلى الوسيط رقم 2 ( Y1 )
وبعد ان فهمنا النوع ( Rect ) بقى علينا ان نعرف كيف يتم تمرير القيم اليه وهى عن طريق متغير من النوع (Rect )
لكى يحمل خصائصه ومن ثم نمرره الى الدالة (CreateEllipticRgnIndirect)
3 : الدالة ( CreateRoundRectRgn )
اول اربع وسائط بها مثل الوسائط المشروحة بالأعلى تماما ولكن تـزيـد عنهم وسيطين وهما (X3) و (Y3) وعن طريقهم تستطيع عمل حواف دائرية للفورم طبعا تستطيع التحكم فى الارقام المررة اليهم حتى يصل الشكل الى دائرة او بيضاوى وعموما شكل الفورم بعد استخدام الدوال السابقة جميعا سوف يتوقف على الارقام المررة للوسائط لتعطيعك الشكل الذى تريده والان قد انتهينا من عمل شكل الفورم ماذا يتبقى لنا كى نطبقه ؟ تابع شرح الدالة الرابعة لكى تعرف
4 : الدالة ( SetWindowRgn )
وهى المسئولة عن تغير شكل الفورم بعد استخدام الدوال السابقة لكن كيف يتم ذلك ؟ لاحظ شرح الوسائط الموجودة فى هذه الدالة وسوف تعرف .
شرح وسائط الدالة ( SetWindowRgn )
1 : الوسيط الأول وهو مقبض النافذة التى نود تغير شكلها واعتقد انه كلنا نعرفه تماما ومقبض النافذة يعبر عنه بالكود
( Form(X).Hwnd )
2 : الوسيط الثانى هو الذى يتم تمرير اى من الدوال السابقة اليه كى ينفذ الشكل
3 : الوسيط الثالث وهو عبارة عن قيمة ( Boolean ) وفى حالة اردنا تطبيق الشكل نجعل قيمته ( True ) غير ذلك نجعل قيمته (False)
الى هنا تستطيع تنفيذ الكود وسوف يعمل بنجاح ان شاء الله .
5 : الدالة (DeleteObject)
واستخدامها منتهى السهولة وهى لها وسيط واحد وهو الجزء الذى نود مسحه او عدم رؤيته من الفورم
ملاحظات مهمة
1 : استخدمت المتغير(Rgn) من النوع (Long) كى يحمل كل خصائص الدالة ومن ثم قمت بتمريره الى الوسيط الثانى للدالة ( SetWindowRgn ) وهذا لتسهيل شكل الكود لكنك تستطيع ان تمرر الى الوسيط الثانى الدالة مباشرة بهذا الشكل
كود
SetWindowRgn Me.hWnd, CreateEllipticRgn(0, 0, 200, 200), True
2 : استخدمت المتغير (Rct) من النوع (Rect) كى يحمل خصائص النوع (Rect)
3 : غير الأرقام المررة الى وسائط الدوال الاربعة الأولى و شاهد النتيجه
4 : طبعا هذه ليست كل الدوال المسئوله عن تحديد شكل الفورم لكن ده اللى ربنا قدرنى عليه النهارده
5 : الكود المستخدم فى البرنامج المرفق مع الشرح وتعريفات الدوال بالأسفل
الى هنا أكون قد انتهيت من شرح الدوال المستخدمة فى تغير شكل الفورم وأرجو ان أكون قد وصلت المعلومة جيدا
مع العلم بأن هذا الشرح على حد علمى لإذا وجد اى شخص اى ملحوظه قى الشرح ياريت يخبرنى على طول بها
وأن شاء الله سوف أحاول فى المرة القادمة شرح الدوال المستخدمة فى الرسم على الفورم
يوجد فى المرفقات مع الرسالة شرح الدرس فى ملف وورد + مثال تطبيقى
من أعداد : مصطفى عبد الظاهر (مبرمج مصرى)
وهذه هى الاكواد المستخدمة فى المثال المرفق مع الدرس
كود
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim Rct As RECT
Dim Rgn As Long
Private Sub Command1_Click()
Rgn = CreateEllipticRgn(0, 0, 200, 200)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command2_Click()
Rgn = CreateRectRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command3_Click()
Rct.Bottom = 700
Rct.Left = 0
Rct.Right = 200
Rct.Top = 0
Rgn = CreateEllipticRgnIndirect(Rct)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command4_Click()
Rgn = CreateRoundRectRgn(0, 0, 200, 200, 80, 80)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Rgn = CreateRoundRectRgn(0, 0, 200, 200, 80, 80)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim Rct As RECT
Dim Rgn As Long
Private Sub Command1_Click()
Rgn = CreateEllipticRgn(0, 0, 200, 200)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command2_Click()
Rgn = CreateRectRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command3_Click()
Rct.Bottom = 700
Rct.Left = 0
Rct.Right = 200
Rct.Top = 0
Rgn = CreateEllipticRgnIndirect(Rct)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Private Sub Command4_Click()
Rgn = CreateRoundRectRgn(0, 0, 200, 200, 80, 80)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub
Rgn = CreateRoundRectRgn(0, 0, 200, 200, 80, 80)
SetWindowRgn hWnd, Rgn, True
DeleteObject Rgn
End Sub