VB 6.0 rounded and transparent forms Part1

بسم الله الرحمن الرحيم
الموضوع : عمل تأثيرات على الفورم (فورم مستديره - فورم شفافه)
rounded and transparent forms

بداية "اللهم لا سهلا إلا ما جعلته سهلا" .... أما بعد
عمل تأثيرات الفورم لا يغنى عن دراسة أساسيات الجرافيك و التصميم و لكن دليل على قوة المبرمج و تمكنه من أداء عمله و دليل على فهمه لمبدأ البرمجه .
ان شاء الله سنقوم بشرح الموضوع بمثال عملى سيتم رفعه على سيرفر MediaFire.com عباره عن Source Code ...
التعامل سيكون مع VB 6 App Viewer و لمن لا يعرف ما هو App Viewer انصحه بالتعرف عليه ثم الرجوع مره أخرى للشرح , سنقوم أولا بعمل New Project من نوع Windows Application .
و اضافة Module و عمل 2 فورم ثم نقوم بحفظ المشروع و اغلاقه ثم فتحه مره أخرى .
سنقوم بفتح App Viewer ...... 
من هنا يمكنك تنزيل المشروع و القاء نظره عليه و تابع شرح الاكواد ....
أولا : أكواد الموديول - Module


Option Explicit
الكود السابق يجعلك مجبر على تعريف المتغيرات المستخدمه فى البرنامج عن طريق Dim أو Public او Private أو أى من Access Modifiers يمكنك مراجعة درس OOP فى أى وقت للتعرف على Access Modifiers و عن استخدام Option Explicit فان أى متغير يتم استخدامه فى البرنامج اذا لم يكن معرف من قبل فان البرنامج يظهر رسالة Variable Not Defined فى أى وقت تستخدم متغير دون سابق تعريف.
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
الكود السابق عباره عن تحميل دالة SendMessage و يتم تحميل الدالة من Api Viewer عن طريق فتح Api Viewer ثم نختار File - Load TextFile - Win32Api ثم اختيار Declares ثم Public حيث يتم تحميل مجموعة دوال منها SendMessage و هى تستخدم فى ارسال رساله الى أى شاشة "مش لازم فى البرنامج بتاعك و لكن المقصود أى شاشة برنامج" أو أى اداه على هذه الشاشة على سبيل المثال ( تظهر الحروف على الشاشة عندما اضغط على الكايبورد حيث اقوم بارسال رساله نوعها "حرف" الى الشاشة "Internet Explorer" بلغة الاله يتم ترجمتها الى "حرف".و SendMessage لها معاملات Parameters و هى :
Hwnd As Long :
اختصار لــ Handle Window و هى الشاشة أو الاداه على الشاشة المراد ارسال الرساله لها
wMsg As Long :
و هى الرساله أو نوعها المراد ارسالها


wParam As Long :
و هى تحديد نوع الرساله
lParam As Any :
و هى تحديد نوع الرساله ايضا
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long


الكود السابق عباره عن تحميل دالة CreateRectRgn و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : عمل منطقة Rectangle او مستطيلة و هى اختصار لـ Create Rectangle Region و اسم المكتبة الاتيه منها الدالة هى GDI32 و معاملات هذه الدالة هى :
X1 As Long :
و هى تمثل الخط العرضى لـ ( الركن أعلى اليسار ) من المنطقة


Y1 As Long :
و هى تمثل الخط الطولى لـ ( الركن أعلى اليسار ) من المنطقة ... لاحظ ان المستطيل عبارة عن 4 أركان - الركن عباره عن ( زاوية 90 درجة يتمثل فى خطان متقابلان - الخط يبدأ من نقطة و ينتهى عند نقطه احدهما من اليمين الى اليسار  و الثانى من اسفل الى أعلى ) كما بالشكل .


X2 As Long :
و هى تمثل الخط العرضى لـ ( الركن اسفل اليمين ) من المنطقة
Y2 As Long :
و هى تمثل الخط الطولى لـ ( الركن اسفل اليمين ) من المنطقة


Public 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
الكود السابق عباره عن تحميل دالة CreateRoundRectRgn و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : عمل منطقة Round Rectangle او مستطيلة مستديرة الاطراف و هى اختصار لـ Create Round Rectangle Region و اسم المكتبة الاتيه منها الدالة هى GDI32 و معاملات هذه الدالة هى نفس معاملات الداله السابقه .
Public Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long


الكود السابق عباره عن تحميل دالة CreateEllipticRgn و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : عمل منطقة Elliptical او بيضاوية و هى اختصار لـ Create Elliptical Region و اسم المكتبة الاتيه منها الدالة هى GDI32 و معاملات هذه الدالة هى نفس معاملات الداله السابقه ..... كيف ؟
لاحظ أن Elliptical او المنطقة البيضاوية هى الرسمه المستديره حول مستطيل مثلا أى عند رسم الشكل الدائرى يتم تحديده عن طريق اقرب منطقه مستطيلة يمكن للشكل الدائرى أن يحتوية و هو ليس دائرة و لكنها منطقة مستديره .


Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
الكود السابق عباره عن تحميل دالة CombineRgn و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : عمل منطقة Elliptical او بيضاوية و هى اختصار لـ Combine Region و اسم المكتبة الاتيه منها الدالة هى GDI32 و وظيفة هذه الدالة هى دمج منطقتين و تخزين الدمج فى منطقة ثالثة و طريقة الدمج يتم اختيارها ... و معاملاتها كالتالى :


hDestRgn As Long :
اختصار لــ Handle Destination Region و هى تعريف لابعاد المنطقة الجديده بعد دمج منطقتين اخريين يجب تحديدهم أولا
hSrcRgn1 As Long :
اختصار لــ Handle Source Region و هى المنطقة الأولى المراد دمجها


hSrcRgn2 As Long :
و هى المنطقة الثانية المراد دمجها
CombineMode As Long:
و هو نوع الدمج و يكون أحد النتائج الاتية 
Rgn_AND
انشاء منطقة على شكل تقاطع بين المنطقتين الاولى و الثانية
Rgn_COPY 
انشاء منطقة عبارة عن : نسخه من المنطقة المحدده فى المعامل الاول 
hSrcRgn1
Rgn_Diff 
انشاء منطقة عبارة عن : الاجزاء من المنطقة الاولى و التى ليست جزءا من المنطقة الثانية .
Rgn_OR 
انشاء منطقة عبارة عن : اتحاد للمنطقتين المندمجتين
Rgn_XOR 

انشاء منطقة عبارة عن : اتحاد للمنطقتين المندمجتين ماعدا المناطق المتداخلة
Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
الكود السابق عباره عن دالة SetWindowRgn و يتم تحميل الدالة مثل الدالة السابقه....... وظيفة الدالة هو : تحديد منطقة الرسم أى "الابعاد التى سيبدأ منها الرسم و سينتهى اليها الرسم" و لا يقوم الـ Windows بالرسم خارج هذه المنطقة على سبيل المثال "عند فتح أى برنامج تكون منطقة الرسم هى ابعاد الفورم التى يبدأ عندها البرنامج و بالتالى أى كود يشمل رسومات خارج هذه المنطقة لا يقوم البرنامج بعرضة ." و هى اختصار لـ Set Window Region و اسم المكتبة الاتيه منها الدالة هى USER32 و معاملات هذه الدالة هى :
Hwnd As Long :
و هى Handle أو التعامل أو المنطقة المراد التعامل معها .
hRgn As Long :
تحديد منطقة العمل فى الـ Handle السابق "فى أى منطقة أو أى أبعاد سيتم التعامل معها" .


bRedraw As Boolean :
تحديد ما اذا كان الويندوز سيقوم برسم المنطقة المحدده مرة أخرى "المنطقة الجديده hRgn أم لا . اذا كانت True فان الويندوز ينفذ الرسم أذا كانت False فان الويندوز لا يقوم بالرسم المطلوب .



Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
الكود السابق عباره عن تحميل دالة DeleteObject و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : حذف اداة مثل (كائن الرسم Pen - كائن الرسم Brush - كائن الخط Font - كائن الصورة Bitmap - المناطق Region - مجموعات الالوان Palettes) حيث تقوم بتفريغ محتويات Resources الخاصة بالنظام و المتعلقة بالكائنات Objects السابقه و الـ Handle الخاص بها ايضا لا يعود له قيمة ." و هى اختصار لـ Delete Object و اسم المكتبة الاتيه منها الدالة هى GDI32 و معاملات هذه الدالة هى :
hObject As Long :
و هو الكائن أو الكائنات المراد حذفها .


Public Declare Function ReleaseCapture Lib "user32" () As Long
الكود السابق عباره عن تحميل دالة ReleaseCapture و يتم تحميل الدالة مثل الدالة السابقه و وظيفة الدالة هو : تحرير أداة الماوس من نطاق العمل الحالى الى نطاق عمله الطبيعى ." و هى اختصار لـ Release Capture و اسم المكتبة الاتيه منها الدالة هى USER32 و ليس لها معاملات .



 ' RGN_OR creates the union of combined regions
Public Const RGN_OR = 2
تعريف ثابت اسمه RGN_OR = 2 و هو أحد معاملات الدمج الخاص بنوع الدمج CombineMode للدالة CombineRgn حيث على سيتم تحديد نوع الدمج هنا .
 ' RGN_DIFF creates the intersection of combined regions
Public Const RGN_DIFF = 4
تعريف ثابت اسمه RGN_DIFF = 4 و هو أحد معاملات الدمج الخاص بنوع الدمج CombineMode للدالة CombineRgn حيث على سيتم تحديد نوع الدمج هنا .
Public Const WM_NCLBUTTONDOWN = &HA1
تعريف الثابت wm_nclbuttondown عباره عن رساله الى الويندوز حيث امكانية امساك الفورم بدون شريط عنوان من أى مكان .
Public Const HTCAPTION = 2
تعريف الثابت HTCAPTION = 2 عباره عن إمكانية تحريك الفورم بعد امساكها بالماوس من أى مكان
Public xp As Long, yp As Long
تعريف متغيرات xp , yp
Public mShape As Integer
تعريف متغير mShape


Sub Main()
الاجراء Main : و هو أول اجراء يتم تنفيذه فى البرنامج حيث عند كتابة Sub Main () فى موديول فانك بالتالى تخبر البرنامج أن هذا الاجراء سيتم تنفيذه أولا قبل أى سطر فى البرنامج أو أى Form
يحتوى الاجراء Main هنا على مجموعة أكواد مشروحه فى الاعلى .
سؤال : لماذا تم وضع (Program_Is_Already_Running) فى صيغة Function و ليس فى صيغة Sub ؟
الاجابه : Sub لا يعود بقيمه و لكن الدالة تعود بقيمة و الغرض من Program_Is_Already_Running هو تحديد قيمة من خلالها يتم التحكم و السيطره على عدم فتح البرنامج و هو قيد العمل .
و الاكواد السابقه معناها ان عند فتح البرنامج لأول مره تكون قيمة Program_Is_Already_Running تساوى False على حسب الداله الخاصه بها و لكن اذا ضغطنا على ايقونة البرنامج لتشغيلة مره أخرى فان الدالة تصبح قيمتها True و بالتالى تظهر رساله Program is already running أى ان البرنامج قيد التشغيل
If Program_Is_Already_Running Then
استدعاء الدالة Program_Is_Already_Running و تم عمل هذه الدالة فى الاسفل (مشروحه أقرئها أولا)
GoTo Noduplicate
توجه الى السطر : Noduplicate
End If
انتهت جملة الشرط
xp = Screen.TwipsPerPixelX
xp هو متغير عرفناه سابقا نوعه Long و سيتم تخزين قيمة Screen.TwipsPerPxelX فيه و Screen.TwipsPerPixelX هى : معامل لـلكائن Screen و هو الشاشة الحاليه و TwipsPerPixelX هو لتحويل وحدة القياس الاساسيه للشاشة Twips المتعامل معها من داخل الفيجوال بيزك الى وحدة قياس الرسم Pixel و الـ Pixel هو اصغر نقطة على الشاشة و هى وحدة قياس الشاشة الرئيسية بينما الـ Twips هو 1 على 20 من أى نقطة رسم و تساوى ايضا 1 على 1140 بوصه و Pixel هى اختصار لـ Picture Element بينما Twips هى اختصار لـ Twentieth Of a Point و Twips هى وحدة القياس الرئيسية للـ Visual Basic ايضا ....
اذا Xp يساوى قيمة Pixel للـ Screen التى تـــــــــم تحويلها من Twips أفقيـا (X)
yp = Screen.TwipsPerPixelY
المتغير Yp يساوى قيمة الـ Pixel للـ Screen التى تحويلها من Twips رأسيا (Y)
frmTranspForm.Show
اظهار الشاشة FrmTranspForm
Exit Sub
الخروج من الاجراء
Noduplicate:
السطر Noduplicate
MsgBox "Program is already running"
رساله للمستخدم تفيد : البرنامج قيد التشغيل
End Sub
نهاية الاجراء Main .
Function Program_Is_Already_Running()
الدالة Program_Is_Already_Running
Program_Is_Already_Running = False
قيمة الدالة هو False أى أن طبيعتها False
If (App.PrevInstance = True) Then
App.PreInstance فى جملة الشرط السابقه معناه : اذا كان البرنامج قيد العمل أو مفتوح بالفعل
Program_Is_Already_Running = True
فان قيمة الداله تكون True
End If
انتهت جملة الشرط
End Function
انتهت الدالة

شرح الدالة Program_Is_Already_Running و هى داله مصنوعه من المبرمج User Defined أى انها ليست اصليه فى الفيجوال بيزك Built-In-Function و الغرض منها التأكد من أن البرنامج لا يتم فتحه أكثر من مره فى نفس الوقت

Function UnloadIfExist(FormName As String) As Boolean
الدالة UnloadIfExist نوعها Boolean أى تحتمل نتيجتان فقط هما True او False اذا القيمة التى ستعود من هذه الدالة ستكون اما True أو False و الداله الحاليه لها معامل Parameter اسمه FormName نوعه String نصى اذا عند التعويض عن الداله يجب اعطاء قيمة للمتغير FormName .
و وظيفة هذه الدالة هو التأكد من عدم تحميل نفس الفورم مرتان و ذلك لأننا عندما نقوم بتشغيل البرنامج تكون الـ Form الرئيسية FrmTranspForm يمكن الوصول لها أى Active فى وقت ظهور اى شاشة أخرى بمعنى اننا لا نستخدم FrmTranspForm.Show 1 و هى داله يمكن الاستغناء عنها فى البرنامج اذا قمنا باستخدام الكود السابق FrmTranspForm.Show 1 حيث فى هذه الحاله قد نكون تأكدنا من عدم اظهار اكثر من Form لأن المفاتيح المستخدمه فى ذلك على FrmTranspForm تكون غير نشطه Inactive على الفورم الرئيسية .... قم بتجربة البرنامج فى كلتا الحالتان باستخدام الداله و باستخدام الكود FrmTranspForm.Show 1
    On Error Resume Next
استمر اذا اكتشفت خطأ ما
    Dim mloaded As Boolean
تعريف المتغير mloaded نوعه Bloolean
    mloaded = False
قيمة المتغير mloaded تساوى False
    Dim i As Integer
تعريف متغير i نوعه Integer رقمى
    For i = Forms.Count - 1 To 0 Step -1
عمل Loop باستخدام For معناه ( لكل i تساوى عدد الفورم فى المشروع - 1 الى 0 تخطى -1 )
    If UCase(Forms(i).Name) = UCase(FormName) Then
اذا كانت الحروف كابيتل لاسم الفورم(i) = الحروف كابيتل لاسم الفورم بالداله
    mloaded = True
اذا mloaded = True
    Unload Forms(i)
انهى عمل الفورم(i) .
    Exit For
الخروج من Loop
    End If
الخروج من جملة If
    Next
كرر العملية
    UnloadIfExist = mloaded
قيمة الداله UnloadIfExist تساوى قيمة mloaded
End Function
انهى الدالة
و هذا معناه انه اذا كان اسم الفورم الظاهره Active Form هو نفسه اسم الفورم المراد اظهاره مره اخرى اذا لا تقم بتحميل الفورم المراد اظهاره .و يمكن كما ذكرنا الاستغناء عن الداله باستخدام كود FrmTranspForm.Show 1 و ذلك سيؤدى الى جعل FrmTranspForm غير ممكن الوصول اليها فى حالة ظهور Form اخرى على الشاشة .

References :

Comments

VB6 Popular Posts

Free download Visual Basic 6 Documentation MSDN

Visual Basic Online Course - Function Keys (F1 to F12)

Visual Basic Online Course - ListView, Element not found while removing items