hishamnasr

دروس في الرسم بالفجوال بيسك

36 ردود في هذا الموضوع

اخواني في منتدى الفجوال بيسك السلام عليكم

اود ان اتطرق الى موضوع الرسم في الفورم في لغة الفيجوال بيسك

و ارجو ان ينال رضاكم و ارجو المشاركة من الاخوة المختصين

اولا من الصيغ الاساسية للتعامل مع الالوان الدالتين

pset( , )

point( , )

و هما عكس بعضهما

فالدالة الاولى تقوم بارسال لون لنقطة محددة مثلا

pset(100,100)

ترسل الي النقطة ذات الاحداثيات (100و100) لونا =لون الخط في الفورم

form1.forecolor

والوضع الطبيعي هو اللون الاسود ما لم يغيره المستخدم

بالنسبة للاحداثيات في الشاشة :

تعتبر النقطة اعلى يسار الشاشة هي النقطة (0و0)والتدرج يذداد كلما اتجهنا يمينا او الى اسفل

اي ان المحور الراسى معكوس من ما معتاد لنا في الرسم البياني

نعود الان الى الالوان ونفرض اننا نريد ان نضع نقطة بيضاء في النقطة (50و150) فيصبح الكود

pset(50,150),vbwhite

ستلاحظ ان النقطة صغيرة جدا و يمك التحكم في حجم النقطة عن طريق

form1.drawwidth=7

و وضع اي رقم بدلا 7 التي في المثال

بالنسبة للالوان توجد عدة طرق لكتابتها ..اشهرها

vbcolor

مثل

vbwhite,vbred , vbblack

و غيرها من الالوان و لكن في بعض الاحيان تحتاج لدرجة لون محددة و هنا نستعمل

rgb( , , )

و هي الحروف الاولى للالوان احمر اخضر و ازرق

فنضع في البارميتر درجة كل لون من الالوان الثلاث ( وهي الالوان الاساسية ) لنحصل على درجة اللون المطلوب

مع ملاحظة ان درجة اللون تتدرج من 0 الى 255

الصيغة point

تقوم بالعملية العكسية فباختيار اي نقطة تقوم هذه الدالة بارجاع درجة لونها

لنجرب الان هذا المثال

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

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

وللحديث بقية نواصلها قريبا إن شاء الله:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

مواصلة لما انقطع من حديث سأعدل في اخر مثال

و قد كان يرسم خطوطا كلما تحرك الماوس

و نود الان ان نحكم ذلك بالا يرسم ما لم يضغط المستخدم على الماوس

اولا نحتاج الى متغيير

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

ليصبح كل الكود كما يلي

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

وللحديث بقية نواصلها قريبا إن شاء الله:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الان وصلنا الى رسم اشكال مثل الدائرة

و صيغة رسم الدائرة بسيطة

circle(x,y),(100)

حيث البارمترين الاولان للمركز و البارميتر الثالث لنصف القطر

يمكنك قبل ان تحدد لون المحيط بالصيغة

form1.forecolor=(color)

مثلا

او

circle(x,y),(200),vbwhite

اما لون التعبئةفبالصيغة

form1.fillcolor=(color)

و لكن لاضافة تعبئة فعليك ان تختار واحدة من ثمانية انواع للتعبئة

0 وهي تعبئة كاملة

1 بدون تعبئة او شفاف

2 خطوط افقية

3 خطوط راسية

4-5 خطوط مائلة

6 خطوط متقاطعة

7 خطوط متقاطعة مائلة

لتعبئة خطوط متقاطعة مثلا نستعمل الصيغة

form1.fillstyle=6

يمكن ادراج جزء من الدائرةوذلك باضافة عدد بين 0 الى 6 بعد صيغة الرسم للدائرة و ذلك كالاتي

circle(x,y),(100),,3

بقي لنا ان نتحكم اكثر بالرسم و كيفية حفظه باسم معين وهذا موضوعنا المرة القادمة ان شاء الله:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي hishamnasr

أشكرك على هذه الدروس الجميلة ..

وسأقوم بتثبيت الموضوع نظراً لأهميته وأسلوبه السهل في الشرح

بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

وصلنا الان الى حفظ الرسم و صيغته

SavePicture  Form1.Image,"C:\flower.bmp"

نلاحظ انه يقبل بارمترين ..الثاني نكتب فيه المسار و اسم الرسم مع الامتداد

اذا اردت اعطاء المستخدم حرية مسار الحفظ نستعمل من components الاداة ms common dialog

مع استعمال الصيغة .save في كود الحفظ

اود الان ان اضيف جملتين لاحد الاكواد المكتوبة لتزيد من امكانية البرنامج

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

Form1.AuteRedraw=True

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

لننتقل الان الى مرحلة اخرى و هي التحكم بصور موجودة اصلا في الجهاز

و هنا سنعود الى الصيغة point()

المثال الاول سندرج صورة الى الفورم ثم نقوم بنسخ صورة منها على نفس الفورم

لنسمي الصورة image1

ثم نستعمل الكود التالي

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

اما في حالة اردنا نسخ الصورة بشرط ان تكون النسخة معكوسة

نستعمل الكود السابق مع هذا التعديل

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

البرنامج يوضح كيفية رسم بعض الدوال الرياضية

math.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

اليكم هذه الافكار لرسم اعلا 3 دول

تابع الطريقة لترسم علم بلدك

flags.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكور أخي على هذا الجهد ..

وأقترح عليك أن تتوسع أكثر في الشروحات .. فتقوم بشرح كيفية رسم بعض الأشكال مثل (القطع الناقص - القطع الزائد - القطه المكافئ .. الخ )

شرح تحريك الرسوم مثال (عقارب ساعة - كرة ترتد من حواف النافذة .. الخ )

شرح الألوان وتركيبها وتفكيكها

أرجو أن يكون لك الوقت لتشرح هذه الأمور لكي يصبح هذا الدرس من أقوى الدروس في مجال الرسوم على الإطلاق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الدروس باذن لم تنتهي فقط انا انشغلت بالدراسة

و لكن العديد من الاشياء لم تغطى بعد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

اعتذر على انقطاعي في الفترة السابقة لانشغالي بالدراسة و اقتراب الامتحانات

ساحاول ان اوجز بعض الدروس في الحركة

لنفرض اننا نريد ان نرسم دائرة سوداء تتحرك

نستعمل التايمر و نجعل خاصية الenabled = false و خاصية interval=50

ثم نضيف زر للفورم اضف الكود التالي

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ماشاء الله ,, ممتاز حقا ,, أتمنمى أن تستمر ,, ولاثقل على نفسك ,, فقط تذكر أن أحب الأعمال الى الله أدومها ,, وان قل ,,

فأتمنى أن تستمر ,,

وفقك الله :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

اخواني في المنتدى و الله اعتذر جدا عن انقطاعي و لكن ظروف الامتحانات هي الحائل بيني و بينكم و اعدكم ان شاء الله المواصلة قريبا جدا

بس اخلص الامتحانات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك يا هشام على الدروس ، ومزيدا من الإفادة والإستفادة بإذن الله.

وبالتوفيق.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكور اخى على الدروس

جزاك الله كل خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

لننتقل الان الى موضوع اخر مع بعده البسيط عن الرسم

الا و هو الحركة في الفورم

اولا : الحركة الافقية و الراسية

و هنا نستعمل الامر

TOP ,LEFT

Private Sub Command1_Click()
Command1.Left = 0
End Sub

الكود السابق يحرك الزر الي يسار الشاشة عند النقر عليه

و كما ذكرنا سابقا فان الاحداثيات في جميع لغات البرمجة تعتبر ان النقطة اعلى يسار الفورم هي نقطة الاصل او النقطة (0و0) و المحور السيني يزيد كلما تحركنا يمينا و المحور الصادي يزيد كلما تحركنا لاسفل

نعود الان لحركة الزر و هذه المرة نريد ان نحركه الى اليمين قليلا كلما نقرنا عليه اذا لنضف الكود التالي

Private Sub Command1_Click()
Command1.Left = Command1.Left + 100
End Sub

