الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دروس عن واجهة برمجة التطبيقات API

مغلقاستطلاعرائج
بدأه roka في 2 مايو 2003 · 55 رد · 14,931 مشاهدة · في قسم الدروس والمواضيع الهامة
مشاركة: واتساب X فيسبوك تيليجرام

استطلاع

58 مشارك في التصويت

???? ?? ????? ????? ????????? API

??? ????57 صوت · 98%
??? ??? ??????1 صوت · 2%
#1 صاحب الموضوع

الاخوة الكرام، أود هذه المرة أن أشارك بتقديم دروس عن واجهة برمجة التطبيقات Application Programming Interface API و لكن بما أن هذا الموضوع سيستغرق وقتاً و مجهوداً كبيرين، وددت أن أعرف مسبقاً إن كنتم مهتمين فعلاً بهذا الموضوع، و أن عدداً كبيراً منكم سيفيد منه، أو أنه لا يحظى بإهتمامكم ففى هذه الحالة أوفر الوقت لموضوع آخر يهمكم.

نتيجة التصويت ستحدد مدى الإستمرار فى هذه المشاركة.

أخوكم.

#2

بسم الله الرحمن الرحيم

نعم اريـــــــــــــــــــــد "عفون اولان حياك الله احي"roka" اود ان أحيك علي ه>ة الفكرة الرائعة حيث أنها سوف تفتح لنا عالم الاحتراف من أوسع أبوابة في لغات البرمجة ولكن نود ايضا مشاركة الاخوة الاعضاء في المنتديات الاخري وخاصة

منتدي لغة الc حيث ان "Programming Interface API "لاتقتصر علي لغة

vb

وشكرا أخي العزيز

#3

بسم الله الرحمن الرحيم

اخى الكريم/roka

السلام عليكم ورحمة الله وبركاته،،،

مشكور وبارك الله فيك على هذة الفكرة وارجوا ان تكمل المسيرة وتبداء فى الشرح وان شاء الله الجميع سيشارك ويتعاون وارجوا من الله لك كل توفيق.

والسلام عليكم ورحمة الله وبركاته،،،

اخوكم /سالم

salem001

(f)(f)(f)

#4

اختيار موفق(f) والجميع في انتظارك

ani.gif
#5

أخى الكريم، بعد التحية.

يسعدنى أن الموضوع يلقى اهتمامك، و أتفق معك فى أنه موضوع هام لا غنى لأى مبرمج متوسط ناهيك عن محترف، عن دراسته.

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

و الحقيقة أن الجمهور المستهدف هو أعضاء هذا المنتدى الكريم منتدى "مايكروسوفت Visual Basic" و لا أمانع من مشاركة أحد الأخوة من مبرمجى ®++Microsoft® Visual C معنا، و لكن الحقيقة أن تناول هذا الموضوع من وجهة نظر ®Microsoft® Visual Basic كما أنوى أن أفعل لن يجعله مفيداً لمبرمجى "++Visual C" و ذلك لأنهم لن يهتموا إلا بالجانب النظرى فقط للموضوع، و لكن عدا ذلك فتناول واجهة برمجة التطبيقات يختلف بشكل كبير من وجهة نظر كلا من مبرمجى Visual Basic و ++Visual C لأسباب عديدة، منها أسباب تتعلق بطبيعة اللغة و إمكانياتها فبينما تفتقر لغة Visual Basic للتعامل مع المؤشرات Pointers بكفاءة -لم يكن هذا متاحاً إلا مؤخراً منذ الإصدار الخامس(1) عن طريق الأوامر الغير موثقة VarPtr, ObjPtr, StrPtr- فإن هذا الدعم كان مبنياً مع ++C منذ إصدارها، و من درس هذه اللغة و لو بشكل مبسط أثناء دراسته بالمرحلة الثانوية أو الجامعية يعرف عن دعم المؤشرات و كمثال معامل عنوان الذاكرة address-of operator (&) و إن كانت لغة ®Microsoft® Visual Basic قد حاولت أن تحاكى بعض المؤشرات مثل this الموجود بلغة ®++Microsoft® Visual C عن طريق تضمين مؤشر مثل Me كما نستخدمه كمثال: Me.BackColor = vbButtonFace حيث يعتبر مؤشراً لنسخة الكائن Form الحالية. إلا أنى أقول و باختصار أنه توجد فروق كبيرة بين اللغتين من حيث بنية اللغة تجعل تناول الموضوع من وجهة نظر مبرمجى أحد اللغتين مختلفاً عن تناوله من وجهة نظر مبرمجى اللغة الأخرى، كما أنه توجد اختلافات عديدة منها مثلاً، فى طريقة الإعلان عن إجراءات واجهة البرمجة، فنحن نقوم فى Visual Basic بالإعلان عن الإجراءات بالشكل التالى لو كان الاجراء يعود بقيمة Function.

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

أو كالتالى لو كان الاجراء لا يعود بقيمة Sub.

Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]

كما نجد مثلا فى الاعلان عن الدالة

Declare Function ChangeDisplaySettings Lib "user32.dll" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long

فإننا نجدها معلنه بهذه الطريقة فى ++Visual C

LONG ChangeDisplaySettings(

  LPDEVMODE lpDevMode,  

  DWORD dwflags         

);

كما أننا عندما نمرر قيمة للمتغير lpDevMode فى Visual Basic فإننا نمرر له القيمة (ByVal CLng(0 و إذا ما أعلن مبرمج ++Visual C عن الاجراء بنفس طريقة Visual Basic و مرر له الإجراءات بنفس الطريقة، فإن ما سيحصل عليه هو سيل من الأخطاء.

و ما أريد أن أقوله إجمالاً أن الجانب التطبيقى للدروس و الأمثلة المدرجة و التدريبات و المشاريع ستكون كلها إن شاء الله قائمة على فرض أن الجمهور المستهدف هو كما قلت أعضاء "منتديات الفريق العربي للبرمجة" و تحديداً أعضاء منتدى "مايكروسوفت Visual Basic".

___________________________________________

(1) كان من الممكن فى ®Microsoft® Visual Basic الإصدارة الرابعة استخدام VarPtr للحصول على مؤشرات المتغيرات و لكن كان يلزم الإعلان عنها كالتالى:

Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long

و لكن الآن أصبحت الدالة VarPtr مبنية داخل لغة ®Microsoft® Visual Basic و يمكن استدعائها مباشرة.

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

#6

شكررررررررررررررررااااااااااااااا

#7

الموضوع فعلاً مهم و شيق و اشكرك على كتاب ال api guide ال>ى وضعتة

فانا كنت قد وضعت من فترة نسخة ولكنها قديمة من ه>ا الكتاب فشكراً لك

(f)(f)(f)(f)

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#8

بسم الله الرحمن الرحيم

مقدمة فى التعريف بواجهة برمجة التطبيقات (Application Programming Interface (API

نقلاً عن جزء من الفصل الثانى " فى أعماق 'ويندوز' " من كتاب "إلى القمة مع مايكروسوفت فيجوال بيسيك Microsoft Visual Basic : حتى الإصدار 3 : الجزء الثانى : الطبعة الثالثة سنة 1996" للأستاذ الكبير جمال عمارة.

ISBN: 977-287-001-0

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

من صفحة 155

__________________________________________________________

ما هى مكتبات الربط الديناميكى؟

إن الإجابة على هذا السؤال تتطلب شرح معنى المكتبة، و معنى الربط، و لماذا نسميه ربط "ديناميكى"، و هل معنى هذه التسمية أن هناك ربط غير ديناميكى؟

المكتبة Library -فى عالم البرامج- هى ملف مستقل يحتوى على مجموعة من الإجراءات Procedures. و الهدف من استخدام المكتبة هو توفير الوقت و الجهد على المبرمج بحيث يمكنه استدعاء الإجراءات الموجودة فيها بدلاً من كتابتها بنفسه. و توجد مكتبات متخصصة فى أداء وظائف معينة مثل مكتبات الاتصالات Communication التى تُسهِل على المبرمج كتابة برامج الاتصالات، و مكتبات الرسومات Graphics التى تسمح للمبرمج بأداء عمليات الرسم المعقدة. و بعض الشركات تقوم بتصميم هذه المكتبات و بيعها. و يمكن للمبرمج شراء هذه المكتبات و الاستفادة من الإجراءات الموجودة فيها بدلاً من كتابة كل ما يحتاج إليه بنفسه.

و لكن بعد أن ينتهى المبرمج من استخدام الإجراءات الموجودة فى المكتبة، كيف يضمها إلى برنامجه بحيث يمكن عمل برنامج قابل للتنفيذ Executable file يقوم بتوزيعه أو بيعه للمستخدمين؟

من صفحة 156

__________________________________________________________

مع معظم لغات البرمجة (من اللغات التى تسمح بعمل ملفات قابلة للتنفيذ) يأتى برنامج يُسمى "الرابط" Linker تكون وظيفته هى قراءة البرنامج و البحث عن الإجراءات الخارجية التى يستخدمها. بعد ذلك ينسخ هذه الإجراءات من المكتبة التى توجد بها و "يربطها" بالبرنامج. و عند عمل الملف النهائى القابل للتنفيذ، تصبح هذه الإجراءات جزءاً لا يتجزأ من البرنامج.

و تسمى هذه العملية بالربط الساكن (الستاتيكى) Static Linking لأن الربط يتم عند صنع البرنامج و يبقى بدون تغيير (ساكناً) فى كل مرة يتم فيها تشغيل البرنامج.

فإذا فرضنا أنك تكتب برنامجاً يستخدم الإجراءين MoveText و ShowResult من إحدى المكتبات، فإن برنامج "الرابط" سيقوم بنسخ هذين الإجراءين من المكتبة إلى البرنامج القابل للتنفيذ.

{يوجد شكل توضيحى رقم (1-2) بالكتاب الأصلى}

من صفحة 157

__________________________________________________________

و طريقة الربط الساكن طريقة جيدة لأنها تُقلل من عدد الملفات المطلوب توزيعها مع برنامجك. و لكن لها بعض العيوب، أهمها: لنفرض أن هناك عدة برامج تستخدم نفس المكتبة و تستدعى نفس الإجراءات، و قام مستخدم ما بشراء هذه البرامج، فمعنى ذلك أن لديه عدة نسخ من هذه الإجراءات على القرص الصلب فى جهازه.

و قد كانت طريقة الربط الساكن مقبولة عندما كانت الأجهزة تُشغِل نظام "دوس"، ذلك أن الخسارة من تلك الطريقة كانت محصورة فى القرص الصلب فقط. أما مع قدوم "ويندوز" و معها إمكانية تشغيل أكثر من برنامج فى أكثر من نفس الوقت، ظهر عيب طريقة الربط الساكن بطريقة جلية. فالإجراءات المتكررة فى البرامج المختلفة لا تستهلك مساحة من القرص الصلب فقط، و إنما من الذاكرة كذلك.

فإذا فرضنا أن المستخدم يُشغِل البرامج (أ) و (ب) و (ج) فى نفس الوقت و أن هذه البرامج جميعاً تستخدم الإجراء ShowResult، فإن معنى ذلك أن هناك جزء من التعليمات Code متكرر فى الذاكرة بدون داع. فإذا فرضنا أن الإجراء ShowResult يحتل 20 كيلو بايت، فإن معنى ذلك أن هناك 40 كيلو بايت مهدرة ليس على القرص الصلب فقط، و إنما فى الذاكرة أيضاً.

{يوجد شكل توضيحى رقم (2-2) بالكتاب الأصلى}

من صفحة 158

__________________________________________________________

و إذا نظرت إلى أى من تطبيقات "ويندوز"، ستجد أنها جميعاً تفعل أشياء كثيرة متشابهة: مثل صنع النوافذ و القوائم و أشرطة التمرير و الأزرار... و خلافه. فلو قام كل مبرمج بوضع الإجراءات التى تفعل ذلك فى داخل برنامجه، فإن ذلك سيؤدى إلى إهدار كبير فى موارد النظام System Resources. من هنا جاءت فكرة الربط الديناميكى Dynamic Linking. فعند تصميم "ويندوز" وضع المبرمجون الوظائف الأساسية التى يحتاجها البرنامج فى مكتبات ربط ديناميكى Dynamic Link Libraries و تم توزيعها مع "ويندوز" بحيث تكون متوفرة لجميع المبرمجين.

و عند كتابة برنامجك و استدعاءك لأحد هذه الإجراءات، فإن برنامج الرابط Linker لا ينسخ تلك الإجراءات من المكتبة إلى برنامجك كما كان يحدث عند الربط الساكن، و إنما يضع معلومات داخل برنامجك توضح اسم المكتبة التى تستخدمها و اسم الإجراءات داخلها.

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

و تظهر فائدة هذه الطريقة جلية إذا قام أكثر من برنامج فى نفس الوقت باستدعاء إجراءات مختلفة من نفس المكتبة. فـ "ويندوز" تُحَمِّل نسخة واحدة من هذه المكتبة فقط فى الذاكرة و تسمح للبرامج المختلفة باستدعاء الإجراءات الموجودة فيها. و بالتالى لا يكون هناك أى إهدار لموارد النظام: فهناك نسخة واحدة من الإجراءات المستخدمة على القرص الصلب و فى الذاكرة.

من صفحة 159

__________________________________________________________

{يوجد شكل توضيحى رقم (3-2) بالكتاب الأصلى}

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

واجهة برمجة التطبيقات

يبدو مصطلح واجهة برمجة التطبيقات Application Programming Interface (أو API للاختصار) و كأن الهدف منه هو إخافة الناس. و لكن معنى واجهة برمجة التطبيقات –ببساطة- هو أن أحد التطبيقات يحتوى على مجموعة إجراءات "يُصدِّرها" للتطبيقات الأخرى بحيث يمكن لهذه التطبيقات أن تستدعيها. و إذا أشرنا لواجهة برمجة "ويندوز" فإن المصطلح فى هذه الحالة يشير إلى مكتبات الربط الديناميكى التى توزَّع مع كل نسخة من "ويندوز" و التى تحتوى على مئات الإجراءات التى يستخدمها المبرمجون عند كتابة برامج لـ "ويندوز".

و قد كان الهدف من "فيجوَل بيسيك" هو عزل المبرمج عن هذه الواجهة و توفير بيئة سهلة لكتابة تطبيقات لـ "ويندوز". ذلك أن إجراءات واجهة البرمجة متشعبة و متنوعة و تحتاج إلى وقت كبير فى تعلّمها، كما أن طريقة استخدامها أصعب –إلى حد كبير- من

من صفحة 160

__________________________________________________________

استخدام الأوامر المبنية داخل "فيجوَل بيسيك". أضف إلى ذلك أن بعض هذه الإجراءات يعتمد فى عمله على إجراءات أخرى بحيث يجب استخدامه فى سياق و ترتيب معين.

لماذا تحتاج إلى مكتبات الربط الديناميكى؟

فإذا كان الهدف من "فيجوَل بيسيك" هو عزل المبرمج به عن تلك الواجهة فلماذا نتكلم عنها إذن؟ و ما علاقة كل الحديث السابق عن الربط الساكن و الربط الديناميكى بـ "فيجوَل بيسيك"؟

السبب واضح: و هو أنك كمبرمج -محترف- لا بد أن تصطدم إن آجلاً أو عاجلاً بوظيفة تريد أن تؤديها فى برنامجك و لا تجد وسيلة لأدائها من "فيجوَل بيسيك". ذلك أن بساطة و سهولة "فيجوَل بيسيك" كان لا بد أن تأتى على حساب نقطة أخرى. لقد كان على مصممى لغة "فيجوَل بيسيك" أن يتجنبوا بعض الأمور لكى يحتفظوا باللغة فى حيّز السهولة و البساطة. فإذا احتجت إلى أداء وظيفة ما فى "فيجوَل بيسيك" و بحثت فى الأوامر المبنية داخله عن أمر يقوم بما تريد و لم تجده، فماذا تفعل؟ لا بد أن ذلك سيثير غضبك، و مما قد يزيد من ذلك الغضب أنك ترى بعض التطبيقات الأخرى تفعل نفس الشيء الذى تريد فعله! إذن فما تريد أن تفعله "ممكن" فى بيئة "ويندوز" بشكل عام، فلماذا لا يوجد فى "فيجوَل بيسيك"؟

و قد كان لدى مصممى "فيجوَل بيسيك" بعد النظر الكافى ليتوقعوا حدوث شيء مثل هذا، لذلك وضعوا فى "فيجوَل بيسيك" آلية استدعاء الإجراءات الخارجية الموجودة فى مكتبات الربط الديناميكى سواءً الموجودة فى "ويندوز" أو التى تكتبها أنت. و قد أعطى ذلك "فيجوَل بيسيك" ميزة كبرى، و هى قابلية التوسع.

فإذا أردت أداء وظيفة معينة فى "فيجوَل بيسيك" و لم تجد أمراً مناسباً لها، عليك بالإجراءات الموجودة فى "ويندوز"، فإن لم تجدها هناك، يمكنك كتابتها بنفسك و وضعها فى مكتبة ربط ديناميكى ثم استخدامها فى برنامجك.

من صفحة 161 "بتصرف::محمد فاروق:بسبب تقادم المعلومات"

__________________________________________________________

توجد مكتبات الربط الديناميكى –فى الغالب- فى ملفات تنتهى بالامتداد .dll و تحتوى "ويندوز" على عدة مكتبات ربط ديناميكى توزع مع كل نسخة من "ويندوز". و ميزة هذه المكتبات أنك لا تحتاج إلى توزيعها على المستخدمين لأنها موجودة لديهم. و يوضح التالى أهم هذه المكتبات و استخدام كل منها:

Kernel32: الإجراءات المتعلقة بتشغيل البرامج، و تنظيم الذاكرة، و الانتقال بين البرامج المختلفة، و التعامل مع موارد النظام، و ما شابة.

user32: الإجراءات التى تتعامل مع النوافذ، مثل: صنع النوافذ و إظهارها و إخفاءها. الإجراءات التى تتعامل مع "الرسائل" التى ترسلها "ويندوز" للتطبيقات، و الإجراءات الخاصة بالقوائم و أشكال المشيرة .. و غيرها.

gdi32: الإجراءات الخاصة بالرسم و الصور و العرض على الشاشة و الطابعات و إجراءات التعامل مع الخطوط، و غيرها.

تحتوى هذه المكتبات الثلاث على معظم الإجراءات التى يحتاجها المبرمجون عند كتابة برامج لـ "ويندوز". و إضافة إلى هذه المكتبات توجد مكتبات أخرى، و لكنها أقل استخداماً مثل مكتبة lz32 التى تحتوى على مجموعة من الإجراءات الخاصة بضغط الملفات Compression أو مكتبة shell32.dll و عدة مكتبات أخرى.

أتابع معكم بعون الله، و نبدأ بالدروس بعد هذه المقدمة التوضيحية البسيطة، و لكن كما قلت، العمل كما أنوى أن يكون كبير، و سأبذل فيه جهد و وقت كبيرين أريد أن أتأكد أن هذا الموضوع أولى بهما من غيره، و أنه يحظى باهتمام عدد كبير من الأعضاء، و إلا ننصرف لموضوع آخر يهمكم، فيفيد أكبر عدد من الأخوة، و ليس عدداً محدوداً لا يجاوز أصابع اليد الواحدة. فالفكرة العامة من المنتديات هى النفع العام. و شكرا لجميع الأخوة: programer_vbnet و salem001 و عبد الله فتحي و الكتكوت و win98_eg و لكم جميعاً.

أخوكم

#9

مشكوراً أخي العزيز على هذا الجهد الوافر وأرجو أن ترفق الشرح في ملف pdf

#10

العفو dody_78، و نزولا على طلبك، راجع الملف المرفق

و لكن يبدو أنه لا يوجد إهتمام بالدروس 5 فقط صوتوا بنعم، إذا أعلمونى أي موضوع يلقى إهتمامكم حتى أحاول التطرق له و بهذا يفيد أكبر عدد من الأخوة الأعضاء؟

شاكر لك، و سلام.

apilesson.zip

#11

اشد على يدك Roka و اسمح لي ان اشاركك تقديم الشروحات (بأسلوبي الخاص و بما يسعني الوقت ..اذا سمحت طبعا)و اتمنى للجميع الاستفادة من هذه المبادرة الرائعة.

#12

الف شكر يا روقه

ولكن يا اخى الحبيب انت تضع الدروس فى وقت حرج جدا حيث ان الميع فى الامتحانات :'( ولذلك لن يتمكن عدد كبير من الاعضاء من التصويت لك ولكن اعتقد ان الجميع وانا واحد منهم فى حاجه لهذه الدروس

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

خسخس اسف :o قصدى osos

#13

بداية ،أشكركم جميعاً.

و بالنسبة أخى الكريم، hamohd70 أنا لى الشرف و تزيد الدروس شرف أن تحظى بإشتراكك فى تقديمها، و لكن أرجو أن ننسق حتى لا نكرر عرض نفس النقاط، أو تحب نترك المسائل هكذا و لو تكرر عرض بعض النقاط يكون أفضل لتناول الموضوع من كافة الزوايا، و إن كنا تناولنا نفس النقطة فإننا لن نتناولها بنفس الشكل، و من سيغفل عن جزئية متعلقة بالموضوع يكملها الآخر، و المستفيد النهائى هو الأخوة الأعضاء.

اخى العزيز أوس أوس، إنت قين يا راجل؟ لك وحشة جامدة، و شوف التواضع، آل تستفيد آل، دا أنا معول عليك فى مشاركاتنا. و أنت خبرة كبيرة، أحسبك كذلك و لا أزكيك على الله.

عموماً أنا لو لا تعرفون نسيت موضوع الامتحانات دة خلاص، و ربنا تاب عليا منه، و خدنا البكاروريا من زمان:D عقبال الجميع.

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

و سأبدأ بمقدمة فنية مفصلة عن الإجراءات، أدرجها غداً إن شاء الله.

#14

جزاك الله كل خير يأخ روقة

#15

أشكرك أخ evilgrin (f) و من جهتى أدعو الله أن يوفقنا جميعاً لما يحبه و يرضاه. و أن أقدر و أخوتى من المبرمجين أمثال hamohd70 و غيرنا كثيرين بإذن الله، فى تناول الموضوع بشكل واف و سهل فى نفس الوقت.

و سلامى لك

أخوك

#16

اتمنى منك تساعدني في حل مشكله احد التطبيقات وهي تخص

graphics application

يعني مثلاً:

creating fonts or drawing arts with windows graphics API FUNCTIONS

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

وكذلك اريد اعرف ماهي GDI وكيف تكون وسيط بيننا وبين الــwindow

اتمنى من الله ان تنفرج الامور على يدك

ايميلي هوnor515@hotmail.com

اختك اميـــــــــره

#17

roka:

انت تفصّل وانا البس....

#18

اخت اميره:

GDI هي اختصار Graphics Device Interface اي وسيط بين البرنامج و الهاردوير مثل الشاشه او الطابعه و تعطيك دوال تمكنك من الحصول على العرض الذي تريدينه دون الحاجه لمعرفة نوع الشاشه التي ستعرضين عليها او نوع الطابعة التي ستسخدمينها ..

وتتراوح انواع الدوال او الامكانيات التي توفرها الGDI من الخطوط الى الالوان الى الاشكال الى الصور و التعامل معها جميعا..

هذا بأختصار ارجو ان اكون قد اوضحت..

#20

دروس حلوة ولكن ...

بصيغه الدلفي;)

(f)

#21

الأخت الفاضلة أميره/ تحية طيبة و بعد.

كنت أنوى أن أتطرق للمواضيع فى الدروس حسب خطة محددة، و يأتى موضوع التعامل مع واجهة الرسومات GDI فى موضع لاحق جداً و لو أنى لم أتفق بعد مع الأخ hamohd70 بشأن خطة موحدة للدروس، و سبب عدم الاتفاق هو عدم طرح و نقاش هذه المسألة بعد، و يقيناً يمكن أن نضع خطة معينة نرى أنها المثلى فى تناول الموضوع، و نجرى عليها التعديلات حسبما توجب الظروف.

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

AlphaBlend - BitBlt - CreateBitmap - CreateBitmapIndirect - CreateCompatibleBitmap - CreateDIBitmap - CreateDIBSection - ExtFloodFill - GetBitmapDimensionEx - GetDIBColorTable - GetDIBits - GetPixel - GetStretchBltMode - GradientFill - LoadBitmap - MaskBlt - PlgBlt - SetBitmapDimensionEx - SetDIBColorTable - SetDIBits - SetDIBitsToDevice - SetPixel - SetPixelV - SetStretchBltMode - StretchBlt - StretchDIBits – TransparentBlt

و وظائف أخرى تتعامل مع الفرش المستخدمة فى الرسم مثل:

CreateBrushIndirect – CreateDIBPatternBrushPt – CreateHatchBrush – CreatePatternBrush – CreateSolidBrush – GetBrushOrgEx – GetSysColorBrush – PatBlt – SetBrushOrgEx – SetDCBrushColor

و وظائف تقوم بالتطويق Clipping مثل:

ExcludeClipRect - ExtSelectClipRgn - GetClipBox - GetClipRgn - GetMetaRgn - GetRandomRgn - IntersectClipRect - OffsetClipRgn - PtVisible - RectVisible - SelectClipPath - SelectClipRgn – SetMetaRgn

و وظائف أخرى مسئولة عن الألوان مثل:

AnimatePalette - CreateHalftonePalette - CreatePalette - GetColorAdjustment - GetNearestColor - GetNearestPaletteIndex - GetPaletteEntries - GetSystemPaletteEntries - GetSystemPaletteUse - RealizePalette - ResizePalette - SelectPalette - SetColorAdjustment - SetPaletteEntries - SetSystemPaletteUse – UnrealizeObject

و وظائف تهتم بالتعامل مع الاحداثيات و التحول (الاستدارة و التحجيم و التمديد ...) مثل:

ClientToScreen - CombineTransform - DPtoLP - GetCurrentPositionEx - GetGraphicsMode - GetMapMode - GetViewportExtEx - GetViewportOrgEx - GetWindowExtEx - GetWindowOrgEx - GetWorldTransform - LPtoDP - MapWindowPoints - ModifyWorldTransform - OffsetViewportOrgEx - OffsetWindowOrgEx - ScaleViewportExtEx - ScaleWindowExtEx - ScreenToClient - SetGraphicsMode - SetMapMode - SetViewportExtEx - SetViewportOrgEx - SetWindowExtEx - SetWindowOrgEx – SetWorldTransform

و وظائف أخرى تتعامل مع سياقات الرسم فى الذاكرة مثل:

CancelDC - ChangeDisplaySettings - ChangeDisplaySettingsEx - CreateCompatibleDC - CreateDC - CreateIC - DeleteDC - DeleteObject - DeviceCapabilities - DrawEscape - EnumDisplayDevices - EnumDisplaySettings - EnumDisplaySettingsEx - EnumObjects - EnumObjectsProc - EnumObjects - GetCurrentObject - GetDC - GetDCBrushColor - GetDCEx - GetDCOrgEx - GetDCPenColor - GetDeviceCaps - GetObject - GetObjectType - GetStockObject - ReleaseDC - ResetDC - RestoreDC - SaveDC - SelectObject - SetDCBrushColor – SetDCPenColor

و وظائف للتعامل مع الأشكال المملؤة بالألوان مثل:

Chord - FillRect - FrameRect - InvertRect - Pie - Polygon - PolyPolygon - Rectangle – RoundRect

و وظائف للتعامل مع الخطوط Fonts و النصوص مثل

AddFontMemResourceEx - AddFontResource - AddFontResourceEx - CreateFont - CreateFontIndirect - CreateFontIndirectEx - CreateScalableFontResource - DrawText - DrawTextEx - EnumFontFamExProc - EnumFontFamiliesEx - EnumFontFamiliesEx - ExtTextOut - GetAspectRatioFilterEx - GetCharABCWidths - GetCharABCWidthsFloat - GetCharABCWidthsI - GetCharacterPlacement - GetCharWidth32 - GetCharWidthFloat - GetCharWidthI - GetFontData - GetFontLanguageInfo - GetFontUnicodeRanges - GetGlyphIndices - GetGlyphOutline - GetKerningPairs - GetOutlineTextMetrics - GetRasterizerCaps - GetTabbedTextExtent - GetTextAlign - GetTextCharacterExtra - GetTextColor - GetTextExtentExPoint - GetTextExtentExPointI - GetTextExtentPoint32 - GetTextExtentPointI - GetTextFace - GetTextMetrics - PolyTextOut - RemoveFontMemResourceEx - RemoveFontResource - RemoveFontResourceEx - SetMapperFlags - SetTextAlign - SetTextCharacterExtra - SetTextColor - SetTextJustification - TabbedTextOut – TextOut

و وظائف للتعامل مع الخطوط Lines و المنحنيات مثل:

AngleArc - Arc - ArcTo - GetArcDirection - LineDDA - LineDDAProc - LineTo - MoveToEx - PolyBezier - PolyBezierTo - PolyDraw - Polyline - PolylineTo - PolyPolyline – SetArcDirection

و الوظائف التى تتعامل مع طريقة Metafile لحفظ تنسيقات الصورة مثل:

CloseEnhMetaFile - CopyEnhMetaFile - CreateEnhMetaFile - DeleteEnhMetaFile - EnhMetaFileProc - EnumEnhMetaFile - EnumEnhMetaFile - GdiComment - GetEnhMetaFile - GetEnhMetaFileBits - GetEnhMetaFileDescription - GetEnhMetaFileHeader - GetEnhMetaFilePaletteEntries - GetWinMetaFileBits - PlayEnhMetaFile - PlayEnhMetaFileRecord - SetEnhMetaFileBits – SetWinMetaFileBits

و الوظائف التى تختص بالتعامل مع شاشات العرض المتعددة (العرض على أكثر من جهاز عرض) مثل:

EnumDisplayMonitors - GetMonitorInfo - MonitorEnumProc - EnumDisplayMonitors - MonitorFromPoint - MonitorFromRect – MonitorFromWindow

و وظائف الطلاء و الرسم مثل:

BeginPaint - DrawAnimatedRects - DrawCaption - DrawEdge - DrawFocusRect - DrawFrameControl - DrawState - DrawStateProc - EndPaint - ExcludeUpdateRgn - GdiFlush - GdiGetBatchLimit - GdiSetBatchLimit  - GetBkColor - GetBkMode - GetBoundsRect - GetUpdateRect - GetUpdateRgn - GetWindowDC - GetWindowRgn - GetWindowRgnBox - GrayString - InvalidateRect - InvalidateRgn - LockWindowUpdate - OutputProc - PaintDesktop - RedrawWindow - SetBkColor - SetBkMode - SetBoundsRect - SetROP2 - SetWindowRgn - UpdateWindow - ValidateRect - ValidateRgn – WindowFromDC

و وظائف للتعامل مع المسارات (مسارات الرسم و ليس مسارات الملفات، لا يختلط عليكم التسمية) مثل:

AbortPath - BeginPath - CloseFigure - EndPath - FillPath - FlattenPath - GetMiterLimit - GetPath - PathToRegion - SetMiterLimit - StrokeAndFillPath - StrokePath – WidenPath

و وظائف التعامل مع أقلام الرسم مثل:

CreatePen - CreatePenIndirect - ExtCreatePen – SetDCPenColor

و وظائف تقوم بالطباعة مثل:

AbortDoc - DeviceCapabilities - EndDoc - EndPage - ExtEscape - SetAbortProc - StartDoc - StartPage -  - AbortPrinter - AbortProc - AddForm - AddJob - AddMonitor - AddPort - AddPrinter - AddPrinterConnection - AddPrinterDriver - AddPrinterDriverEx - AddPrintProcessor - AddPrintProvidor - AdvancedDocumentProperties Displays a printer-configuration dialog box for the specified printer, allowing the user to configure that printer.  - ClosePrinter - ConfigurePort - ConnectToPrinterDlg - DeleteForm - DeleteMonitor - DeletePort - DeletePrinter - DeletePrinterConnection - DeletePrinterData - DeletePrinterDataEx - DeletePrinterDriver - DeletePrinterDriverEx - DeletePrinterKey - DeletePrintProcessor - DeletePrintProvidor - DocumentProperties - EndPagePrinter - EnumForms - EnumJobs - EnumMonitors - EnumPorts - EnumPrinterData - EnumPrinterDataEx - EnumPrinterDrivers - EnumPrinterKey - EnumPrinters - EnumPrintProcessorDatatypes - EnumPrintProcessors - FindClosePrinterChangeNotification - FindFirstPrinterChangeNotification - FindNextPrinterChangeNotification - FlushPrinter - FreePrinterNotifyInfo - FindNextPrinterChangeNotification  - GetDefaultPrinter - GetForm - GetJob - GetPrinter - GetPrinterData - GetPrinterDataEx - GetPrinterDriver - GetPrinterDriverDirectory - GetPrintProcessorDirectory - OpenPrinter - PrinterProperties - PrintWindow - ReadPrinter - ResetPrinter - ScheduleJob - SetDefaultPrinter - SetForm - SetJob - SetPort - SetPrinter - SetPrinterData - SetPrinterDataEx - StartDocPrinter - StartPagePrinter – WritePrinter

و وظائف تتعامل مع المستطيلات "إحداثيات تحديد مناطق الرسم و الكتابة" مثل:

CopyRect - EqualRect - InflateRect - IntersectRect - IsRectEmpty - OffsetRect - PtInRect - SetRect - SetRectEmpty - SubtractRect – UnionRect

و وظائف التعامل مع مناطق الرسم مثل:

CombineRgn - CreateEllipticRgn - CreateEllipticRgnIndirect - CreatePolygonRgn - CreatePolyPolygonRgn - CreateRectRgn - CreateRectRgnIndirect - CreateRoundRectRgn - EqualRgn - ExtCreateRegion - FillRgn - FrameRgn - GetPolyFillMode - GetRegionData - GetRgnBox - InvertRgn - OffsetRgn - PaintRgn - PtInRegion - RectInRegion - SetPolyFillMode – SetRectRgn

و على كل، فهناك الكثير من "الناحية النظرية" يجب معرفته عن الصور Bitmaps و لوحات الألوان Palettes و كائنات Sprite و اقنعة الرسم أو كما يطلق عليها أحيانا Masks or Color Keys و أساليب الحركة Animation و التعامل مع المخازن المؤقتة Buffers للرسم فى الذاكرة بعيداً عن ذاكرة الفيديو بغرض التسريع و .... أشياء كثيرة جداً. أرجو أن نتناولها بالتفصيل لدى عرضنا لهذا الجزء و الذى سيأتى كما قلت لاحقاً بعد تقديم الأساسيات.

و بالرغم من كل شيء و حتى لا أرد سؤالك بدون إجابة إليكِ تعريف بسيط لواجهة الرسومات GDI:

إن GDI جزء من واجهة برمجة التطبيقات و كما أسلفت فى مشاركة سابقة فإن واجهة برمجة التطبيقات عبارة عن مجموعة إجراءات سابقة الترجمة "ملفات تنفيذية أو بالأحرى ملحقات ملفات تنفيذية DLLs" تقوم بعمل واجهة بين بيئة ويندوز و اجهزة التى تعمل عليها، و بالتالى فلم يعد المبرمجون مضطرون لمعرفة أى شئ عن الأجهزة المسئولة عن هذه العمليات و لا كيفية تصميمها أو عملها بعكس ما كان عليه الوضع قديماً، و عندما نقوم بتحميل Form أو نضع صورة فى أداة الصور PictureBox فإننا نجعل فيجوال بيزيك يستخدم GDI لعمل ذلك و هذا بالتأكيد شيء مريح حيث أننا لا نقوم بالتعامل مع واجهة الرسوم، بل يقوم فيجوال بيزيك بهذا الجهد بالنيابة عنا، و لكن هذا يأتى بالتأكيد على حساب السرعة، و لهذا لا تعد فيجوال بيزيك لغة جيدة للتعامل مع الرسومات، فأوامر الرسوم به بطيئة جداً بالنسبة لعمل ألعاب سريعة، و لكن يمكن التغلب على مشكلة البطء هذه بالتعامل مباشرة مع واجهة الرسومات من فيجوال بيزيك بعد الإعلان عنها "مسألة بسيطة جداً" و من ثم إتباع الترتيب المناسب لكتابة الأوامر، و بهذا يمكن إضافة المزيد من السرعة و التحكم للرسومات من خلال فيجوال بيزيك، و بالرغم من سرعة التعامل مع الرسومات باستخدام GDI فإن مصممى الألعاب دائماً ما يطلبون المزيد متى تعلق الأمر بالسرعة و الإمكانات و التحكم و لهذا ظهرت تقنية DirectX و التى تسمح لمبرمجى ويندوز بالوصول لأجهزة الرسومات مباشرة و مع ذلك نجحت فى الإبقاء على السهولة.

أرجو أن أكون أوضحت لك الموضوع بإختصار، فلم أدخر جهداً فى ذلك.

بالنسبة للأخ رضا، قرأت مشاركتك فى "منتدى مبرمجي Borland Delphi" و هى كافية وافية، حقيقة مشاركة ممتازة، و لكن كما أسلف الأخ hamohd70 هو أن الموضوع جاء من وجهة نظر Delphi و هى مختلفة كثيراً كما يبدوا لى، و إن كنت أختلف مع عبارة و ردت فى مشاركتك المكتوبة بتاريخ: 18-03-2003 09:48 صباحاً.

و أقتبس لصقاً من المشاركة

"عذرا لان الشرح قد يكون مملا للبعض لكن الهدف حو محاولة تغطية الفج العميق للنقص في هذه اللغة فلسنا مضطرين لتعلم الفيجوا بيسك كي نتعلم الapi

علما أن الApi في الDElphi لاتحتاج إلى كل التعقيدات الموجودة في الفيجوال"

فأنا أعرف أن السبب هو إختلاف لغة فيجوال بيزيك عن لغة دلفى هو ما جعلك تقول ذلك، فأنا من ناحيتى رأيت أن لغة دلفى معقدة، و هو ما لن تتفق معى فيه و هذا طبيعى، فلغة فيجوال بيزيك كانت تبدو معقدة لى و أعتقد كذلك كانت تقابلك صعوبات مع دلفى فى بداية التعلم، و كذا قد يعتقد كلانا أن لغة التجميع معقدة، و ربما لن يتفق معنا مبرمجى لغة التجميع؛ أعتقد على الأقل!!

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

و مشكور على مشاركتك و على جهدك الرائع فى منتدى مبرمجى بورلاند دلفى.

بالمناسبة، أرجو عدم طلب رد على e-Mail و ذلك لأن الموضوع قد يهم آخرين و يهمهم معرفة الرد، فحتى تعم الفائدة و هو المقصود من وراء المنتديات.و أرجو ألا يفهم كلامى خطأ، و يفهم على أساس أنه مكتوب بمودة و ليس بغير ذلك، و ليس به تلميحات أو غير ذلك، مجرد ذكرنى شيء لكتابة هذه الجزئية فكتبتها.

غداً إن شاء الله، أقوم بكتابة أول درس، و هو عن الإجراءات بشكل عام فى فيجوال بيزيك و إنطلاقاً و بالمقارنة مع إجراءات واجهة البرمجة.

و كتقليد عام، أنوى إتباعه سأدرج كل مشاركة فى صيغة PDF نزولاً على رغبة الأخ dody_78 و أعتقد فكرة جيدة.

وفقنا الله و إياكم لما يحبه و يرضاه.

replies.zip

#22

(f)(f)

#23

(f)جزاك الله خيرا(f)

#24

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

سأستمر بناء على تقييمكم.

api.zip

#25

الأخو الكرام، متابعة للدرس الأول، جارى استكماله، و التطرق لاجراءات واجهة برمجة التطبيقات

ملحوظة، أفضل درجة تكبير Zoom لملف الـ PDF على الأقل عندى، هى 140%

و ملحوظة أخرى، هذا الملف أحدث من السابق، لذا لا تحملوا الملف السابق "المرفق بالمشاركة السابقة لهذه المشاركة مباشرة"، و مع أنى شبه متأكد من أنى سأجد من قام بتحميله بالرغم من ذلك :P

أخوكم

api2.zip

هذا الموضوع مغلق.

مواضيع مشابهة