النافذة العربية للبرمجة

النافذة العربية للبرمجة
 
الرئيسيةالمشاركاتمكتبة الصورس .و .جبحـثالأعضاءالمجموعاتالتسجيلدخول

شاطر | 
 

 تقنيات الرسم باستخدام فيجوال بيسك ...

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: تقنيات الرسم باستخدام فيجوال بيسك ...   الأربعاء سبتمبر 17, 2008 1:12 pm

الرسم الى نافذه
يفتقد فيجول بيسك كثير من القدرات في مجال الجرافكس … و هذا ما يجعله محدود الامكانات في كثير من الاحيان … و لكن يوجد طريقة للوصول الى قدرات و يندوز في هذا المجال …باستدعاء ما نريده من واجهة برمجة ويندوز API .
فسنستخدم المكتبة الجاهزة لواجهة برمجة تطبيقات ويندوز API لأنها توفر علينا التعريفات التي يجب أن نعلن عنها أولاً … فمن المفروض أن نعرض كل ما يلي (باللون الاحمر) في ملف برمجه module … عموماً اذا لم تكن هذه المكتبة عندك أو أنك تريد أن تعرف بالفعل ما يحدث فالخطوات كما يلي … انشئ ملف برمجة …من قائمة مشروع Project اختر Add module ، و ضع فيه التعريفات التالية:
الكود:
[/b][/center]


[b][size=12][color=#ff0000][b][i]Declare[/i] Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long[/color][/size][size=12][color=#ff0000][i]Declare[/i] Function GetDC Lib "user32" (ByVal hWnd As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function InvalidateRect Lib "user32" (ByVal hWnd As Long, lpRect As Any, ByVal bErase As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long[/color][/size]
[size=12][color=#ff0000][i]Declare[/i] Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long[/color][/size]
[size=12][color=#ff0000]Public Const SRCCOPY = &HCC0020[/color][/size]
[/b][center][b]

لاحظ أنه يمكن الاستغناء عن هذه التعريفات لو استخدمنا مكتبة
‘Win32.tlb
ستحتاج ايضاً الى اطار Form و تضع عليه صندوق صورة Picture Box و صندوق قائمة ListBox
و شريط منزلق افقي Hscroll Box ..كما في الشكل :
[img]http://awfm.boardlog.com/



[size=12]اضبط الخاصية ScaleMode من حدول الخصائص للاطار و صندوق الصورة اللذين انشأناهما قبل قليل و أختر القيمة Pixels ، لآن واجهة
برمجة و يندوز تعمل على نظام البكسل كنظام وحدات افتراضي لها .
في البداية سنحاول أن نرسم دائرة بالطريقة التي يستخدمها فيجول بيسك … و سنرسم على الاطار و على صندوق الصورة ، بساتخدام البرمجة و يندوز تعمل على نظام البكسل كنظام وحدات افتراضي لها .
الكود:
[/b][/center]
[font=n][color=#000080][b][b]Form1.Circle (25, 25), 25
Picture1.Circle (25, 25), 25[/b][/color][/font][center][b]
[size=12]و سيظهر لك كما في الشكل

[img]http://awfm.boardlog.com/




[size=12]تبدو دائرة عادية

يمكن رسم هذه الدائرة بطريقة أخرى باستخدام واجهة برمجة ويندوز باستخدام وظيفة رسم شكل بيضاوي Ellipse … (يسار و اعلى و يمين و اسفل ) ، لاحظ أن هذه و سوف تمرر للوظيفة الاحداثيات على شكل مستطيل الاحداثيات تعبر عن المستطيل الذي يحيط بالشكل البيضاوي الذي سنرسمه . في البداية نحصل على مقبض النافذة التي سنرسم عليها الآن يمكننا استدعاء Call وظيفة الرسم … (كل التحكمات الظاهرة تعتبر نوافذ) Hdc ،، و بالشكل:
الكود:
[/b][/center]
[font=n][color=#000080][b]Ellipse Form1.hdc, 0, 10, 50, 60
Ellipse Picture1.hdc, 0, 10, 50, 60[/b][/color][/font][center][b]
ستلاحظ أنه رسم دائرة أخرى تحت التي رسمناها بالطريقة الاولى
ملاحظة مهمة
استطاعت وظيفة فيجول بيسك أن ترسم دائرة على الاطار و على صندوق الصورة (لأن لها سياق أجهزة dc ضمن VB)… ولكن لن تستطيع أن ترسم على الشريط المنزلق الذي عملناه سابقاً… لكن على النقيض وظيفة رسم الشكل البيضاوي لواجهة برمجه و يندوز يمكنها أن ترسم الى أي شئ يمكن الحصول على مقبضه :
الحصول على سياق الاجهزة
الكود:
[/b][/center]
[b][color=#000080][b]MyhDC = GetDC(List1.hWnd)[/color] [color=#008000]‘ [/color][/b][font=n][color=#008000][b]الحصول على سياق الاجهزة
[/b][/color][/font][font=n][color=#000080][b]Ellipse myHDC, 0, 0, 50, 50
Let myHDC = GetDC (HScroll1.hWnd)
Ellipse myHDC, 0, 0, 50, 50[/b][/color][/font][center][b]
[size=12]في السطر الاول نستقبل مقبض سياق مرر له مقبض النافذه في المتغير myHDC … بعد الحصول على المقبض نبدأ الرسم ، كذلك بالنسبة للسطر الثالث و الرابع ، مع ملاحظة أنه سيرسم على الشريط المنزلق .


لاحظ أننا استطعنا الرسم الى أي شئ نعرف مقبضه ، بما فيها سطح المكتب ، فلكي نرسم عليه نضع المقبض بالقيمةة صفر … فيكون بالشكل:
[img]http://awfm.boardlog.com/


الكود:
[/b][/center]
[b][size=12][color=#000080]MyHDC = GetDC(0) [/color][/size]
[size=12][color=#000080]Call Ellipse(myHDC, 0, 0, 50, 50)[/color][/size]
[/b][center][b]
[size=12]مثال بسيط لما سبق
اعمل فورم (نموذج) و أضف له مؤقت … و أضف ما يلي
الكود:
[/b][/center]
[b][size=12][color=#000080]Dim DiskTopDC[/color][/size]
[size=12][color=#000080]Dim MyPoint As POINTAPI[/color][/size]
[size=12][color=#000080]Private Sub Timer1_Timer()[/color][/size]
[size=12][color=#000080]Let myHDC = GetDC(0) [/color][/size][size=12][color=#008000]‘ نأخد سياق جهاز سطح المكتب لنرسم اليه[/color][/size]
[size=12][color=#000080]GetCursorPos MyPoint [/color][/size][size=12][color=#008000]‘ نحدد موقع المؤشر[/color][/size]
[size=12][color=#000080]Ellipse myHDC, MyPoint.X, MyPoint.Y, MyPoint.X + 50, MyPoint.Y + 50[/color][/size]
[size=12][color=#000080]End Sub[/color][/size]
[/b][center][b]
لاحظ أن هذا المثال يشوة سطح المكتب فنحتاج الى تنظيف الشاشة و هذا ما سنشرحه لاحقاً ،،
[/b][/size][/b][/size][/b]
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: عمل نسخ لجزء من الشاشة   الأربعاء سبتمبر 17, 2008 1:21 pm

عمل نسخ لجزء من الشاشة
افترض أنك رسمت صورة و تريد أن تنقل هذه الصورة الى أي جزء من النافذة ، توفر لك واجهة برمجة ويندوز وظيفة قوية لعمل ذلك . تدعى هذه الوظيفة Block Transfer و تختصر بـ blt و تلفظ بليت blit ، فتقوم بتحويل أو تحريك جزء معين من الشاشة في نفس الوقت , الوظيفة التي سنستدعيها هي BitBlt .
هذه الوظيفة تحتاج الى تسعة متغيرات لتمررها اليها ، الستة الاولى تحدد القياس و مكان البداية و النهاية للجزء الذي نريد أن نعمل عليه ، و قد يكون من الاسهل علينا أن نعينها الى متغيرات ليسهل التعامل معها لاحقاً … فنقول :
اقتباس :
x = 0
y = 0
nWidth = 50
nHeight = 50
xSrc = 0
ySrc = 0

المتغير الآخر الذي سنمرره هو متغير يحدد كيف ستتفاعل الصورة الاصلية بالنسبة للصورة التى نريدها في النهاية ، و في اغلب الاحيان ستكون الصورة النهائية هي نفسها الصورة الاولى ، و من ذلك يمكننا أن نعرف متغير يضم التعريف
اقتباس :
dwRop=SRCCOPY

المتغيرين الاخيرين هما مقبض سياق النافذة الوجهة Destination و المصدر
اقتباس :
DestDC = Form1.hdc
hSrcDC = GetDC(HScroll1.hWnd)

الآن عرفنا كل المتغيرات التي سنمررها و الآن دور الاستدعاء … بالشكل
اقتباس :
BitBlt hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, wRop
ReleaseDC HScroll1.hWnd, hSrcDC

[img]http://awfm.boardlog.com/



عندما تلاحظ جيداً في النتيجة .. سوف ترى أنه
تم نسخ الدائرة التي عملناها على الشريط (مصدر) المنزلق و وضعناها على الاطار(الوجهه)
و بامكانك ان تنسخ من أي جزي من النوافذ
و من ضمنها سطح المكتب
في المثال التالي سوف ننسخ الجزء الاعلى من سطح المكتب الى اطار برنامجنا
اقتباس :

hSrcDC = GetDC(0)
nWidth = 200
nHeight = 200
BitBlt hDestDC, x, y, nWidth, nHeight,hSrcDC, xSrc, ySrc, dwRop
ReleaseDC 0, MyHDC


مع ملاحظة أننا عرفنا بعض المتغيرات هنا أما الباقية فنكمل و نعرفها كما سبق..
تنظيف الشاشة
عندما تنسخ بعض الصور و تغير أماكنها في ارجاء الشاشة تلاحظ أن مكانها السابق يضل كما كان و تتشوه الشاشة في احيان كثيرة بسبب الكتابة او الرسم على النوافذ … فعندما ينتهي ويندوز من نافذه مثلاً و لكي يزيل النافذه التي عرضها يقوم بنفسه بتنضيف ما عمله أو ما عرضه … ويكون ذلك بارسال رساله بان تنظف النافذة نفسها باستدعاء
اقتباس :

InvalidateRect 0,0,0

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: عمل نسخ لجزء من الشاشة   الأربعاء سبتمبر 17, 2008 1:22 pm

عمل نسخ لجزء من الشاشة
افترض أنك رسمت صورة و تريد أن تنقل هذه الصورة الى أي جزء من النافذة ، توفر لك واجهة برمجة ويندوز وظيفة قوية لعمل ذلك . تدعى هذه الوظيفة Block Transfer و تختصر بـ blt و تلفظ بليت blit ، فتقوم بتحويل أو تحريك جزء معين من الشاشة في نفس الوقت , الوظيفة التي سنستدعيها هي BitBlt .
هذه الوظيفة تحتاج الى تسعة متغيرات لتمررها اليها ، الستة الاولى تحدد القياس و مكان البداية و النهاية للجزء الذي نريد أن نعمل عليه ، و قد يكون من الاسهل علينا أن نعينها الى متغيرات ليسهل التعامل معها لاحقاً … فنقول :
اقتباس :
x = 0
y = 0
nWidth = 50
nHeight = 50
xSrc = 0
ySrc = 0

المتغير الآخر الذي سنمرره هو متغير يحدد كيف ستتفاعل الصورة الاصلية بالنسبة للصورة التى نريدها في النهاية ، و في اغلب الاحيان ستكون الصورة النهائية هي نفسها الصورة الاولى ، و من ذلك يمكننا أن نعرف متغير يضم التعريف
اقتباس :
dwRop=SRCCOPY

المتغيرين الاخيرين هما مقبض سياق النافذة الوجهة Destination و المصدر
اقتباس :
DestDC = Form1.hdc
hSrcDC = GetDC(HScroll1.hWnd)

الآن عرفنا كل المتغيرات التي سنمررها و الآن دور الاستدعاء … بالشكل
اقتباس :
BitBlt hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, wRop
ReleaseDC HScroll1.hWnd, hSrcDC

[img]http://awfm.boardlog.com/





عندما تلاحظ جيداً في النتيجة .. سوف ترى أنه
تم نسخ الدائرة التي عملناها على الشريط (مصدر) المنزلق و وضعناها على الاطار(الوجهه)
و بامكانك ان تنسخ من أي جزي من النوافذ
و من ضمنها سطح المكتب
في المثال التالي سوف ننسخ الجزء الاعلى من سطح المكتب الى اطار برنامجنا
اقتباس :


hSrcDC = GetDC(0)
nWidth = 200
nHeight = 200
BitBlt hDestDC, x, y, nWidth, nHeight,hSrcDC, xSrc, ySrc, dwRop
ReleaseDC 0, MyHDC



مع ملاحظة أننا عرفنا بعض المتغيرات هنا أما الباقية فنكمل و نعرفها كما سبق..
تنظيف الشاشة
عندما تنسخ بعض الصور و تغير أماكنها في ارجاء الشاشة تلاحظ أن مكانها السابق يضل كما كان و تتشوه الشاشة في احيان كثيرة بسبب الكتابة او الرسم على النوافذ … فعندما ينتهي ويندوز من نافذه مثلاً و لكي يزيل النافذه التي عرضها يقوم بنفسه بتنضيف ما عمله أو ما عرضه … ويكون ذلك بارسال رساله بان تنظف النافذة نفسها باستدعاء
اقتباس :


InvalidateRect 0,0,0


فتقوم بتنظيف كل النوافذ على الشاشة

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: تحويل العمليات ...   الأربعاء سبتمبر 17, 2008 1:28 pm

تحويل العمليات
يمكن عمل صوره غير مرئية و من ثم ارسالها أو نقلها الى نافذة مرئية و لكي يكون هذا النقل بشكل سلس يجب أن الصورة متوافقة مع سياق النافذة الهدف أو الوجهة فنستخدم الوظيفة CreateCompatibleBitmap ، سوف تخبر الوظيفة ما هو السياق الذي تريد الصورة أن تكون منوافقة معه و ما هو الحجم الذي تريد أن تكون عليه الصورة فيما بعد ، تقوم الوظيفة بانشاء الصورة و ترجع المقبض في متغير لاستخدامه لاحقاً
اقتباس :
hBMP = CreateCompatibleBitmap(Form1.hdc,100,100)
اذا لم تستطع انشاء الصورة سوف تعود برقم صفر
أما في حالة اننا اردنا أن نرسم الى صورة غير مرئية يجب أن نحمله على حامل مسيق و لكن لا يمكننا أن نستخدم الوظيفة GetDC للحصول على سياق الصورة لآن الصورة ليست نافذة فبدل ذلك سوف ننشئ سياق متوافق باستخدام الوظيفة
الكود:
[/center]
[font=n][color=#000080][b]hDestDC = CreateCompatibleDC(Form1.hdc)[/b][/color][/font][center]
[size=12][b]اعط الوظيفة مقبض السياق الذي تريد أن يكون متوافق معه . و سيرجع القيمه صفر اذا لم يستطيع انشاء النافذة

الآن عندنا صورة متوافقة و سياق متوافق لكننا لم نحمل الصورة على السياق ، و لعمل ذلك استخدم الوظيفة SelectObject . و اعط الوظيفة المقبض الخاص السياق و المقبض الخاص بالصورة التي تريد أن تحملها عليه:
اقتباس :
SelectObject hDestDC, hBMP

يعمل بالضبط كما لو أنك رسمت على النافذه (رسم للسياق فقط) سواء كانت الوجهة الحقيقية هي نافذة أو صورة . و يمكنك أن تنقل الصور باستخدام الوظيفة BitBlt و الرسم بوظيفة كـ Ellipse كما في الشكل التالي :
اقتباس :
[size=12][b]hSrcDC = GetDC(0)
BitBlt hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop
ReleaseDC 0, hSrcDC
Ellipse hDestDC, 0, 0, 50, 50
ومن الطبيعي أن لا ترى شيئاً حتى الآن ، و لكي تنقل الصورة الغير مرئية الى نافذة . اضبط مقابض السياقات الوجهة و المصدر …كما يلي:
اقتباس :
hSrcDC = hDestDC
hDestDC = Form1.hdc
BitBlt hDestDC, x, y, nWidth, nHeight,hSrcDC, xSrc, ySrc, dwRop
الآن يمكنك مشاهدة ما عملت..
ازالة ما عملت
اذا نسيت أن تنهي استخدام المفبض الذي استخدمته ، سوف يكون البرنامج بطئ و يستهلك موارد النظام ، فلا أن تزيل الصورة التي انشأتها و كذلك المسيقات …لذلك نستخدم وظيفة الازالة و نمرر لها مقبض ما نريد انهائه
اقتباس :
DeleteDC hSrcDC
DeleteObject hBMP

[/b][/size][/b][/size]
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: المثال الاول   الأربعاء سبتمبر 17, 2008 1:31 pm

امثلة
المثال الاول
كما قلنا سابقاً يمكن الاستغناء عن هذه التعريفات (بالاحمر) و استخدام المكتبة أو نعرف كل المتغيرات و الاعلانات عن الوظائف التي سنستخدمها في البرنامج و التي سنستدعيها من واجهة برمجه ويندوز … فنعمل ملف برمجة module و نضع فيه ما يلي:
اقتباس :
Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, lpRect As Any, ByVal bErase As Long) As Long
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Const SRCCOPY = &HCC0020
و نعمل اطار و نضيف مؤقت و نضيف البرمجة التالية:
اقتباس :
Private xMax As Long, yMax As Long
Private xSize As Long, ySize As Long
Private mySDC As Long, mySBM As Long
Private Const xCount = 15, yCount = 15
Private Sub Form_Click()
If Timer1 Then Call InvalidateRect(0, 0, 0)
Timer1 = Not Timer1
End Sub
Private Sub Form_Load()
Dim myDC As Long
MyMsg = MsgBox("اذا بغيت توقفه اضغط على الصوره بالفاره..أوكي؟؟", vbCritical, "خربانه خربانه", 0, ffd)
Let xMax = Screen.Width / Screen.TwipsPerPixelX
Let yMax = Screen.Height / Screen.TwipsPerPixelY
Let xSize = xMax / xCount
Let ySize = yMax / yCount
Let Top = 0
Let Left = 0
Let myDC = GetDC(0)
Let mySDC = CreateCompatibleDC(hdc:=myDC)
Let mySBM = CreateCompatibleBitmap(hdc:=myDC, nWidth:=xMax, nHeight:=yMax)
Call SelectObject(mySDC, mySBM)
Call BitBlt(hDestDC:=mySDC, x:=0, y:=0, nWidth:=xMax, nHeight:=yMax, hSrcDC:=myDC, xSrc:=0, ySrc:=0, dwRop:=SRCCOPY)
Call ReleaseDC(0, myDC)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call InvalidateRect(0, 0, 0)
Call DeleteObject(hObject:=mySBM)
Call DeleteDC(hdc:=mySDC)
End Sub
Private Sub Timer1_Timer()
Dim xStart As Long, yStart As Long
Dim xEnd As Double, yEnd As Double
Dim myDC As Long
Dim i As Long
Let myDC = GetDC(0)
For i = 1 To 20 '`Loop to make run faster
Let xStart = Int(xCount * Rnd) * xSize
Let yStart = Int(yCount * Rnd) * ySize
Let xEnd = Int(xCount * Rnd) * xSize
Let yEnd = Int(yCount * Rnd) * ySize
Call BitBlt(hDestDC:=myDC, x:=xEnd, y:=yEnd, nWidth:=xSize, nHeight:=ySize, hSrcDC:=mySDC, xSrc:=xStart, ySrc:=yStart, dwRop:=SRCCOPY)
Next i
Call ReleaseDC(0, myDC)
End Sub
شغل البرنامج ثم راقب ما سيحصل
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: رد: تقنيات الرسم باستخدام فيجوال بيسك ...   الأربعاء سبتمبر 17, 2008 1:35 pm

المثال الثاني
الشاشة الذائبة… سيدهشك هذا البرنامج بما سيعمل… انشئ اطار و ضع مؤقت و اضبط الوقت ثم اضف صندوق اختيار Check Box و لا تنسى عمل ملف برمجة كما فعلنا سابقاً و ذلك لاستدعاء وظائف ويندوز …و اخيراً انسخ ما يلي الى برنامجك
اقتباس :

Dim xMax As Long, yMax As Long
Dim xSize As Long, ySize As Long
Private Sub Form_Load() 'Convert screen dimensions to pixels
Let xMax = Screen.Width / Screen.TwipsPerPixelX
Let yMax = Screen.Height / Screen.TwipsPerPixelY
Let xSize = xMax / 70 ' تقطيع عرضي
Let ySize = yMax / 1 ' كم من الشاشة تريد
Form1.Top = 0
Form1.Left = 0
End Sub
Private Sub Timer1_Timer()
Dim xStart As Double, yStart As Double
Dim xEnd As Double, yEnd As Double
Dim myDC As Long
Dim i As Long
Let myDC = GetDC(0)
For i = 1 To 200 'Speed things up with an inner loop
Let xStart = xMax * Rnd 'Find random starting place
Let yStart = yMax * Rnd
Let xEnd = xStart 'Calculate ending place
Let yEnd = yStart + ySize / 1000
If Check1 Then
Call Ellipse(hdc:=myDC, X1:=xStart, Y1:=yStart, X2:=xStart + xSize, Y2:=yStart + ySize)
Else
Call BitBlt(hDestDC:=myDC, x:=xEnd, y:=yEnd, nWidth:=xSize, nHeight:=ySize, hSrcDC:=myDC, xSrc:=xStart, ySrc:=yStart, dwRop:=SRCCOPY)
End If
[img]http://awfm.boardlog.com/


اقتباس :

Call ReleaseDC(0, myDC) ' Give back DC handle
End Sub
Private Sub Form_Click()
‘ اعادة رسم الشاشة
If Timer1 Then Call InvalidateRect(0, 0, 0)
Timer1 = Not Timer1
'Toggle timer's Enabled property
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call InvalidateRect(0, 0, 0) 'Make windows repaint
End Sub

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: انشاء متصفح خاص   الأربعاء سبتمبر 17, 2008 1:57 pm

انشاء متصفح خاص




اذا كان متصفح مايكروسوفت من ضمن البرامج الموجودة في جهازك فان فيجول بيسك يوفر لك امكانية عمل متصفح كامل الوظائف بسطر أوامر واحد ، و يحوي التصفح للأمام و الرجوع و أيضاً قائمة بما تمت زيارته.

[img]http://awfm.boardlog.com/



السر وراء عمل المتصفح هي المكتبة SHDOCVW.DLL التي توفر طرق و خصائص يمكن من خلالها عمل متصفحنا
أضف الأدآة "متصفح ويب " و لكي تضيفها الى شريط الادوات … اذهب لقائمة مشروع ثم مكونات




Project->Component …. ثم اختر Microsoft Internet Controls ثم اضغط موافق ، بعدها ستجدها على شريط الادوات

الآن اضغط على هذه الادآة مرتين لاضافتها الى النمودج (الفورم) وستظهر كما يلي:

[img]http://awfm.boardlog.com/




[size=12]الآن اضغط مرتين على الفورم لنضيف الكود في حدث باية تحميل الفورم Form_Load

و أضف السطر التالي
اقتباس :


[size=12]WebBrowser1.Navigate “
www.cnn.com



[size=12]طبعاً … يمكنك وضع أي موقع تريد


حتى لو صفحة أو ملف على الجهاز

الآن شغل البرنامج و لاحظ

لقد تم عرض الصفحة

الآن نريد أن نضيف صندوق يضيف فيه المستخدم العناوين و أيضاً تضم ما تمت زيارته في السابق

[img]http://awfm.boardlog.com/




[size=12]أضف ادآة قائمة كمبو Combo

الآن سنضيف كود لحادثة النقر على هذه الادآة Combo1_Click لاتاحة الاختيار للمستخدم منها

فاذا اختر احدها نأخذ العنوان الموجود في القائمة و نجعل أدآة مستعرض الويب أن تفتحه

اقتباس :
Private Sub Combo1_Click()
WebBrowser1.Navigate (Combo1.Text)
End Sub


لكن لاحظ أنه بعض الاحيان يكتب المستخدم ما يريد ثم يضغط مفتاح الادخال لكي يتم عرضه . و لكي نفعل ذلك … اذا ضغط المستخدم مفتاح الادخال (على الكمبو) فنأخذ المدخلات على نص الكمبو و نمررها لأدآة المستعرض … كما يلي:
اقتباس :
Private Sub Combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Combo1_Click
End If
End Sub


و أخيراً… سوف نضيف الكود الذي يضع المواقع التي تمت زيارتها في القائمة. فعندما تعرض أدآة المستعرض أي صفحة نطبق حدث قبل الاستعراض …كما يلي
اقتباس :
Private Sub WebBrowser1_BeforeNavigate(ByVal URL As String, _
ByVal Flags As Long, ByVal TargetFrameName As String, _
PostData As Variant, ByVal Headers As String, Cancel As Boolean)

Dim strURL As String
strURL = URL
Dim bFound As Boolean
Dim i As Integer

For i = 0 To Combo1.ListCount - 1
If Combo1.List(i) = strURL Then
bFound = True
Exit For
End If
Next i

If Not bFound Then
Combo1.AddItem strURL
End If

Combo1.Text = strURL

End Sub





[img]http://awfm.boardlog.com/




اقتباس :
[size=12]WebBrowser1.GoForward



و زر العودة للخلف
اقتباس :
WebBrowser1.GoBack


هذا كل ما في الامر و تستطيع أن تضيف لمساتك الخاصة له و أيضاً قد تعمل متصفح بشروط خاصة كأن توزعه مع منتج و لا يعرض هذا المتصفح الا موقعك أو حتى متصفح لا يعرض بعض الصفحات التي يوجد بها بعض الكلمات الغير مرغوب بها … و كهذا .


*************

كيف أضع متغير في ملف؟

ان وضع متغير في ملف في عرف بعض المبرمجين هي طريقة غير عمليه ولكن في الواقع ان هذا الأسلوب قد يفي بالعديدمن الأغراض ومنها على سبيل المثال حفظ اعدادت الواجهه واستعادتها في التشغيل القادم للبرنامج.
وفي نظام ويندوز ظهرت ملفات الإعدادات ini وللتبسيط سنذكر مثالا بسيطا لوضع متغير في ملف








.


نريد الآن أن نضيف زرين للرجوع للخلف للصفحة التي تم عرضها آخر مرة و الآخر للصفحة التالية و توفر أدآة الاستعراض خطوتين Procedure لعمل ذلك GoBack و GoForward … فنضيف زرين كما يلي:

ففي كود زر التقدم للامام نضيف ما يلي[/size]
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
الوسام اليماني



عدد الرسائل : 16
تاريخ التسجيل : 09/07/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: رد: تقنيات الرسم باستخدام فيجوال بيسك ...   السبت سبتمبر 20, 2008 8:16 am

thank youuuuuuuuuuu
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
 
تقنيات الرسم باستخدام فيجوال بيسك ...
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
النافذة العربية للبرمجة :: قسم لغات برمجة التطبيقات :: منتدى Microsoft Visual Basic-
انتقل الى: