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

API programming

مغلق
بدأه ikossan في 7 أبريل 2005 · 31 رد · 19,527 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما هي API؟

البرمجة في ويندوز تتمثل في القدرة على إنشاء و إدارة واجهة المستخدم الرسومية Graphical User Interface (مختصر GUI).

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

ففي دوس كانت محاولات خجولة لجعل الواجهة رسومية و جميلة تغير الواجهة المعتادة للتطبيقات المعتادة ذات الشاشة السوداء Console application for MSdos . فظهرت بوادر البرمجة في دوس بأشكال محتلفة تعتمد على قوائم وأزرار ترسم باستعمال دوال بدائية نصية وسميت مثل هذه التطبيقات ب Textual User Interface. هذه صورة لمثل هذه الواجهات التي كانت تحاكي عمل النافذة في ويندوز قبل ظهور ويندوز:

TUI.gif

برمجة مثل هذه الواجهات في دوس لم يكن بالأمر السهل ولم يكن في متناول كل المبرمجين, فما بالك بالبرمجة في منصة ويندوز لواجهات رسومية جميلة و تفاعلية, حيث مجموعة من النوافذ تعرض في آن واحد على شاشة الحاسب, ويمكن للمستخدم التنقل من نافذة لأخرى بكل يسر و بساطة, فالنافذة الأولى مثلا تعرض نص وصور في محرر نص, ونافذة أخرى تقوم بطباعة تقرير على الطابعة, وأخرى تقوم بإتصال مع شبكة محلية... :o .

كيف يمكنك برمجة مثل هذه النوافذ التي يعرضها ويندوز بنفس الوساءل التي كانت متاحة سابقا في منصة الدوس؟

إنه أمر مستحيل وضرب من الجنون أن تعتمد على نفس الوساءل للحصول على نفس النتيجة :wacko: !!!.

لحسن الحظ Microsoft قامت بتطوير وسيط لبرمجة مثل هذه التطبيقات يقوم بالعمل بدلا عنك :lol: .

هذا الوسيط هو Api وهي مختصر ل Application Interface Programming, دورها بسيط للغاية , يتمثل في توفير على أطباق ذهبية مجموعة هائلة ومتنوعة من الدوال موجهة للتحكم في كل عناصر الحاسب ( وحة المفاتيح, الفأرة , الطابعة, الشاشة, القرص الصلب الذاكرة الحية...) و كذلك تحقيق مهام عديدة (طباعة نص , رسم صور, نسخ ملفات, عرض نوافذ..).

لنضرب على سبيل المثال عرض نافذة على شاشة الحاسب لتبيان دور دوال API. ستقول أن عرض نافذه ليس بالأمر السحري أو الخارق <_< !!

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

زر <إغلاق > يجب على النافذة أن تختفي" أو "إذا نقرت على حاشية النافذة بالفأرة وحركت المؤشر فإن النافذة سيتغير حجمها تبعا لحركة الفأرة"...إلخ

واووو :o هذا ليس بالأمر السهل!! على رسلك, كل ما ذكرته تقوم به دالة واحدة فقط من دوال API , إذا ما ذكرت غيرها,

()CreateWindow , هذه الدالة تقوم بإنشاء نافذة بكل مقومات "نافذة" في منصة ويندوز: تضم شريط للعنوان وثلاث أزرار صغيرة (إغلاق, تكبير, تصغير) وقائمة للنظام SystemMenu , هذه النافذة تستجيب لكل الإستفزازات :lol: التي يقوم بها المستخدم من تحريك وتكبير وتصغير و تغيير الحجم ....

API تمثل مساعدة جد جد قوية للمبرمج للواجهات الرسومية بتوفير كل الوسائل والإجرائيات ( على شكل دوال و هياكل بيانات) التي تنفذ بطريقة آلية وسلسة مجموعة من المهام والأوامر المركبة والمعقدة.

وهذه الدوال تستطيع التعامل معهل واستدعاءها في معظم لغات البرمجة : سي وسي++ و ديلفي وباسكال وحتى لغة التجميع وغيرها كثير.

الفرق ما بين نظام التشغيل و Api windows؟

يجب توضيح الفرق ما بين api windows و ما بين نظام التشغيل Windows operating system.

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

هناك نظم تشغيل مثل unix لا تملك سوى api واحدة, وأخرى مثل ويندوز تملك العديد من APIs. فويندوز منذ بداياتها الأولى بإصدارة windows 1.01 ملكت إثنتين: win16 و msdos-api التي تمثلت في مقاطعة الدوس الشهيرة int21.

ويندوز WindowsNT مثلا تستطيع تشغيل مجموعة أكثر من api وهي: MS-Dos Api و win16 و win32

وposix (وهي Portable Operating System Interface وحرف x كإشارة ل Unix).و OS/2 كونسول. أما إصدارات Winows 9x كويندوز95 فتنفذ تطبيقات dos/win16 و win32.

من جهة أخرى فإن التطبيق في ويندوز هو تطبيق وفي للغاية لل API التي برمج لها. فلا يستطيع تطبيق ويندوز إستدعاء اكثر من API واحدة فقط, فعلى سبيل المثال برنامج الحاسبة calc.exe في ويندوز 95 لايستدعي إلا api win32.

حتى في نظام التشغيل windowsNT الذي يتحمل عدة Api فالبرامج التنفيذة تبقا دائما وفية للApi التي برمجت له. فعنذ تنفيذ التطبيق يقوم نظام التشغيل بتوفير دوال Api التي تتناسب معه, و يصدر رسالة خطء تخبر المستخدم بنوع Api التي يحتاجها التطبيق إذا لم وفرن نظام التشغيل على api الملائمة.