اذا كانت الحركة الي اليسار نحول اشارة ال+ الى - و اذا كانت الحركة راسية نحول الامر left الى top

يمكن دمج الامرين السابقين باستعمال الامر move و الذي ياخذ 4 بارمترات : الاول لتحديد left و الثاني top و الثالث لعرض الكائن و الرابع لارتفاعه

مثلا اضف تايمر للفورم و اضبط الخاصية enterval =100

Private Sub Timer1_Timer()
Command1.Move Command1.Left + 100, Command1.Top - 100
End Sub

لاحظ ان الامر move لا يتبعه (=) كما في اغلب اوامر الفجوال بيسك

كما اننا استعملنا بارمترين فقط من ال 4 المخصصة لهذا الامر

قم بتغيير العدد 100 في الكود اعلاه غيير ايضا الاشارات+- حتى تصل لحركة في الاتجاه الذي تريده

الان لنحرك الزر في جميع الاتجاهات .. اضف 5 تايمرات و زر للفورم و اضف الكود التالي

Private Sub Form_Load()
Command1.Top = 290
End Sub

Private Sub Timer1_Timer()
Command1.Move Command1.Left + 100, Command1.Top - 100
End Sub

Private Sub Timer2_Timer()
Command1.Move Command1.Left + 100, Command1.Top + 100
End Sub

Private Sub Timer3_Timer()
Command1.Move Command1.Left - 100, Command1.Top - 100
End Sub

Private Sub Timer4_Timer()
Command1.Move Command1.Left - 100, Command1.Top + 100
End Sub

Private Sub Timer5_Timer()
If Command1.Top < 0 Then
Timer1.Enabled = False
Timer3.Enabled = False
Timer4.Enabled = False
Timer2.Enabled = True
End If
If Command1.Left < 0 Then
Timer3.Enabled = False
Timer4.Enabled = False
Timer2.Enabled = False
Timer1.Enabled = True
End If
If Command1.Left > Form1.Width Then
Timer4.Enabled = True
Timer1.Enabled = False
Timer2.Enabled = False
Timer3.Enabled = False
End If
If Command1.Top > Form1.Height Then
Timer1.Enabled = False
Timer2.Enabled = False
Timer4.Enabled = False
Timer3.Enabled = True
End If

End Sub

في المرة القادمة ان شاء الله سندرس الحركة الدائرية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

في الحركة الدائرية نحتاج للقليل من الرياضيات و خاصة الهندسة التحليلية

لنلاحظ اننا اذا رسمنا خط مستقيم من نقطة الاصل و طوله واحد وحدة و قمنا بتدويره حول نقطة الاصل فاننا سنرسم دائرة و ذلك بتغيير الزاوية بين الخط المستقيم و محور السينات

مستخدمين هذه الفكرة ساعيد كود عمل ساعة كنت قد كتبته من قبل في المنتدىمع عمل ازاحة حيث يكون الدوران حول النقطة (2000و2000) و اضافة تايمر وتكست بوكس للفورم و 3 lines نحصل على الساعة التالية

Dim pi As Double
Private Sub Form_Load()
Line3.BorderWidth = 3
Line3.BorderColor = vbBlue
Line2.BorderColor = vbRed
Timer1.Interval = 10
pi = 3.141592653
Line1.X1 = 2000
Line1.Y1 = 2000
Line2.X1 = 2000
Line2.Y1 = 2000
Line3.X1 = 2000
Line3.Y1 = 2000
End Sub

Private Sub Timer1_Timer()
Text1.Text = Time
Dim h As Integer, m As Integer, s As Integer
h = Val(Left(Text1.Text, 2))
m = Val(Mid(Text1.Text, 4, 2))
s = Val(Mid(Text1.Text, 7, 2))
Line1.X2 = 2000 + (1500 * Cos((s - 15) * pi / 30))
Line1.Y2 = 2000 + (1500 * Sin((s - 15) * pi / 30))
Line2.X2 = 2000 + (1500 * Cos((m - 15) * pi / 30))
Line2.Y2 = 2000 + (1500 * Sin((m - 15) * pi / 30))
Line3.X2 = 2000 + (1000 * Cos((h - 3) * pi / 6))
Line3.Y2 = 2000 + (1000 * Sin((h - 3) * pi / 6))
End Sub

