Visual Basic Online Course - Round and Transparent Form Part 2

لاحظ أننا لم نتكلم عن تصميم الفورم بعد حيث ان التصميم سيكون عادى جدا و لكن النتيجه ستكون مختلفه تماما لذا لن ندخل فى تفاصيل التصميم و لكن هذه هى صورة الفورم فى بيئة IDE او وضع التصميم فى Visual Basic 0.6 يمكنك رسمها ببساطه .

Visual Basic Online Course - Rounded and Transparent Form Example

frmTranspForm - IDE
frmTranspForm - Codes
Option Explicit
ما هى Option Explicit ؟
كما نعرف وظيفتها التأكد من أن جميع المتغيرات المستخدمه تم نعريفها مسبقا قبل استخدامها, بمعنى انك اذا كتبت كود مثل
(i = 2)
ثم
(MsgBox i)

على حدث (Form_Load) مثلا, فان عند تشغيل الفورم (تظهر رساله مكتوب بها (2) و لكن اذا اضفت فى منطقة التصريحات العامه الكود (Option Explicit) فان عند تشغيل الفورم (تظهر رساله خطأ من الفيجوال بيزك تفيد Variable Not Defined) أى أن المتغير i غير معرف فى المشروع أو البرنامج و ستضطر الى (تعريف المتغير i سواء فى منطقة التصريحات العامه أو فى الحدث Form_Load كالتالى) :
Dim i As Integer
أو
Dim i As String
كما تشاء و راع علامات التنصيص Quotations "" فى اعطاء قيمة i حيث اذا كان
i As String
فان
i = "2"
و لكن اذا كان
i As Integer
فستكون
i = 2
و فى جميع الحالات الرساله ستكون مضمونها (2) .
Dim formEffectIndex As Integer
تعريف المتغير formEffectIndex متغير رقمى Integer
Dim mFormRegion As Lon
تعريف المتغير mFormRegion متغير نوعه Long
Dim msg1 As String, msg2 As String
تعريف المتغير msg1 متغير نصى String و msg2 متغير نصى String
Private Sub Form_Load()
الحدث Form_Load للشاشة frmTranspForm
Me.ScaleMode = vbPixels

ScaleMode
هى : أحد خواص الـ Form بشكل عام و وظيفتها تحديد وحدة قياس الفورم أو أى اداة لها وحدة قياس او ScaleMode و من أنواع الـ ScaleModes أو وحدات القياس :

القيمة | الوصف
ScaleHeight - ScaleWidth - ScaleTop – ScaleLeft : و تفيد أن أحد خواص الـ (ScaleMode)
vbUser : يتم تحديدها من قبل المستخدم لاحقا
vbPixels : وحدة القياس Pixel اصغر وحدة قياس لشاشة أو طابعه
vbTwips : وحدة القياس Twip
vbPoints : وحدة القياس Point
vbCharacters :وحدة القياس Character
vbInches : وحدة القياس Inches البوصه
vbMillimeters : وحدة القياس Millimeter
vbCentimeters : وحدة القياس Centimeter

فى هذا المثال يتم تحديد وحدة قياس الفورم الى vbPixels أى أنه مهما كانت وحدة قياس الشاشة التى يعرض عليها البرنامج فان البرنامج سيعرض بالـ Pixel .

قيمة المتغير msg1 الذى عرفناه فى منطقة التصريحات العامه لهذه الفورم و القيمه هى نص و الـ (vbCrlf) هى تعادل سطر جديد أو (Enter) كما فى الكتابه على الوورد.قيمة المتغير msg2 الذى عرفناه فى منطقة التصريحات العامه لهذه الفورم و القيمه هى نص و الـ (vbCrlf) هى تعادل سطر جديد أو (Enter) كما فى الكتابه على الوورد.
formEffectIndex = 0
قيمة المتغير formEffectIndex الذى عرفناه فى منطقة التصريحات العامه لهذه الفورم و القيمه هى (صفر) .
Text1.Text = msg1
الـ Text1 على هذه الفورم قيمته تساوى Msg1
Command0.Visible = False
اخفاء الـ Command0 و الذى موجود فى اعلى الفورم و عنوانه Transparent Form عند بداية تحميل الفورم .
Command3.Enabled = False
خاصية Enabled = False للـ Command3 و الذى بعنوان Frame .
changeFormEffect formEffectIndex
الاجراء changeFormEffect و المعرف بمنطقة التصريحات العامه للفورم سيتم دراسته الان ... قيمته formEffectIndex و التى هى صفر عند بداية تحميل الشاشة .....
End Sub
نهاية اجراء Form_Load
Private Sub changeFormEffect(inEffect As Integer)
اجراء باسم changeFormEffect وله معامل (inEffect) نوعه Integer و هو الاجراء الذى بناءا عليه سيتم التحكم فى شكل الفورم الحاليه .

تعريف بعض المتغيرات فى الاجراء تمهيدا لاستخدامها حيث :
Single هو : أى رقم يحمل كسور عشريه
Integer هو : أى رقم صحيح بدون كسور عشريه
Long هو : أى رقم صحيح قيمته كبيره جدا بحيث الـ Integer لا يستطيع تخزينها .
w = ScaleX(Width, vbTwips, vbPixels)
h = ScaleY(Height, vbTwips, vbPixels)
فى هذه المعادله W تساوى ScaleX ... فما هو ScaleX ؟؟

ScaleX هو : من خواص الفيجوال بيزك حيث يقوم بتحويل قيمة طول أو عرض الفورم أو الطابعه أو PictureBox من وحدة القياس المعطاه بخاصية ScaleMode الى وحدة قياس أخرى.
المعادله :
object.ScaleX (width, fromscale, toscale)
object.ScaleY (height, fromscale, toscale)
شرح المعادله :
جزء المعادله | الشرح
Object : اختيارى . اذا لم يذكر الـ Object فانه يأخذ قيمة أى أداة نشطه على الفورم يفترض أنها هى الـ Object المطلوب
Width : مطلوب . عرض الـ Object المراد تحويل وحدة قياسه الى وحدة أخرى .
Height :مطلوب . طول الـ Object المراد تحويل وحدة قياسه الى وحدة أخرى .
fromscale : أختيارى . وحدة القياس المراد التحويل منها بالنسبه لطول أو عرض الـ Object . و هى قيمة اما أن تكون ثابته Constant أو قيمه عاديه لتحديد الأبعاد .
و القيم المحتملة (المعطاه) لـ fromscale هى نفسها المحدده بالجدول السابق (عناصر ScaleMode) بالاضافه الى القيمه الجديده HiMetric .
toscale : أختيارى . وحدة القياس المراد التحويل اليها بالنسبه لطول أو عرض الـ Object . و هى قيمة اما أن تكون ثابته Constant أو قيمه عاديه لتحديد الأبعاد . و القيم المحتملة (المعطاه) لـ fromscale هى نفسها المحدده بالجدول السابق (عناصر ScaleMode) بالاضافه الى القيمه الجديده HiMetric .
القيمة | الثابت | الشـــــــــــــــرح
0 vbUser : و تفيد أن أحد خواص الـ ScaleMode من ScaleHeight - ScaleWidth - ScaleTop
ScaleLeft يتم تحديدها من قبل المستخدم لاحقا
vbTwips 1 :  وحدة القياس Twip
vbPoints 2 :  وحدة القياس Point
vbPixels 3 : وحدة القياس Pixel اصغر وحدة قياس لشاشة
vbCharacters 4 :  وحدة القياس Character
vbInches 5 :  وحدة القياس Inch
vbMillimeters 6 : وحدة القياس Millimeteres
vbCentimeters 7 : وحدة القياس Centimeters
vbHimetric 8 : لتحديد حجم الأداه .
vbContainerPosition 9 : لتحديد وضع الأداه .
vbContainerSize 10 : لتحديد حجم الاداه
كلا الخاصيتان ScaleX و ScaleY يقوما بتحويل وحدة قياس بقيمه (طول أو عرض) حسب الخاصيه المستخدمه من Fromscale و تحويلها الى Toscale .

و بالعوده الى الكود السابق :
فان المتغير (w) قيمته تساوى قيمة العرض بوحدة قياس Pixel محوله من Twips و بالمثل بالنسبه للمتغير (h) للطول حيث كلا من (Height - Width) يخصان الفورم نفسها أى (Me.Height - Me.Width) ويمكنك التعويض بنفسك و لن يكون هناك فرق .
inEffect
هو معامل الاجراء changeFormEffect و هو الاجراء المسؤل عن تغيير شكل الفورم الحاليه فاذا كانت قيمته = صفر فان :
1) المتغير (mFormRegion) و الذى من نوع Long يساوى الداله (CreateRectRgn) و التى تم تعريفها فى الموديول و هنا يتم تفسير معاملاتها كالتالى :
x1 = 0 أى ان نقطة بداية خط العرض من اعلى اليسار الى اليمين هى صفر
y1 = 0 أى ان نقطة بداية خط الطول من اعلى الى اسفل من اليسار هى صفر (نفس النقطه السابقه)
x2 = w أى ان نقطة بداية خط العرض من اسفل اليسار الى اليمين و هى نقطة بداية الـ w (عرض الفورم)
y2 = h أى ان نقطة بداية خط الطول من اسفل اليمين الى اعلى و هى نقطة بداية الـ h (طول الفورم)
Visual Basic Online Course - Rounded Form
Visual Basic Online Course - Rounded Form
2) ثم الدالة SetWindowRgn و التى عرفناها فى الموديول و هى كما ذكرنا وظيفتها تحديد منطقة بداية الرسم و منطقة نهاية الرسم التى لا يخرج النظام عنها عند تحديدها و هنا قيمتها هى :
hwnd هى مكان الرسم و هنا هو (الفورم) لذا كتبنا hwnd مباشرة كان ممكن (me.hwnd)
hRgn و قيمتها mFormRegion وهى الأبعاد المراد التعامل معها و هى واضحه فى سطر الكود السابق حيث لدينا (4) ابعاد تم تحديدهم عن طريق الداله السابقه CreateRectRgn
bRedraw و هى قيمتها True مما يعنى أن النظام سيقوم بالرسم بالفعل ليس فقط التحديد .
3) الخروج من جملة الشرط IF .
- لاحظ فى الـ Form_Load القيمة formEffectIndex = 0 ثم تنفيذ الاجراء changeFormEffect formEffectIndex بمعنى انه فى بداية تحميل الفورم فان قيمة inEffect و التابعه للاجراء ChangeFormEffect = 0 اى ان شرط IF سيتحقق أولا .
mFormRegion = CreateRectRgn(0, 0, 0, 0)
قيمة الـ mFormRegion = الدالة CreateRectRgn و لكن فى هذه الحاله تساوى 0 حيث ان ابعاد الداله أو ابعاد المنطقة المستطيلة تبدأ كما تبدأ الفورم من نفس النقاط .
edge = (w - ScaleWidth) / 2
topEdge = h - edge - ScaleHeight
الـ Edge هى الحروف التى يستطيع الماوس الامساك بالفورم منها عندما تكون شفافه مثلا .
و يجب ملاحظة التالى :
الفرق بين ScaleWidth أو ScaleHeight و بين Width و Height : انت تعلم أن الفورم 3D اى انك عندما تنظر اليها تكون بارزة من الاحرف و كانها ثلاثية الأبعاد و هو ما يسمى بالـ Bevel و هذا الـ Bevel يكون عبارة عن الفرق بين الـ ScaleHeight مثلا و الـ Height أى أن الـ ScaleHeight هو طول الفورم الداخلى و الـ Height هو الطول الخارجى أو الطول عموما و كذا بالنسبة للعرض .... انظر الصورة !
Rounded Form
visual Basic online Course - Rounded Form
و بالتالى فان :
Edge هنا يمثل (اجمالى العرض - العرض الداخلى) \ 2 ...... يمكنك تغيير الرقم 2 لكى ترى نتائج مختلفه بنفسك
Topedge هنا يمثل (اجمالى الطول - الأحرف - الطول الداخلى) ......
اذا كان inEffect = 1 فان :
1) outer = الداله CreateRectRgn حيث outer متغير Single مثل mFormRegion يقوم بنفس الوظيفة
2) inner = الداله CreateRectRgn حيث inner متغير Single و قيمة متغيرات الداله هى (edge,topedge,w-edge,h.edge) ... و معناه ان حدود أو حروف المنطقة المستطيلة ستختفى أو ستظهر (على حسب) عند تحقق الشرط inEffect = 1
3) الداله CombineRgn كما شرحناها فى أكواد الموديول سابقا حيث يتم دمج منطقتين و يتم تخزين الدمج فى منطقة ثالثه أو ثابت الدالة Rgn_DIFF "المنطقة الثالثه عباره عن الاجزاء من المنطقه الاولى و التى ليست جزءا من المنطقة الثانيه أو Elliptical" حيث المعاملات هنا كالتالى :
أ) تعريف ابعاد المنطقة الجديده (الثالثه) عن طريق المتغير mFormRegion
ب) المنطقة الأولى المراد دمجها Outter
ج) المنطقة الثانيه المراد دمجها Inner
د) نوع الدمج RGN_DIFF
4) انتهاء جملة الشرط .
جملة For .... Next :
لكل (i المتغير الرقمى) = 0 الى (عدد الأدوات على الفورم) - 1
اذا كان الاداه(ذات الرقم i) خاصية ظهورها فعاله .... اذا
mLeft = (قم بتحويل القيمة بالـ Pixel الى قيمة "تحديد بداية يسار الاداه ذات الرقم i" من القيمة بالمقياس الحالى) + الحافه
mTop = (قم بتحويل القيمة بالـ Pixel الى قيمة "تحديد بداية أعلى الاداه ذات الرقم i" من القيمة بالمقياس الحالى) + الحافه
r = الدالة CreateRectRgn حيث المعاملات هى :
1) نقطة بداية الرسم من اليسار الى اليمين افقى (أعلى المستطيل) = mLeft
2) نقطة بداية الرسم من أعلى الى اسفل طولى (يسار المستطيل) = mTop
3) نقطة بداية الرسم من اليسار الى اليمين افقى (اسفل المستطيل) = mLeft + mLeft اخرى
4) نقطة بداية الرسم من أعلى الى الاسفل طولى (يمين المستطيل) = mTop + mTop اخرى
أى أن (r) يمثل مستطيل له هذه الأبعاد .
الدالة CombineRgn كما شرحنا من قبل .
انتهاء الشرط .
SetWindowRgn hwnd, mFormRegion, True
الدالة SetWindowRgn كما ذكرنا وظيفتها هى رسم المنطقة كما تم تحديدها بالمعاملات .
End Sub
انتهى الاجراء changeFormEffect
Private Sub Command1_Click()
End
End Sub
هو مفتاح Exit حيث يتم الخروج من البرنامج .
هو مفتاح Transp أو المسؤل عن شفافية الفورم كما سنشرح طريقة عملة .
جملة شرط if
اذا كان المتغير formEffectIndex لا يساوى صفر .... اذا أو "بناء عليه"
اجعل قيمة formEffectIndex = صفر
قيمة Text1 تساوى msg1
اخفاء Command0 و هو المفتاح المكتوب عليه Transparent Form أعلى الفورم
انهاء فاعلية Command3 و هو المفتاح المكتوب عليه Frame .
اذا لم يتحقق الشرط أى أن قيمة المتغير تساوى اى شىء غير صفر ... قم بتنفيذ بديل وهو
اجعل قيمة المتغير formEffectIndex = 1
قيمة Text1 تساوى msg2
اظهار Command0 و هو المفتاح المكتوب عليه Transparent Form أعلى الفورم
تفعيل المفتاح Command3 و هو المفتاح المكتوب عليه Frame .
نفذ الاجراء changeFormEffect حيث المعامل هو formEffectIndex .
ذكرنا أنه عند تحميل الفورم فان قيمة المتغير formEffectIndex تكون تساوى صفر و بالتالى :
عند بدأ تحميل الفورم فى الـ Command2 اذا قمنا بالضغط عليه فان جملة الشرط تبدأ من Else لأن formEffectIndex يساوى صفر و بالتالى تجد أن جملة الشرط جعلت قيمة formEffectIndex تساوى 1 و تنفذ الاجراء changeFormEffect حيث formEffectIndex تساوى 1 و عند النظر على الاجراء changeFormEffect فى حالة أن معامله يساوى 1 نجد أن :
1) يحدد منطقه outer مستطيله أولى تساوى مستطيل الفورم بالكامل (متضمنه الاحرف)
2) يحدد منطقة inner مستطيله ثانيه تساوى مستطيل الفورم و لكن من الداخل فقط (بدون الأحرف)

3) عمل دمج
المنطقه الثالثه mFormRegion
المنطقة الأولى outer
المنطقة الثانيه inner
نوع الدمج Rgn_DIFF كما وضحنا حيث لا يظهر الا الأحرف فقط و الأدوات
ثم يستكمل الاجراء For ... Next حتى End Sub
- المفتاح Command3 باسم Frame أو الحواف .
عند الضغط عليه تنفذ جملة شرط حيث :
اذا كان formEffectIndex = 1 بالتالى
اجعل قيمته = 2
اذا لم تكن تساوى 1
اجعلها تساوى 1
اخرج من الشرط .
نفذ الاجراء changeFormEffect. 


المفتاح Command4 : و هو عباره عن Array عن الضغط على أى Index من الـ Array أو بمعنى أصح اذا غطنا على أى مفتاح من مفاتيح Command4 فان المتغير mShape يساوى Index أو قيمة Index المفتاح المضغوط عليه الان . ثم تنفيذ الاجراء UnLoadIfExist حيث الفورم هى frmShapedForm اظهار الفورم frmShapedForm . 

و الـحدث QueryUnload يتم قبل الحدث Unload حيث يتم انهاء العمل بجميع الفورم الـ mdi ثم الـ mdiChild بمعنى أوضح أن هذا الحدث هو حدث الضغط على علامة X فى شريط عنوان الفورم .
و الـحدث Form_MouseDown اى الضغط بزر الماوس على الفورم :اذا كان المفتاح ليس (المفتاح الأيسر للماوس) فبالتالى  اخرج من الاجراء و من جملة الشرط .تنفيذ الدالة ReleaseCapture "الماوس الحالى خارج الخدمه" 
ارسال رساله للنظام (الويندوز) ان الماوس يعمل الأن على الفورم Me.hwnd و أن مضمون الرساله هو (زر الماوس مضغوط عليه

و المفتاح Command0 ايضا عند الضغط عليه بزر الماوس الايسر يمكنك تحريك الفورم عن طريقه .

Comments

  1. I used to be able to find good advice from your blog articles.


    Have a look at my webpage - TerranceZLeiss

    ReplyDelete
  2. You could definitely see your expertise within the work you write.
    The sector hopes for even more passionate writers such as
    you who are not afraid to mention how they believe. At all times
    follow your heart.

    Feel free to surf to my page - CletaURuyz

    ReplyDelete
  3. Heya! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up losing several weeks of hard work due
    to no backup. Do you have any methods to prevent hackers?


    my homepage; WilheminaGDefries

    ReplyDelete
  4. I like the valuable info you provide in your articles.

    I'll bookmark your blog and check again here frequently. I'm
    quite sure I will learn lots of new stuff right here!
    Best of luck for the next!

    Review my website - WillianJMassaglia

    ReplyDelete
  5. Awesome issues here. I am very happy to peer your post.
    Thank you a lot and I am looking forward to contact you.

    Will you please drop me a mail?

    My site :: GaleZTerhark

    ReplyDelete
  6. Hi there, yes this piece of writing is genuinely good and I have learned lot
    of things from it concerning blogging. thanks.

    Feel free to visit my blog :: DesiraeEBaros

    ReplyDelete
  7. This is my first time visit at here and i am in fact happy to read all at one place.



    Here is my weblog: BenedictNGignac

    ReplyDelete
  8. I’m not that much of a online reader to be honest but your blogs really nice, keep it
    up! I'll go ahead and bookmark your site to come back later.
    All the best

    Here is my web-site; DorthaCWilden

    ReplyDelete

Post a Comment

visual basic 6 source code says (Hi)

VB6 Popular Posts

VB 0.6 TreeView Control lesson Part3

vb6 ms-access 2003 design phonebook 2

Free download Visual Basic 6 Documentation MSDN