حاول أن تنفذ برنامج calc.exe في MS-dos 6.11, ستحصل على رسالة إخبارية على أن هذا التطبيق هو تطبيق ينفذ فقط في Winoows 32bits.

ماهية ال API:

ما هي حقيقة Api هل هي بروتوكول أم منصة برمجة أم شيء آخر؟

Api تتجسد حقيقة في ملفات مخزنة في مسار ويندوز وهي مجتمعة معظمها في(C:\windows\system(32.

مكونات winapi الأساسية بدون جدال هي kernel و GDI و USER.

ففي win16 هذه المركبات تتجسد في ملفات Kernel.exe ( وكذلك kernel286.exe و kernel386.exe حسب نظام التصرف مع الذاكرة) وملف user.exe و gdi.exe.

رغم أن هذه الملفات تحمل إمتداد exe.* غير إنها كله عبارة عن ملفات ربط ديناميكي (التي تحمل عادة إمتداد dll.* غير إن هذا الإمتداد لم يكن معروفا قبلا في windows 3.x).

للتوافق مع الإصدارات المتتالية لويندوز , حافظت هذه الملفات على نفس التسمية في win32 مع اختلاف طفيف في الأسم مع نظيراتها السابقة في win16 وهي : kernel32.dll و gdi32.dll و user32.dll.

فكل ملفات API هي ملفات ربط ديناميكية مما يسهل أستدعائها في نفس الوقت من طرف مجموعة كبيرة من التطبيقات.

kernel: هي النواة والقلب النابض, مهمتها هي توفير كل الدوال الخاصة بالنظام مثل عمليات الدخل والخرج I/o, نسخ و تحويل مسارات الملفات, التحكم بالذاكرة. و من أهم مميزاتها هي threads و mutex و semaphore و critical section objects.....إلخ

GDI: المكون الثاني للApi وهي Graphics Device Intreface.

هي المكتب الرئيسية المختصة بعرض كل ما هو رسم (قلت الرئيسية لأنها توجد مكتبات للرسم أخرى مثل openGl و WinG).

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

GDI توفر خدمتين رئيسيتين: إنشاء الأشكال الرسومية, و تخزين الصور والرسوم.

الأشكال الرسوميو هي كل شيء يرسم على الشاشة من نصوص text, أو رسوم خطية Vectorial (رسم باستعمال الخطوط والدوائر و المربعات -الأشكال البدائية-), أو الرسوم المصفوفية matricial.

تخزين الصور والرسوم في Gdi يتم على شكلين: الصور Bitmap و الرسوم من صنف matafiles. الصور من صنف bitmap هي رسوم مكونة من جداول من البيكسل على شكل مصفوفة ذات بعدين. تستعمل في رسم شكل النوافذ من قوائم وشريط العنان الأزرق و حاشية النوافذ وأزرار الإغلاق والتكبير و التصغير, أسهم Scrollbar وغيرها...

أما metafiles فهي على العكس ليست برسوم ,وإنما مجموعة مكدسة من إستدعاءات لدوال gdi. فعند استعراض ملف من نوع metafile فإن ويندوز تستدعي gdi لرسمها على الشاشة, مما يجعل مثل هذه الملفات بطيئة رغم صغر حجمها مقارنة مع bitmap مما يفسر أستعمال هذه الأخيرة أكثر في رسم النوافذ.

USER: هي كل ما يتعلق بالتعامل والتفاعلية مع المستخدم من أوامر واستجابات لمتطلباته, بما فيها النوافذ و القوائم و مربعات الحوار و صناديق الحوار, الأزرار, اللوائح المنسدلة .... وكثير غيرها.

فكل تصرفات المستخدم, سواء بالفأرة أو بلولوحة المفاتيح أو غيرها فهي موجهة بالأساس للنوافذ أو لمكوناتها المرئية.

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

فكل حركة فأرة أو ظغطة زر هي حدث.

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

فمهما كانت بيئة التطوير التي تستعملها أو لغة البرمجة التي تبرمج بها تطبيقاتك: سي أو سي++ أو باسكال أو ديلفي... فإن المصرف سيقوم بترتيب استدعاءات هذه الدوال في برنامجك التنفيذي وقد يخفي عليك كثيرا من تركيباتها وتعقيداتها عندما سيوفر لك مكتبات برمجة معدة لتبسيط التطوير مثل مكتبات MFC في ++VisualC أو مكتبات VCL في ديلفي ...

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

B) .

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#2

يبدو انك لن تغير :angry: اسلوبك الرائع يا ايكوسان

هاها :lol:

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#3

ما بال أسلوبي يا romanof؟

أتريدني أن أكتب عنك موضوعا أصرعك فيه :angry: . جرب وسترى grrrrrrrrrrrrrrrr

Ecrase_Big.gif

:lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#4

الله يفتح عليك يا استاذ الاساتذة وشكرا لك

{ربى زدنى علما}

#5

مشكورين JuStNiCk و romanof. :D

سأحاول مستقبلا الكتابة عن كيفية البرمجة باستعمال فقط دوال API دون الإعتماد على مكتبة VCL.

أبحث حاليا على قليل من الوقت وخصوصا على حاسب محمول لأنني كثير السفر مما يعيق انظباطي في المنتدى.

تحياتي لكم :lol: أسألكم الدعاء

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#6

روح الهي يجعل لك في خطوة سلامة

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#7

الأخ ايكوسان :D :D :D :D

سلام الله عليك

الله يبارك لك في علمك وصحتك

20_09_05_04_45_39_1127216739saudi_aC_.gif
#8

بالامانه انا مش عارف اقول ايه

اقتباس

آسف الدخول متقطع هذه القتره

اقتباس

[يمين]

.[/يمين]

A7med_prof-4-2007.jpg

اخر مواضيعي 2007

االمثال مطبق على موقع بورصه سعودي

.

.

مواضيع مهمه ومطلوبه بكثره VB6

.

بــرامج ومشــاريع عربيه كامــله {HnHn} والمزيد في قسم برامج الاعضاء || ربط قواعد بيانات اكسس مع الفيجوال بيسك, مادة دراسية كاملة {بنت اليمن}|| المرجع الشامل لجمل SQL ا {GENIUS-IT} || كيفية التعامل مع مكتبة الـ DAO, في الوصول إلى قاعدة بيانات {رمضان} || مثال ريط Visaul Basic 6.0 مع SQL SERVER ا || العمليات التي تجرى على قاعدة البيانات, مثال كامل {بنت اليمن} || تصدير البيانات من الاكسل الي الاكسس بالفيجوال بيسك {HnHn} || البحث في قاعدة البيانات {MANSUR} || قواعد البيانات العلائقية وتقنيات الوصول إليها {عبد الله فتحي} || كيفية أظهار بيانات جدولين بواسطة التاريخ ,,,,,,,

.

أخي ربما سؤالك اجابته في أحدى هذه المواضيع فإن لم تجد قم بالبحث وان لم تجد اطرح سؤالك مع وضع عنوان مناسب بحيث ان يكون هذا العنوان دال على محتوى الموضوع فغير ذلك من أكبر الكبائر في المنتدى وسيؤدي الى غلق او حذف موضوعك .

.

</
#9

جزاك الله الف خير اخي ايكوسان على الموضوع الرائع

اللهم صلي وسلم وبارك على سيدنا محمد صلى الله عليه وسلم

#10

مقدمة: البرمجة باستعمال دوال win32 Api:

هذه الدروس موجهة بالأساس للمتوسطين بالبرمجة بلغة الباسكال ديلفي ويتقنون قواعد اللغة النحوية. البرمجة باستعمال دوال win32 api , دون استعمال مكتبات ديلفي VCL أو ما يماثلها من المكتبات الموزعة, تعتمد بالأساس على ضبط أساسيات لغة الباسكال دون الحاجة لفهم البرمجة الشيئية. فكل دوال وين32 كتبت بالأساس بلغة سي وليس ب سي++.

أدوات البرمجة بالوين32 في ديلفي:

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

لهذا فإن أي محرر نصوص Ascii , و مصرف ديلفي Dcc32.exe سيكون هو العتاد الأدنى الذي يمكنك أن تتسلح به.

في ديلفي: file -> New -> Other -> Console Application.

ستحصل على هذا الكود:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  { TODO -oUser -cConsole Main : Insert code here }
end.

قم بحذف هذا السطر {$APPTYPE CONSOLE} لأنه مخصص لتطبيقات الكونسول في ويندوز.

وكذلك غير حيز uses بإضافة Windows ويمكنك حذف SysUtils.

ليصبح نص الكود كالتالي:

program Project1;

uses
  Windows;

begin
  { TODO -oUser -cConsole Main : Insert code here }
end.

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

كما قلت سابقا يمكنك تحرير هذا الكود في اي محرر للنصوص الذي يعتمد على Ascii ك Notepad مثلا( لا تستعمل محررات النصوص المفرمطة ك MsWord).

ثم سجل الكود في ملف بامتداد dpr.

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#11

ألتطبيق الأول: برنامجك الأول لل API

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

إتبع الطريقة التي وصفتها لفتح مشروع جديد في ديلفي ( برنامج مشروع كونسول) ثم أكتب نص الكود الآتي:

program Project1;

uses
  Windows;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  MessageBox(0,'Hello World;) .', 'Arab team 2000',
              MB_OK + MB_ICONINFORMATION);
end.

سجل هذا الكود في ملف c:\path...\project1.dpr, قم بفتح نافذة للدوس و أكتب فيها الأوامر التالية:

c:
cd\
cd c:\path...\
bcc32 project1.dpr

سيقوم حينها المصرف بإنشاء الملف التنفيذي project1.exe.

يمكنك الضغط مباشرة على المربع الأخضر أو على run-> run أو على زر F9, هذا إذا ما كنت تستعمل محرر الكود لديلفي.

إذا ما نفذت هذا التطبيق ستحصل على مثل هذه الصورة:

Project1.gif

هنيئا :lol: , لقد نجحت في تصميم تطبيقك الأول باستعمال دوال Win32 Api فقط’ ةهذا باستعمال دالة MesageBox.

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

صيغة هذه الدالة هي:

[Delphi] function  MessageBox(
    Handle : THandle,
    Text: PAnsiChar,
    Caption: PAnsiChar,
    Flags: Integer): Integer;

البراميترات لدالة messagebox:

Handle: باراميتر يعرف النافذة الرئيسية, في برنامجنا لا توجد إذن سنعطيها قيمة 0 .

Text: سلسلة محرفية التي ستعرض كنص الرسالة.

caption: سلسلة محرفية التي تمثل عنوان النافذة, ستكتب في شريط العنوان للتطبيق.

Flags: تركيبة منطقية باستعمال OR, تقوم بتحديد الأزرار و نوع الأيقونة, كل هذه الرايات تبتدئ ب _MB.

بالنسبة للأزرار:

    MB_OKCANCEL, MB_OK,  MB_ABORTRETRYIGNORE   ,MB_YESNOCANCEL, MB_YESNO ,  MB_RETRYCANCEL.

و بالنسبة للأيقونات :

 MB_ICONHAND ,  MB_ICONQUESTION,  MB_ICONEXCLAMATION,  MB_ICONASTERISK   MB_USERICON و
MB_ICONWARNING= MB_ICONEXCLAMATION;
MB_ICONERROR  = MB_ICONHAND;
MB_ICONINFORMATION= MB_ICONASTERISK;
MB_ICONSTOP

هذه الدالةMesageBox ترجع رقما من صنف Integer يدل على الزر الذي ضغطه المستعمل. والقم التي ترجعها هي :

  IDOK = 1; 
  IDCANCEL = 2;
  IDABORT = 3;
  IDRETRY = 4;
  IDIGNORE = 5;
  IDYES = 6;
  IDNO = 7;
  IDCLOSE = 8;
  IDHELP = 9;  
  IDTRYAGAIN = 10;
  IDCONTINUE = 11;

مثال لتطبيق يعتمد على استخدام هذه الدالة و على الأستفادة من ضغطة الزر للمستخدم:

program Project1;

uses
  Windows;

var
 IdButton: integer;
begin
  { TODO -oUser -cConsole Main : Insert code here }

IdButton:= MessageBox(
            0,
            'Hello World;) .',
            'Arab team 2000',
            MB_YESNOCANCEL + MB_ICONINFORMATION);

case IdButton of
 IDYES: MessageBox(0,'Yours answer was "Yes"','button?', MB_OK + MB_ICONASTERISK);
 IDNO: MessageBox(0,'Yours answer was "No"','button?', MB_OK + MB_ICONASTERISK);
 IDCANCEL: MessageBox(0,'Yours answer was "Cansel"','button?', MB_OK + MB_ICONASTERISK);
 end;
end.

وهذا مثال آخر لنص رسالة طويلة في أكثر من سطر:

program Project1;

uses
  Windows;

begin
  { TODO -oUser -cConsole Main : Insert code here }
MessageBox(
            0,
            'Hello World;) .' + #13#10 + 'it''s a second line!!'
            +#13#10+ 'And this is the 3rd.',
            'Arab team 2000',
            MB_YESNO + MB_ICONEXCLAMATION);
end.

في الدرس المقبل سنرى كيف نرسم نافذة بحرية أكثر B) .

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#12

ماشاء الله تبارك الله خمسة خميسة حوش يا حواش

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#13

:D :D :D :D :D

:D :D :D :D :D

أحلى يا بطل

20_09_05_04_45_39_1127216739saudi_aC_.gif
#14

بارك الله فيك اخي مراد

:lol: :lol: :lol: :lol:

تم تعديل هذه المشاركة بواسطة سيف الدين 2 في 17 أبريل 2005 في 08:33

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

وتعاونوا على البر والتقوى ولا تعاونوا على الإثم والعدوان

.............................................................................................................................

لنبدا دورة دلفي

سلسلة تعلم برمجة Pascal , تعلم اساسيات الباسكال

التحكم بمنفذ الطابعة عن طريق الدلفي

سلسلة دروس تعلم قواعد بيانات Midas

هيا لنبدأ بالApi

أفكار سريعة, مجموعة شفرات صغيرة وفاعله لدلفي

كتب + مواقع ::: مراجع مهمة للغة دلفي, مجموعة كتب مجانية + مواقع مفيدة

مكتبه الأكواد, أكواد وبرامج دلفي

.............................................................................................................................

18_07_05_10_53_18_1121752398da3wa_18.gif

#15

الكبير كبير يا عم

{ربى زدنى علما}

#16

الكبير كبيير يا عم ...

#17

نعم يا سيدي .

الكبير كبيير يا عم ...

على من تتكلمون يا عصابة الخير :lol:

تم تعديل هذه المشاركة بواسطة ikossan في 17 أبريل 2005 في 18:30

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#18

:D :D :D :D

عليك طبعاً يا رئيس العصابة

20_09_05_04_45_39_1127216739saudi_aC_.gif
#19

سيدى زعيم العصابة(عصابة الخير) ننتظر المزيد لا استطيع الانتظار اكثر من ذلك

"الكبير كبير يا كبييير"

شكرا

{ربى زدنى علما}

#20

الدرس الثاني : برمجة تطبيق بنافذة.

مبدأ عمل التطبيقات ذات الواجهة الرسومية:

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

فكل هذه الأمور التي تطرأ تسمى أحداث Events.

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

هذا عكس ما كان مثلا في تطبيقات الدوس , فالمبرمج في نظام الدوس كان يكتب برنامجه وفق تتابع و تراتب زمني أو منطقي , حيث انه يمكنك تتبع البرنامج والمسار الذي يسلكه,فهو عنده بداية محددة ونهاية معلومة.

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

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

فالقلب النابض في برنامجك والجزء المنظم له هي الدالة الرئيسية التي ستتولى الأستجابة لهذه الأحداث.

فتطبيقات ويندوز تستجيب للأحداث التي سيطلقها المستخدم وحتى بعض الأحداث التي تأتي من نظام التشغيل نفسه.

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

ويندوز تملك حيزا من الذاكرة Buffer تقوم بوضع وتخزين كل الرسائل , كل رسالة مرتبطة بحدث موجه لتطبيق او نافذة.

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

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

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

تعريف هذه الرسائل في api لويندوز:

{ Message structure }
  TMSG = packed record
    hwnd: HWND;
    message: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
    time: DWORD;
    pt: TPoint;
  end;

أهم عناصر هذا السجل:

  • Handle:hwnd وهو الرقم الذي تحدثنا عليه -رقم علبة البريد- فهو الرقم الذي يحدد من هو المرسل إليه :lol: .
    فعند كل بدأ تنفيذ تطبيق, تقوم ويندوز بأعطاء رقم يصاحب هذا التطبيق حتي إغلاقه. فهو رقم يميزه عن كل تطبيق آخر, لا يمكن أن يعطى نفس الرقم في آن واحد لتطبيقين, حتى لو كان نفس التطبيق ينفذ مرتين( كأن تفتح نافذتين للwordpad) فكل نسخة instance ترفق برقم واحد وأحادي.
    هذا الرقم لا يمكن أن تجده هو نفسه اذا ما أغلقت التطبيق و أعدت فتحه من جديد B) .
  • message: هي عنوان الرسالة مثلا "ضغطة زر"= WM_CHAR.
    كل هذه الرسائل تبتدأ ب _WM دلالة علىWindows Messages.
  • WPARAM,LPARAM: تحمل عادة نص الرسالة. فهي تشرح مضمون الرسالة: مثلا إذا كانت الرسالة هي WM_CHAR, فستجد في WPARAM كود المحرف الذي ضغط على لوحة المفاتيح, وفي LPARAM معلومات أخرى كعدد المرات التي استمر المستعمل في ضغط الزر وهل رافق الضغطة ب أزرار التحكم ك CTRL او ALT...

هناك دالة تتولى استقبال هذه الرسائل في تطبيقك, فكل نافذة تنشأ تملك مثل هذه الدالة التي ستتولى الأستجابة لكل حدث بالمهمة المنوطة به.

تسمى هذه الدالة "بإجرائية النافذة" Windows Procedure .في بعض الأحيان نجد أن التطبيق يربط "إجرائية النافذة" بأكثر من نافذة من النوافذ التي يملكها.

فكل رسالة يقرؤهاِ التطبيق يحولها لهذه الدالة. وطبعا كل رسالة هي حدث Event.

تطبيق win32 يملك نافذة:

في الدرس الأول قمنا بتعلم كيفية رسم علبة رسائل Message Box. رسم مثل هذه النوافذ بسيط للغاية, فويندوز قامت بكل العمل بواسطة دالو واحدة ()MessageBox.

لكن هذا النوع من النوافذ نوع خاص لا يعطي للمستخدم حرية في تصميمه, فهي نافذة تعرض نصا, وبجواره أيقونة, تحت النص مجموعة محدودة من الأزرار معرفة في Win API.

فلا يمكنك التحكم بالموضع الذي ستضهر فيه هذه النافذة, لا يمكنك عرضها بالحجم والأبعاد الذي تريدها, ولا تملك مجموعة من اللمتحكمات Controls التي اعتدناها في ويندوز مثل القوائم Menu. اللوائح المنسدلة ComboBox, علب التحرير EditBox, الصور , الصوت,.... :(

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

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

هذه الصورة تستعرض المكونات الرئيسية لنافذة في ويندوز:

BasicWindow.gif

بما ان هذه الميزات متعددة وكثيرة, فيجب قبل إنشاء النافذة وعرضها, يجب ان نحدد نموذج للنافذة Window Prototype.

عندما نحدد نمودج للنافذة, سنطلب من ويندوز أن ترسم نافذة وفق هذا النمودج.

هذا النموذج نحدده بإعطاء قيم في سجل يسمى WindowClassEx:

  {$EXTERNALSYM TWndClassEx}
  TWndClassEx = packed record

    cbSize: UINT;
    style: UINT;
    lpfnWndProc: TFNWndProc;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: HINST;
    hIcon: HICON;
    hCursor: HCURSOR;
    hbrBackground: HBRUSH;
    lpszMenuName: PAnsiChar;
    lpszClassName: PAnsiChar;
    hIconSm: HICON;
  end

;

هذه الكلاس هي التي ستحدد الخصائص العامة للنافذة, كنوع مؤشر الفأرة أو أيقونة النافذة..

باراميترات WndClassEx:

  • cbSize:هو عدد البايتات المكونة للكلاس, تعطى هذه القيمة بالدالة SizeOf(..) . مثلا sizeof(WNDCLASSEX).
  • style:مجموعة من الميزات الخاصة بكلاس النافذة تسمى Class Style تبتدا كلها ب _CS, مثل CS_VREDRAW التي تعيد رسم النافذة عندما يتغير حجمها عموديا, أو CS_NOCLOSE لتعطيل إغلاق النافذة ...وغيرها. يمكن إعطاء تركيبة من هذه الخصائص مع ربطها ب + أو ب OR. كما يمكنها أخذ قيمة 0.
  • lpfnWndProc:مؤشر نحو موقع إجرائية النافذة Window Procedure.
  • cbClsExtra,cbWndExtra: مجموعة من البايتات تحجز لللأستعمال من بعض دوال Api. يقوم ويندوز بلإعطاءها قيمة 0 إفتراضيا.
  • hInstance: الهاندل Handle الذي تعطيه ويندوز لكل تطبيق عند بدء تنفيذه. (رقم علبة البريد :) للتطبيق.)
  • hIcon: هاندل Handle الأيقونة التي ستظهر عند تصغير النافذة في TaskBar. يمكنك تحميل أيقونة من حجم 32*32 بيكسل من ملف الوارد للتطبيق بواسطة دالة من دوال Api المخصصة LoadIcon().
  • hCursor: هاندل لمؤشر الفأرة الذي ستستعمله النافذة عندما ستحرك الفأرة فوقها. تحمله من ملف الوارد للتطبيق باستعمال LoadCursor().
  • hbrBackground:هاندل للفرشاة التي ستستعمل لرسم خلفية النافذة. يمكنك استعمال مجموعة إفتراضية معرفة في ويندوز (يجب دائما إضافة رقم واحد لها +1): مثل COLOR_BTNFACE+1 أو COLOR_WINDOW +1.
  • lpszMenuName:سلسلة محرفية لإسم قائمة menu. إذا لا توجد قائمة للنافذة فيجب إعطاؤها سلسةمحرفية فارغة = '' أو 0.
  • lpszClassName:إسم الكلاس للنافذة. هذا الإسم سيميز هذه الكلاس.
  • hIconSm: هاندل لأيقونة صغيرة الحجم (غالبا 16*16بيكسل) . تظهر هذه الأيقونة في الجانب الأعلى يسارا للنافذة

عند الإنتهاء من ملأ كلاس النافذة بالقيم المطلوبة, يجب تسجيلها بواسطة الدالة ()RegisterClassEx, قبل إنشائها.

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

سنستعمل دالة ()CreateWindowEx:

function CreateWindowExW(
        dwExStyle: DWORD;
        lpClassName: PWideChar;
        lpWindowName: PWideChar;
        dwStyle: DWORD;
        X, Y, nWidth, nHeight: Integer;
        hWndParent: HWND;
        hMenu: HMENU;
        hInstance: HINST;
        lpParam: Pointer): HWND;

باراميترات ()CreateWindowEx:

  • dwExStyle: مجموعة من الميزات و الخاصيات القوية التي تعطي شخصية فريدة للنافذة: مثل WS_EX_ACCEPTFILES لكي تقبل النافذة جر وإفلات الملفات أو ما يعرف ب .drag-drop أو WS_EX_RTLREADING لستعمال للغاة التي تكنب من اليمين للشما كللغة العربية.. وغيرها كثير. كلها تبتدأ ب WS_EX_.
  • lpClassName: إسم كلاس النافذة التي تمثل النمودج البدئي. سيكون نفس الأسم الذي أعطيناه في TWndClassEx.lpszClassName.
  • lpWindowName: سلسلة محرفية ستعرض في شريط العنوان للنافذة (مكافئ Form.caption في ديلفي).
  • dwStyle: مجموعة من الستايلات تميز النافذة وتحدد طريقة رسمها: مثل WS_OVERLAPPEDWINDOWالتي سترسم نافذة تملك شريطا للعنوان, قائمة النظام و أيقونات التكبير والتصغير وحاشية.. كل هذه الستايلات تبتدأ ب WS_.
  • x, y: إحداثيات النافذة عند عرضها على الشاشة, هي ما تكافئ على التوالي Form.left وForm.top في ديلفي.
  • nWidth,nHeight: تمثل أبعاد النافذة, أي عرض و ارتفاع النافذة . ما يكافئ form.height و form.width في ديلفي.
  • hWndParent: تحدد هل هذه النافذه هي النافذة "الأب" فستأخذ قيمة 0 ,أم نافذة "إبن" عندها سنعطيها قيمة الهاندل للنافذة "الأب" التي تحتضنها. بالنسبة لنا سننشأ نافذة واحدة فقط وستكون نافذة "الأب". وسنرجع لاحقا لهذا المبدأ في دروس مقبلة ;) .
  • hMenu: هاندل للقائمة التي ستستعملها في النافذة, سيأخذ قيمة 0 لإذا لم يكن هنالك قائمة أو إذا أردت استعمال القائمة المعرفة بأسمها في كلاس النافذة.
  • hInstance: هاندل التطبيق . قي Windows NT/2000/XP فإن هذه القيمة لا تؤخذ بعين الإعتبار.
  • lpParam:باراميتر يمرر عند رسالة WM_CREATE .

عند نجاح هذه الدالة في إنشاء النافذة فإنها سترجع الهاندل الذي سيميزها إلى غاية تدميرها.

هذه الدالة تنشأ النافذة لكن لا تضهرها على الشاشة, لهذا تحتاج لدالة تظهر النافذة و هي ShowWindows().

..

كما ذكرت في مقدمة هذا الدرس بان التطبيقات في ويندوز هي تطبيقات مسيرة بنظام الأحداث Events, و مهمة قراءة الرسائل الموجهة للنافذة هي من مهام التطبيق وليس ويندوز, فعلى التطبيق دوما استجواب النظام عن الرسائل الموجهة إليه بواسطة الدالة Getmessage(). هذه الدالة تقوم عند استدعائها بتجميد التطبيق وانتظار الحدث, وعند وقوع حدث ما فإنه ستضع الرسالة في المتغير Msg ..

هذه الدالة ترجع قيمة منطقية Boolean. تكون false إذا كان الحدث هو رسالة WM_QUIT التي تدل على أن المستخدم يريد إغلاق التطبيق برمته ( إغلاق النافذة لا تعني إغلاق التطبيق. فالتطبيق قد يملك أكثر من نافذة. عند إغلاق النافذة فالرسالة المستقبلة هي WM_DESTROY ).

كما يمكنك ملاحضته, ان هذه الدالة وضعت في حلقة تكرارية لا منتهية, والشرط الوحيد لأنتهائها هو استقبال رسالة WM_QUIT.عندها فالتطبيق سينتهي ويغلق.

فهذه الحلقة التكراراية هي القلب النابض للتطبيق. فهي حلقة الوصل ما بين التطبيق والمستخدم.

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

بعد هذا الشرح سأعطي نص الكود الكامل (يوجد في الملف المرفق أدناه):

program GuiWinApp1;
{a very basic GUI window creation application }

uses
  Windows,
  Messages;

var
wClassEx: TWndClassEx;
hAppHandle: HWND;
Msg: TMSG;


function WndMessageProc(hWnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
begin
{This is the "Window Proc" used to communicate with the OS, These messages are how the
Operating System tells this program what has happened, look up the 5 WM_
messages in the Win32 API Help
This function must send a Result back to Windows for its "message" back to the OS, which
may change what the OS does for that Msg.
Each of these messages will produce a MessageBox so you can see when the message
gets to this function}
Result := 0;
case Msg of
    WM_CREATE: begin
    {the CreateWindow( ) fuction sends this WM_CREATE to it's Class's lpfnWndProc, after the window is
    created, but Before the CreateWindow function returns}
               if MessageBox(hAppHandle,'A Message for WM_CREATE'#10'Do You want this Program to Open?',
                          'Will OPEN ? ?', MB_YESNO or MB_ICONQUESTION) = IDNO then
                   begin
                   {if the result is -1 then this new window will be Destroyed before it is
                   shown, since this is the MAIN window of this Program a Result of -1 will
                   tell the OS to call DestroyWindow(hAppHandle); and end this Program}
                   Result := $FFFFFFFF;  // equivalante to -1 in hexa
                   Exit;
                   {if you want the Result to be -1 then you MUST Exit here so
                   DefWindowProc( ) will NOT be called and change the Result to a 0}
                   end;
               end;

    WM_DESTROY: begin
    {WM_DESTROY is sent After the window is hidden but before the window is destroyed}
                MessageBox(0,'A Message for WM_DESTROY'#10'the Window has not been Destroyed yet',
                          'Window is Hidden', MB_OK or MB_ICONQUESTION);
                PostQuitMessage(0);
                {IMPORTANT, to end this Program you need to end your GetMessage Loop.
                To do this you will have to send the WM_QUIT message with PostQuitMessage(0)}
                end;

    WM_CLOSE: if MessageBox(hAppHandle,'A Message for WM_CLOSE'#10'Do You want this Program to Close?',
                          'Will Close ? ?', MB_YESNO or MB_ICONQUESTION) = IDNO then
    {the WM_CLOSE message is sent to tell your window to CLOSE
     and since this is the Main window, to Exit this processes}
                begin
                {Result := 0;}
                {unlike WM_CREATE, the Result of the WM_CLOSE message DOES NOT change what the OS does.
                you must Exit in order to keep DefWindowProc( ) from calling DestroyWindow(hAppHandle);}
                Exit;
                end;

    WM_CHAR: MessageBox(hAppHandle, PChar('A Message for WM_CHAR is occured: '
                          +#10'you typed a   '+Chr(wParam)),
                          'Keyboard Char', MB_OK or MB_ICONQUESTION);
    {the WM_CHAR message is sent for keyboard charater input with the
    charater Ord value in the wParam}
    end;
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
{VERY VERY IMPORTANT - to get normal windows default behavior you must call DefWindowProc for that
message, if you DO NOT want normal windows behavior then DO NOT let DefWindowProc be called.
I have put it at the end of this function, so if you don't want DefWindowProc then you just
add and "Exit;" in that message response above}
end;



BEGIN   // then MAIN Program Begin  / / / / / / / / / / / / / / / / /

    // Define the window class for the main window.
wClassEx.hInstance := hInstance;
with wClassEx do
  begin
    {there are more wClass parameters which are not used here to
    keep this simple}
    cbSize:= SizeOf(wClassEx);
    style := 0;
    hIcon := 0;
    lpfnWndProc :=  @WndMessageProc;
    hbrBackground:= COLOR_BTNFACE+1;
    {COLOR_BTNFACE is not a brush, but sets it to a system brush of that Color}
    lpszClassName:= 'First Class';
    {you may use any class name, but you may want to make it descriptive
    if you register more than one class}
    hCursor := 0;
    cbClsExtra := 0;
    cbWndExtra := 0;
    lpszMenuName := '';
  end;

    // Register the window class for the main window.
RegisterClassEx(wClassEx);

{the First Window created in a Program for a Registered Class will be the apps Main Window
or "Form" in Delphi terminology, and will be the Main Form for this App.}
hAppHandle := CreateWindowEx(
    0,
    wClassEx.lpszClassName,	// pointer to registered class name string
    'first Window app',	// pointer to window name (title bar Caption here)
    WS_OVERLAPPEDWINDOW,	// window style
    // WS_OVERLAPPEDWINDOW is the default standard main window with a
    // Title bar and system menu and sizing border
    Integer(CW_USEDEFAULT),	// horizontal position of window
    Integer(CW_USEDEFAULT),	// vertical position of window
    // CW_USEDEFAULT is from earier 16-bit windows programing. I included it
    // here only because most begining programming instuctions use it. But I
    // don't see much use for it, you may as well use 0, 0
    386,	// window width
    250,	// window height
    0,	// handle to parent or owner window
    // this is the MAIN window, so it does not have a parent
    0,	// handle to menu or child-window identifier
    // if you install a main Menu, it's handle goes here
    hInstance,	// handle to application instance
    nil  // pointer to window-creation data
    // window-creation data can be infromation about
    // creation options or data storage
   );

{below is an Alternate main window Creation, which will give the same window
style as the one above, it includes all the style options of WS_OVERLAPPEDWINDOW
as individual paramerers.
use the one above or this one but not both.}
{hAppHandle := CreateWindow( wClass.lpszClassName, 'first Window app',
    WS_CAPTION or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU or WS_THICKFRAME,
  // these window styles will give the same style as WS_OVERLAPPEDWINDOW
  // if you leave out the WS_MINIMIZEBOX or the WS_MAXIMIZEBOX then
  // those caption buttons will be grayed out (not enabled)
  // if you leave out the WS_THICKFRAME then it will NOT be mouse sizable
    200, 100, 386, 250,
    0,	// handle to parent or owner window
    0,	// handle to menu or child-window identifier
    hInstance,	// handle to application instance
    nil  // pointer to window-creation data
   );}

if hAppHandle = 0 then
begin
    {I do not usually include a "if hAppHandle = 0 then"
    I put it here to show how to test for success or failure
    of the CreateWindow}
    UnRegisterClass(wClassEx.lpszClassName, hInstance);
    Exit;
end;


ShowWindow(hAppHandle, SW_SHOWNORMAL);
{the WS_VISIBLE style was NOT set in the Main window creation
so you need to call ShowWindow( ) to make it visible.
This "ShowWindow" with SW_SHOWNORMAL is a Standard way to make your program visible,
if you use this then your progrm can be started by another program as
Maximized or Minimized, otherwize those options will be ignored}

UpdateWindow(hAppHandle);
{the update line above is not needed here because the message loop
has not started yet, but I have added it to show that you need to
update to get changes to a window to be visible after the message loop starts}


while GetMessage(Msg,0,0,0) do
  begin
  {GetMessage will return True until it gets a WM_OUIT message. So this
  Program will keep running untill you Post a Quit Message}
    TranslateMessage(Msg);  {Translate any WM_KEYDOWN keyboard Msg
                             to a WM_CHAR message}
    DispatchMessage(Msg);  {this Sends Msg to the address of the
                            "Window Procedure" set in the Resistered
                            Window's Class for that window}
  end;

END. // The end of the application

:lol: حظا سعيدا في إنشاء هذه النافذة. ستكون تمرينا مفيدا لكل محتهد يريد أن يتعلم البرمجة باستخدام دوال API أن يعيد كتابته دون أن يأخذه منسوخا من المشاركة, ثم يمكنك تعديل الكود كيفما تشاء, بإضافة ستايلات مختلفة عند تعريف كلاس النافدة أو عند أنشاء النافذة. B)

لاحظ كذلك إجرائية الدالة وكيف نظمت باستعمال غربلة للرسائل بواسطة Case of.عند كل حدث ستقوم بعرض رسالة تخبر بطبيعة هذا الحدث (استعملت دالة MessageBox التي عرضنا دورها في الدرس الأول).

GuiWinApp1.rar

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#21

الكبير كبير وهو ده النظام winapi

شكرا يا كبير على مجهودك الله يخليك

(حفظك الله ورعاك واتم عليك الشفاء الدائم ان شاء الله)

فى انتظار المزيد

{ربى زدنى علما}

#22

الكبير كبير!!!

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#23

الله عليك .. يا ikossan API

#24

سيدي :

الله يعطيك الف عافية

:D :D :D :D

فعلا تعقد

:s :s :s :s

20_09_05_04_45_39_1127216739saudi_aC_.gif
#25

مشكورين جميعكم على المشاركة والتفاعل مع هذا الموضوع :D .

قبل الإنتقال لطريقة إنشاء والتحكم بالمكونات الرئيسية أو ما يطلق عليها إسم المتحكمات Controls مثل الأزرار و علب التحرير و غيرها... يجب أن نضبط جيدا مبدا التعامل مع الأحداث وكيفية الإستفادة من كل حدث حسب حاجيات التطبيق, للتفاعل مع المستخدم.

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

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

هذا مثال جديد أدرجت فيه بعض الدوال, سنلقي نظرة خاطفة على بعضها فقط على أن نترك الباقي للوقت المناسب لها في دروس قادمة إن شاء الله:

  • دالة AnimateWindow: تقوم هذه الدالة بعرض النافذة, لها نفس الوضيفة التي تقوم بها ShowWindow مع إضافة لبعض المؤثرات المرئية لمدة زمنية تحسب بجزء من الألف من الثانية miliSeconds.
    باراميتراتها ثلاثة: الأولى هو الهاندل للنافذة التي نريد عرضها, ثم الباراميتر الثاني هو عدد أجزاء من الألف للثانية وهي المدة الزمنية للثاثير المرئي. ثم الأخير هو نوع التأثير المرئي وهي :

*AW_SLIDE: Uses slide animation. By default, roll animation is used. This flag is ignored when used with AW_CENTER.

*AW_ACTIVATE: Activates the window. Do not use this value with AW_HIDE. 

*AW_BLEND: Uses a fade effect. This flag can be used only if hwnd is a top-level window. 

*AW_HIDE: Hides the window. By default, the window is shown. 

*AW_CENTER: Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. The various direction flags have no effect. 

*AW_HOR_POSITIVE: Animates the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

*AW_HOR_NEGATIVE:Animates the window from right to left. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

*AW_VER_POSITIVE: Animates the window from top to bottom. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND. 

*AW_VER_NEGATIVE: Animates the window from bottom to top. This flag can be used with roll or slide animation. It is ignored when used with AW_CENTER or AW_BLEND.

  • الدالة PlaySound التي تقوم بعرض ملف صوتي قياسي من أصوات التي تعتمدها ويندوز سواءا كان ملفا أو مؤشر لصوت في النظام لويندوز. أول باراميتر هو إسم الملف الصوتي, الثاني هو هل هذا الملف يوجد أم لا بموارد التطبيق, ثم مجموعة من الخصائص التي تحدد طريقة عرض الصوت.
  • دالة GetTimeFormat هي دالة لتحرير الوقت وفرمطته وفق سلسلة محرفية للفرمطة, ودالة GetDateFormat تماثلها لكن لعرض التاريخ.
    استعملتها لعرض الوقت والتاريخ في canvas لل فورم, عفوا فهذه مصطلحات لديلفي :lol: . استعملتها لعرض الوقت والتاريخ في مساحة ClientArea للنافذة.
  • العرض للوقت والتاريخ أقوم به باستعمال دالة TextOut.
  • دالة لعمل مؤقت يعمل تماما كالذي في ديلفي. نقوم بإنشائه بواسطة SetTimer, ولقد ظبطت وقته على ثانية واحدة أي 1000ميلي.
    عند كل ثانية سيستقبل التطبيق رسالة من المؤقت WM_Timer. عند إنتهاء التطبيق نوقف المؤقت ب KillTimer.

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

في إجرائية النافذة قمت بالتعامل مع مجموعة من الرسائل ووظفت بعض هذه الدوال فيها.

استعملت وحدة winSysUtils عوضا عن SysUtils فقط للتقليل من حجم التطبيق النهائي, هذه الوحدة بها دالتين هما IntToStr و StrLen.

winapi2.rar

تم تعديل هذه المشاركة بواسطة ikossan في 2 مايو 2005 في 15:18

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

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

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