hamata00
12-08-2006, 08:32 PM
http://www.9o9i.com/uploads/5f64be0b4c.gifاخواني في منتدى الفجوال بيسك السلام عليكم
اود ان اتطرق الى موضوع الرسم في الفورم في لغة الفيجوال بيسك
و ارجو ان ينال رضاكم و ارجو المشاركة من الاخوة المختصين
اولا من الصيغ الاساسية للتعامل مع الالوان الدالتين
pset( , )
point( , )
و هما عكس بعضهما
فالدالة الاولى تقوم بارسال لون لنقطة محددة مثلا
CODE
pset(100,100)
ترسل الي النقطة ذات الاحداثيات (100و100) لونا =لون الخط في الفورم
form1.forecolor
والوضع الطبيعي هو اللون الاسود ما لم يغيره المستخدم
بالنسبة للاحداثيات في الشاشة :
تعتبر النقطة اعلى يسار الشاشة هي النقطة (0و0)والتدرج يذداد كلما اتجهنا يمينا او الى اسفل
اي ان المحور الراسى معكوس من ما معتاد لنا في الرسم البياني
نعود الان الى الالوان ونفرض اننا نريد ان نضع نقطة بيضاء في النقطة (50و150) فيصبح الكود
CODE
pset(50,150),vbwhite
ستلاحظ ان النقطة صغيرة جدا و يمك التحكم في حجم النقطة عن طريق
CODE
form1.drawwidth=7
و وضع اي رقم بدلا 7 التي في المثال
بالنسبة للالوان توجد عدة طرق لكتابتها ..اشهرها
vbcolor
مثل
vbwhite,vbred , vbblack
و غيرها من الالوان و لكن في بعض الاحيان تحتاج لدرجة لون محددة و هنا نستعمل
rgb( , , )
و هي الحروف الاولى للالوان احمر اخضر و ازرق
فنضع في البارميتر درجة كل لون من الالوان الثلاث ( وهي الالوان الاساسية ) لنحصل على درجة اللون المطلوب
مع ملاحظة ان درجة اللون تتدرج من 0 الى 255
الصيغة point
تقوم بالعملية العكسية فباختيار اي نقطة تقوم هذه الدالة بارجاع درجة لونها
لنجرب الان هذا المثال
CODE
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
form1.drawwidth=7
pset(x,y),rgb(100,100,100)
end sub
سيقوم البرنامج برسم خطوط متقطعة اقرب الى نقاط متقطعة مع حركة الماوس
لمعالجة التقاطعات نستعمل دالة اخرى و هى
line(,)-(,)
وباعطاء احداثيات نقطتين يتم رسم خط بينهما مثلا
مع اضافة
text1 and text2 to the form
CODE
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End Sub
مواصلة لما انقطع من حديث سأعدل في اخر مثال
و قد كان يرسم خطوطا كلما تحرك الماوس
و نود الان ان نحكم ذلك بالا يرسم ما لم يضغط المستخدم على الماوس
اولا نحتاج الى متغيير
global
و لنسمه
x1
(أي أنه متاح لكل جزئيات الفورم)
نصرح عن المتغيير في اعلى الكودفي جزئية
general
الان سنعطى هذا المتغيير القيمة 1 اذا كان الماوس مضغوطا و القيمة 0 في غير ذلك
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
الان سنعيد نفس الكود في الدرس السابق مع مراعاة التنفيذ اذا كان المتغيير =1
ليصبح كل الكود كما يلي
CODE
dim x1 as integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
if x1=1 then
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End if
End Sub
مع مراعاة ان الفورم يجب ان يحتوي على
text1 and text2
الان وصلنا الى رسم اشكال مثل الدائرة
و صيغة رسم الدائرة بسيطة
CODE
circle(x,y),(100)
حيث البارمترين الاولان للمركز و البارميتر الثالث لنصف القطر
يمكنك قبل ان تحدد لون المحيط بالصيغة
form1.forecolor=(color)
مثلا
او
circle(x,y),(200),vbwhite
اما لون التعبئةفبالصيغة
form1.fillcolor=(color)
و لكن لاضافة تعبئة فعليك ان تختار واحدة من ثمانية انواع للتعبئة
0 وهي تعبئة كاملة
1 بدون تعبئة او شفاف
2 خطوط افقية
3 خطوط راسية
4-5 خطوط مائلة
6 خطوط متقاطعة
7 خطوط متقاطعة مائلة
لتعبئة خطوط متقاطعة مثلا نستعمل الصيغة
CODE
form1.fillstyle=6
يمكن ادراج جزء من الدائرةوذلك باضافة عدد بين 0 الى 6 بعد صيغة الرسم للدائرة و ذلك كالاتي
CODE
circle(x,y),(100),,3
وصلنا الان الى حفظ الرسم و صيغته
CODE
SavePicture Form1.Image,"C:\flower.bmp"
نلاحظ انه يقبل بارمترين ..الثاني نكتب فيه المسار و اسم الرسم مع الامتداد
اذا اردت اعطاء المستخدم حرية مسار الحفظ نستعمل من components الاداة ms common dialog
مع استعمال الصيغة .save في كود الحفظ
اود الان ان اضيف جملتين لاحد الاكواد المكتوبة لتزيد من امكانية البرنامج
CODE
dim x1 as integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Text = X
Text2.Text = Y
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
if x1=1 then
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End if
End Sub
لاحظ اننا اضفنا قيم لtext1 , text2 داخل كود ال MouseUp
بحيث انه يمكن رسم خطوط منفصلة كلما ضغطنا الماوس ضغطة جديدة
الان حاول ان ترسم اي شيء ثم قم بتصغير الفور م minimize ثم اعده ستلاحظ ان الرسم قد اختفى ...لتحاشي اختفاء الرسم اضف السطر التالي في الform_load
CODE
Form1.AuteRedraw=True
لننتقل الان الى مرحلة اخرى و هي التحكم بصور موجودة اصلا في الجهاز
و هنا سنعود الى الصيغة point()
المثال الاول سندرج صورة الى الفورم ثم نقوم بنسخ صورة منها على نفس الفورم
لنسمي الصورة image1
ثم نستعمل الكود التالي
CODE
Private Sub Command1_Click()
Dim x
Image1.Stretch = True
Image1.Move 0, 0, 2000, 1000
For i = 0 To 2000 Step 10
For j = 0 To 1000 Step 10
x = Point(i, j)
PSet (i, j + 2000), x
Next
Next
End Sub
كل ما تحتاجه هنا command و image
اما في حالة اردنا نسخ الصورة بشرط ان تكون النسخة معكوسة
نستعمل الكود السابق مع هذا التعديل
CODE
Private Sub Command1_Click()
Dim x
Image1.Stretch = True
Image1.Move 0, 0, 2000, 1000
For i = 2000 To 0 Step -10
For j = 0 To 1000 Step 10
x = Point(i, j)
PSet (2000 - i, j + 2000), x
Next
Next
End Sub
ساحاول ان اوجز بعض الدروس في الحركة
لنفرض اننا نريد ان نرسم دائرة سوداء تتحرك
نستعمل التايمر و نجعل خاصية الenabled = false و خاصية interval=50
ثم نضيف زر للفورم اضف الكود التالي
CODE
Dim x As Integer
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Cls
x = x + 100
Circle (x, 5000), (500)
End Sub
الامر cls يقوم بمسح محتويات الشاشة من رسومات و كتابة الان داخل كود التايمر لاحظ الاتي اولا نمسح محتويات الشاشة ثانيا المتغير x و هو الاحداثي السيني لمركز الدائرة نقوم بتغييره بمقدار معين و نرسم الدائرة الجديدة بعد تغيير الاحداثي السيني
لاحظ انه يمكن تغيير كل من الارقام و الاحداثي الصادي لنجعل التحرك في اتجاهات مختلفة
انتهي الدرس
البرنامج برعايه:0
1.hamata00
2.ahmed ksnv
اود ان اتطرق الى موضوع الرسم في الفورم في لغة الفيجوال بيسك
و ارجو ان ينال رضاكم و ارجو المشاركة من الاخوة المختصين
اولا من الصيغ الاساسية للتعامل مع الالوان الدالتين
pset( , )
point( , )
و هما عكس بعضهما
فالدالة الاولى تقوم بارسال لون لنقطة محددة مثلا
CODE
pset(100,100)
ترسل الي النقطة ذات الاحداثيات (100و100) لونا =لون الخط في الفورم
form1.forecolor
والوضع الطبيعي هو اللون الاسود ما لم يغيره المستخدم
بالنسبة للاحداثيات في الشاشة :
تعتبر النقطة اعلى يسار الشاشة هي النقطة (0و0)والتدرج يذداد كلما اتجهنا يمينا او الى اسفل
اي ان المحور الراسى معكوس من ما معتاد لنا في الرسم البياني
نعود الان الى الالوان ونفرض اننا نريد ان نضع نقطة بيضاء في النقطة (50و150) فيصبح الكود
CODE
pset(50,150),vbwhite
ستلاحظ ان النقطة صغيرة جدا و يمك التحكم في حجم النقطة عن طريق
CODE
form1.drawwidth=7
و وضع اي رقم بدلا 7 التي في المثال
بالنسبة للالوان توجد عدة طرق لكتابتها ..اشهرها
vbcolor
مثل
vbwhite,vbred , vbblack
و غيرها من الالوان و لكن في بعض الاحيان تحتاج لدرجة لون محددة و هنا نستعمل
rgb( , , )
و هي الحروف الاولى للالوان احمر اخضر و ازرق
فنضع في البارميتر درجة كل لون من الالوان الثلاث ( وهي الالوان الاساسية ) لنحصل على درجة اللون المطلوب
مع ملاحظة ان درجة اللون تتدرج من 0 الى 255
الصيغة point
تقوم بالعملية العكسية فباختيار اي نقطة تقوم هذه الدالة بارجاع درجة لونها
لنجرب الان هذا المثال
CODE
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
form1.drawwidth=7
pset(x,y),rgb(100,100,100)
end sub
سيقوم البرنامج برسم خطوط متقطعة اقرب الى نقاط متقطعة مع حركة الماوس
لمعالجة التقاطعات نستعمل دالة اخرى و هى
line(,)-(,)
وباعطاء احداثيات نقطتين يتم رسم خط بينهما مثلا
مع اضافة
text1 and text2 to the form
CODE
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End Sub
مواصلة لما انقطع من حديث سأعدل في اخر مثال
و قد كان يرسم خطوطا كلما تحرك الماوس
و نود الان ان نحكم ذلك بالا يرسم ما لم يضغط المستخدم على الماوس
اولا نحتاج الى متغيير
global
و لنسمه
x1
(أي أنه متاح لكل جزئيات الفورم)
نصرح عن المتغيير في اعلى الكودفي جزئية
general
الان سنعطى هذا المتغيير القيمة 1 اذا كان الماوس مضغوطا و القيمة 0 في غير ذلك
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
الان سنعيد نفس الكود في الدرس السابق مع مراعاة التنفيذ اذا كان المتغيير =1
ليصبح كل الكود كما يلي
CODE
dim x1 as integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
if x1=1 then
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End if
End Sub
مع مراعاة ان الفورم يجب ان يحتوي على
text1 and text2
الان وصلنا الى رسم اشكال مثل الدائرة
و صيغة رسم الدائرة بسيطة
CODE
circle(x,y),(100)
حيث البارمترين الاولان للمركز و البارميتر الثالث لنصف القطر
يمكنك قبل ان تحدد لون المحيط بالصيغة
form1.forecolor=(color)
مثلا
او
circle(x,y),(200),vbwhite
اما لون التعبئةفبالصيغة
form1.fillcolor=(color)
و لكن لاضافة تعبئة فعليك ان تختار واحدة من ثمانية انواع للتعبئة
0 وهي تعبئة كاملة
1 بدون تعبئة او شفاف
2 خطوط افقية
3 خطوط راسية
4-5 خطوط مائلة
6 خطوط متقاطعة
7 خطوط متقاطعة مائلة
لتعبئة خطوط متقاطعة مثلا نستعمل الصيغة
CODE
form1.fillstyle=6
يمكن ادراج جزء من الدائرةوذلك باضافة عدد بين 0 الى 6 بعد صيغة الرسم للدائرة و ذلك كالاتي
CODE
circle(x,y),(100),,3
وصلنا الان الى حفظ الرسم و صيغته
CODE
SavePicture Form1.Image,"C:\flower.bmp"
نلاحظ انه يقبل بارمترين ..الثاني نكتب فيه المسار و اسم الرسم مع الامتداد
اذا اردت اعطاء المستخدم حرية مسار الحفظ نستعمل من components الاداة ms common dialog
مع استعمال الصيغة .save في كود الحفظ
اود الان ان اضيف جملتين لاحد الاكواد المكتوبة لتزيد من امكانية البرنامج
CODE
dim x1 as integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Text = X
Text2.Text = Y
x1=1
end sub
Private Sub Form_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
x1=0
end sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.ForeColor = vbRed
if x1=1 then
Line (X, Y)-(Val(Text1.Text), Val(Text2.Text))
Text1.Text = X
Text2.Text = Y
End if
End Sub
لاحظ اننا اضفنا قيم لtext1 , text2 داخل كود ال MouseUp
بحيث انه يمكن رسم خطوط منفصلة كلما ضغطنا الماوس ضغطة جديدة
الان حاول ان ترسم اي شيء ثم قم بتصغير الفور م minimize ثم اعده ستلاحظ ان الرسم قد اختفى ...لتحاشي اختفاء الرسم اضف السطر التالي في الform_load
CODE
Form1.AuteRedraw=True
لننتقل الان الى مرحلة اخرى و هي التحكم بصور موجودة اصلا في الجهاز
و هنا سنعود الى الصيغة point()
المثال الاول سندرج صورة الى الفورم ثم نقوم بنسخ صورة منها على نفس الفورم
لنسمي الصورة image1
ثم نستعمل الكود التالي
CODE
Private Sub Command1_Click()
Dim x
Image1.Stretch = True
Image1.Move 0, 0, 2000, 1000
For i = 0 To 2000 Step 10
For j = 0 To 1000 Step 10
x = Point(i, j)
PSet (i, j + 2000), x
Next
Next
End Sub
كل ما تحتاجه هنا command و image
اما في حالة اردنا نسخ الصورة بشرط ان تكون النسخة معكوسة
نستعمل الكود السابق مع هذا التعديل
CODE
Private Sub Command1_Click()
Dim x
Image1.Stretch = True
Image1.Move 0, 0, 2000, 1000
For i = 2000 To 0 Step -10
For j = 0 To 1000 Step 10
x = Point(i, j)
PSet (2000 - i, j + 2000), x
Next
Next
End Sub
ساحاول ان اوجز بعض الدروس في الحركة
لنفرض اننا نريد ان نرسم دائرة سوداء تتحرك
نستعمل التايمر و نجعل خاصية الenabled = false و خاصية interval=50
ثم نضيف زر للفورم اضف الكود التالي
CODE
Dim x As Integer
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Cls
x = x + 100
Circle (x, 5000), (500)
End Sub
الامر cls يقوم بمسح محتويات الشاشة من رسومات و كتابة الان داخل كود التايمر لاحظ الاتي اولا نمسح محتويات الشاشة ثانيا المتغير x و هو الاحداثي السيني لمركز الدائرة نقوم بتغييره بمقدار معين و نرسم الدائرة الجديدة بعد تغيير الاحداثي السيني
لاحظ انه يمكن تغيير كل من الارقام و الاحداثي الصادي لنجعل التحرك في اتجاهات مختلفة
انتهي الدرس
البرنامج برعايه:0
1.hamata00
2.ahmed ksnv