و هنا شرح مبسط لكيفية عمل الساعة من الاخ مهند عبادي

أحببت أن أضيف شرح مبسط لأسلوب رسم هذه العقارب لمن لا يعرفها

من المعروف أن عقرب الساعة له طرفان .. طرف ثابت في مركز الساعة وطرف يدور على محيط دائرة

.. إذاً حركة الطرف الآخر ترسم دائرة .. الآن إذا كنت ملماً بالرياضيات فسوف تعرف أن إحداقيات اي نفطة في محيط الدائرة هي

 

x = Sin(t)
y=COs(t)

وهذا هو الأسلوب المتبع في البرنامج فوق

يعني الثلاث خطوط .. طرف ثابت في الإحداثيات 2000 ، 2000 وطرف متغير

وهذا الطريف المتغير يتم ضريه برقم كبير من أجل تكبيره (لأنه بالأساس يتراوح بين -1 و 1) ثم نجمعه مع رقم مركز الدائرة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أرجو المعذرة علي اقتحامي دروسك

ولكنني قمت بتعديل الكود الخاص بالساعة ليشمل تحريك عقرب الساعات ين قمتي الساعة الحالية والتالية.

Dim H As Integer, M As Integer, S As Integer, X As Integer
Dim pi As Double

Private Sub Form_Load()
Line3.BorderWidth = 3
Line3.BorderColor = vbBlue
Line2.BorderColor = vbRed
Text1.Visible = False
Timer1.Interval = 10
Timer2.Interval = 10
pi = 3.141592653

Circle (2000, 2000), (1600), vbRed
Line1.X1 = 2000
Line1.Y1 = 2000
Line2.X1 = 2000
Line2.Y1 = 2000
Line3.X1 = 2000
Line3.Y1 = 2000

End Sub

Private Sub Timer1_Timer()
Text1.Text = Time

H = Val(Left(Text1.Text, 2))
M = Val(Mid(Text1.Text, 4, 2))
S = Val(Mid(Text1.Text, 7, 2))
'لتحديد قيمة الثواني
Line1.X2 = 2000 + (1500 * Cos((S - 15) * pi / 30))
Line1.Y2 = 2000 + (1500 * Sin((S - 15) * pi / 30))
'لتحديد قيمة الدقائق
Line2.X2 = 2000 + (1500 * Cos((M - 15) * pi / 30))
Line2.Y2 = 2000 + (1500 * Sin((M - 15) * pi / 30))

End Sub

Private Sub Timer2_Timer()
'لتحريك عقرب الساعات بين قميتي الساعة الحالية والساعة التالية
If M <> 0 Then
   X = (H * 5) + (M / 12)
   Line3.X2 = 2000 + (1000 * Cos((X - 15) * pi / 30))
   Line3.Y2 = 2000 + (1000 * Sin((X - 15) * pi / 30))
Else
'لضبط الساعة عند القيمة الصحيحة في حالة الدقائق = صفر
   Line3.X2 = 2000 + (1000 * Cos((H - 3) * pi / 6))
   Line3.Y2 = 2000 + (1000 * Sin((H - 3) * pi / 6))
End If

End Sub

ويمكن أيضا تحميل البرنامج كله من الوصلةالتالية

ويبقي علي المستخدم إضافة تأثيرات علي الساعة ليصبح شكلها أجمل

Clock.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكوووووووووووووور علي المعلوملت الرهيبة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم لقد طرحت في كثير من المنتديات كيفية رسم دائرة بيضاويةellipsecircleولم اجد معينا فالرجاء المساعدة :unsure:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

بارك الله فيك الحقيقة مجهود رائع ولكن لي سؤال اذا تسمح

هل استطيع ان احدد او اعرف احداثيات كل نقطة بالدائرة؟وكيف و شكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا

الف شكررررررررررر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله كل خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .