prof_1982

أدخل الي عالم البرمجة الحقيقية .

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

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

* رسائل ،،، ماهي الرسائل و من أين تأتي ؟يقوم ويندوز بتعريف المئات بل الآلآف من الرسائل المتنوعه وغالبية هذه الرسائل تبدأ بالأحرف _WM وهي إختصار Window Message وأهم شي يجب أن

تعرفه هي الدور الفعال التي تلعبه هذه الرسائل ... إذاً الرسائل معرفة مسبقاً من قبل نظام التشغيل ، نعم هي عبارة عن ثوابت تأخذ قيم يعرفها النظام وعلي

أساسها يعمل .

تعرف الرسالة بالشكل التالي :

Private Const WM_PAINT = &HF

أنظر الي تلك الرسائل :

WM_CREATE وهي رسالة لخلق أو إنشاء نافذة .

WM_PAINT وهي رسالة ترسلة للنافذة لرسمها من جديد وهي ما نعرفه بـRefresh وترسل هذه الرسالة الي النافذة من نظام التشغيل في حال تم تغطية

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

WM_SIZE وهي لتغيير أبعاد النافذة أي يأمر نظام التشغيل النافذة بتغيير حجمها .

WM_QUIT وترسل هذه الرسالة للتطبيق لانهاء عمله .......

. الخ الخ ،، ويوجد المئات من الرسائل لا أستطيع سردها كلها الأن ولكن سوف أقوم بسرها وشرحها بنوع من التفصيل فيما بعد إن شاء الله .

*كيف نستهدف نافذه معينه ؟

اولا/ لكل نافذة يوجد لها مقبض (Handle Window)وهو عبارة عن رقم (كود) لا يمكن ان يتكرر ،، هذا الرقم عبارة عن مقبض للنافذة يتم من خلاله تمرير الرسائل الي النافذة المحددة . وايضا رقم النافذة يتغير في كل مرة يتم إستدعاء النافذة .

*كيف يتعامل نظام التشغيل مع الادوات مثل (الزر ، صندوق النص ، اداة الصورة ، الخ)؟

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

أداة تعامل خاص بيها .

*كيف تظهر لنا النوافذ علي اشكال مختلفة مثل الازرار وصناديق النصوص وادوات الصور الخ الخ مع ان النوافذ لها شكلها الخاص؟

لقد اعتمدت مايكروسوفت علي مجموعة (صفوف Classes) جاهزة وهي محدودة طبعا وكل صف من هذه الصفوف تحمل بعض الخصائص القياسية التي تضاف

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

علي شكل الزر الذي نعرفة ولكن دون اي خاصية اضافية مثل خاصية العنوان للزر(Caption) و خاصية لون الخلفية (BackColor) ، (فقط شكل الزر) وبعد ذلك

عليك انت ان تضيف ما تريد من خصائص تريدها علي اداتك الجديدة ، (ولو فكرت قليلا لوجدت اننا طبقنا مبدأ الوراثة البرمجية ) نعم لقد ورثنا خصائص الزر

القياسية من نظام التشغيل ويمكننا اضافة ما نريد من خصائص ليقوم بالعمل المنشود .

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

العمل ، فنظام التشغيل يمتلك مكتبات كثيرة جدا تخدم جميع المجالات تقريبا ، فلغة الفيجوال بيسك ما هي الا أداة للوصول الي إمكانيات نظام التشغيل الهائلة عن طريق دوال API .

*من أين نحصل علي دوال الـ API ?يأتي مع حزمة الفيجوال ستوديو 6 ،، فبعد تنزيل فيجوال بيسك الاصدار السادس يمكنك إستدعاء برنامج (عارض دوال API) من قائمة Add-ins أختر Add-Ins Manager ثم قم بالنقر المزدزج علي VB 6 API Viewer ثم أضغط موافق . ثم بعد ذلك سيتم إدراجه في نفس القائمة Add-ins جرب ولاحظ بنفسك .

ولتحميل دوال API من قائمة ملف ثم Load Text File .. ثم اختر الملف WIN32API.TXT وسيقوم البرنامج بسرد مئات الدوال المختلفة التي توصلك الي بحار نظام التشغيل أسراره و إمكانياته العجيبة .

*مافائدة إستخدام الـAPI مع ان كل شيئ تقريبا متاح وجاهز ؟جرب وضع أكثر من 255 أداة علي الفورم الواحد ،، بالتأكيد لن تستطيع لان فيجوال بيسك لا يستطيع التعامل مع أكثر من 255 ، لانه محدود الإمكانيات .

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

-- ولكن عن طريق إاستخدام دوال API يمكن انشاء 32767 نافذة في نظام التشغيل 98 والاقدم منه وكما قلنا يمكن تخصيص بعض النوافذ لصناعة أدوات

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

فمثلا أنا الان أقوم بعمل برنامج لانشاء أفلام الرسوم المتحركة ،، تصور عدد الكادرات الموجوده فيه أثناء التشغيل ،، فلا بأس الان بعد إستخدام API فلم أجد اي مشاكل تذكر حتي الان في عدد انشاء الكادرات .

انتظروني في اليوم القادم ،، سوف أقوم ببناء نافذة Form بواسطه دوال API . ومن ثم انشاء أدوات عليها.

تحياتي لكم

[email protected]

تم تعديل بواسطه prof_1982
2

شارك هذا الرد


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

شكرا لك كثيرا على هذا الموضوع وسنقوم بتثبيت موضوعك ونتمنى أن تقوم بشرح كامل لهذه الأمور

شكرا لك

0

شارك هذا الرد


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

الف شكر لك اخي Prof_1982

بصراحه....

دايما بالمقدمه

اعانك الله على هذا المجهود

0

شارك هذا الرد


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

والله أنك ممتاز

و في الأنتظار أخي العزيز

0

شارك هذا الرد


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

بداية قوية جداً أخي Prof

أتمنى الاستمرار على نفس الوتيرة

0

شارك هذا الرد


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

السلام عليكم

شكرا لكم اخواني علي هذه الردود الجميلة ،، فأنا الان أقوم بكتابة أمثلة لما ورد ذكره سابقا وكيفية إستخدام بعض الدوال المهمة ... انتظروني

شكرا لكم

0

شارك هذا الرد


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

السلام عليكم

اليوم سوف أكمل ما تم طرحه من مواضيع .. سم بالله

الدوال التي سوف نقوم بإستخدامها في هذه الجلسة والجلسات القادمة إن شاء الله ، وهي كالأتي :

CreateWindowEx

PostMessage

SendMessage

PostMessage

GetMessage

DestroyWindow

TranslateMessage

DispatchMessage

DefWindowProc

ShowWindow

UpdateWindow

SetFocus

أولا / الدلة CreateWindowEx وهي دالة تختص بإنشاء النوافذ ، فمن خلالها يمكننا أنشاء نافذة ،، او زر أو صندوق نص أو أداة صورة .. الخ وكما قلنا سابقا فإن نظام التشغيل يعتبرها نوافذ أيضا .

الدلة PostMessage و الدالة SendMessage هما دالتين بنفس الوظيفة وهيما خاصتين بإرسال رسالة الي النافذة ،، ولكن الفرق الوحيد بينهما بأن دالة SendMessage ترسل الرسالة الي النافذة مباشرة ولكن الدالة PostMessage ترسل الرسالة الي رتل الرسائل في النظام ثم يقوم بأرسالها النظام (اي نظام التشغيل) الي النافذة .

ربما تقول ما الفائدة من ذلك ؟

أنا أقول لك ،، لو أحتجت تغيير لون الخلفية لكافة النوافذ لديك في التطبيق ،، (أضن أنك فهمت الان) عندما نقوم بأستهداف نافذة معينة لا يمكن أن نستهدف أخري إلا بتنفيذ الدالة مرة أخري عن طريق الدالة SendMessage أما PostMessage سيقوم نظام التشغيل بأرسال الرسالة الي التطبيق (اي ستصل الي جميع النوافذ) والنافذة المستهدفة هي التي تتفاعل , ولكن في هذه الحالة يمكننا أن نجعل كافة النوافذ تستجيب للرسالة المرسلة في أن واحد .

الدالة GetMessage وهي لاستقبال الرسائل المرسلة من نظام التشغيل .

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

وعندما نحتاج للدوال الاخري سوف أقوم بشرحها .

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

اولا، سوف نقوم بإدراج كافة الدول الي التطبيق ،، والرسائل التي سوف نستخدمها .

في الموديول ضع الدوال والرسائل التالية :

'الدوال التي سوف نستخدمها

Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, _
                                                   ByVal lpClassName As String, _
                                                   ByVal lpWindowName As String, _
                                                   ByVal dwStyle As Long, _
                                                   ByVal x As Long, _
                                                   ByVal y As Long, _
                                                   ByVal nWidth As Long, _
                                                   ByVal nHeight As Long, _
                                                   ByVal hWndParent As Long, _
                                                   ByVal hMenu As Long, _
                                                   ByVal hInstance As Long, _
                                                   lpParam As Any) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Public Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)


'تحمل قيم مؤشر الفأرة
Public Type POINTAPI
       x As Long
       y As Long
End Type

'كل ما يتعلق ببيانات الرسالة الواردة من النظام
Public Type MSG
   hwnd As Long
   Message As Long
   wParam As Long
   lParam As Long
   time As Long
   pt As POINTAPI
End Type



'هذه هي الرسائل المعرفة في نظام التشغيل نقوم بإدراجها حسب الحاجة ،، طبعا يوجد الالاف منها
Public Const WS_VISIBLE As Long = &H10000000
Public Const WS_VSCROLL As Long = &H200000
Public Const WS_TABSTOP As Long = &H10000
Public Const WS_THICKFRAME As Long = &H40000
Public Const WS_MAXIMIZE As Long = &H1000000
Public Const WS_MAXIMIZEBOX As Long = &H10000
Public Const WS_MINIMIZE As Long = &H20000000
Public Const WS_MINIMIZEBOX As Long = &H20000
Public Const WS_SYSMENU As Long = &H80000
Public Const WS_BORDER As Long = &H800000
Public Const WS_CAPTION As Long = &HC00000                   '  WS_BORDER Or WS_DLGFRAME äÝÓ ÇáÔí
Public Const WS_CHILD As Long = &H40000000
Public Const WS_CHILDWINDOW As Long = (WS_CHILD)
Public Const WS_CLIPCHILDREN As Long = &H2000000
Public Const WS_CLIPSIBLINGS As Long = &H4000000
Public Const WS_DISABLED As Long = &H8000000
Public Const WS_DLGFRAME As Long = &H400000
Public Const WS_EX_ACCEPTFILES As Long = &H10&
Public Const WS_EX_DLGMODALFRAME As Long = &H1&
Public Const WS_EX_NOPARENTNOTIFY As Long = &H4&
Public Const WS_EX_TOPMOST As Long = &H8&
Public Const WS_EX_TRANSPARENT As Long = &H20&
Public Const WS_GROUP As Long = &H20000
Public Const WS_HSCROLL As Long = &H100000
Public Const WS_ICONIC As Long = WS_MINIMIZE
Public Const WS_OVERLAPPED As Long = &H0&
Public Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Public Const WS_POPUP As Long = &H80000000
Public Const WS_POPUPWINDOW As Long = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
Public Const WS_SIZEBOX As Long = WS_THICKFRAME
Public Const WS_TILED As Long = WS_OVERLAPPED
Public Const WS_TILEDWINDOW As Long = WS_OVERLAPPEDWINDOW
Public Const CW_USEDEFAULT As Long = &H80000000
Public Const CS_HREDRAW As Long = &H2
Public Const CS_VREDRAW As Long = &H1
Public Const IDI_APPLICATION As Long = 32512&
Public Const IDC_ARROW As Long = 32512&
Public Const WHITE_BRUSH As Integer = 0
Public Const BLACK_BRUSH As Integer = 4

Public Const WM_KEYDOWN As Long = &H100
Public Const WM_CLOSE As Long = &H10
Public Const WM_DESTROY As Long = &H2
Public Const WM_PAINT As Long = &HF

Public Const SW_SHOWNORMAL As Long = 1
Public Const DT_CENTER As Long = &H1
Public Const DT_SINGLELINE As Long = &H20
Public Const DT_VCENTER As Long = &H4
Public Const WS_EX_STATICEDGE As Long = &H20000
Public Const BS_AUTORADIOBUTTON = &H9&
Public Const WM_SETTEXT = &HC
Public Const WM_QUIT = &H12

وهذا الكود البسيط ضعه في النافذة ولاحظ

ضع زر علي النافذة وسمه Cmd_CreateW

وضع الدالة هذه داخله

    WinHwnd = CreateWindowEx(WS_EX_STATICEDGE, "#32770", 0&, WS_SYSMENU Or WS_SIZEBOX Or WS_VISIBLE, 10, 0, 300, 300, Me.hwnd, 0&, App.hInstance, 0&)

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

0

شارك هذا الرد


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

الف شكر شرحك ممتاز ولكن هناك شىء مهم:

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

وشكرا

0

شارك هذا الرد


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

الف شكر شرحك ممتاز ولكن هناك شىء مهم:

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

وشكرا

0

شارك هذا الرد


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

السلام عليكم

شكرا لك اخي (The Solution Developer) علي الرد ،، فكرة ممتازة

نعم سوف أقوم بطرح برنامج لنقوم بعمله بشكل جماعي يحتاج الي معظم هذه الدوال ،، في الواقع سيكون برنامج لتصميم أفلام الصور المتحركة ،، فهو برنامج في الاساس رسومي ثم يضاف اليه قسم التحريك ،، سيعتمد في الاساس علي Layers مثل الفوتو شوب ،، قريبا

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

شكرا لكم ،،

تم تعديل بواسطه prof_1982
0

شارك هذا الرد


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

السلام عليكم ..

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

في الحقيقة لدي افكار كثيرة حيث ان دوال الــ API تفتح امامك عالم البرمجة الحقيقية كما قلت و ارجوا ان لا يتوقف الموضوع بل ان يستمر دائماً حتى يستفاد منه كمرجع هام في المنتدى ... :)

و ارجوا لك كل التوفيق ...

بنت اليمن ،،،

0

شارك هذا الرد


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

السلام عليكم ..

في الحقيقة الموضوع جداً رائع .. و اريد له ان يستمر ... الى كل الذين يريدون الدخول الي عالم البرمجة الحقيقية .. ارفق لكم هذا الكتاب البسيط عن الـ API ..

بنت اليمن ،،،

0

شارك هذا الرد


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

شكرا لكي اختي العزيزة (بنت اليمن)

ولكن الملف المرفق معطوب no.gif يرجي رفع مرة تانية مع ضغطه قبل الرفع .

شكرا لكي ،،

0

شارك هذا الرد


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

السلام عليكم ...

تأمر امر اخي prof_1982 و سلامة رأسك من الخبط :)

بنت اليمن ،،

0

شارك هذا الرد


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

تسلمي اختي بنت اليمن ،، والله ماقصرتي

بارك الله فيكي

0

شارك هذا الرد


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

if u dont mind plz attach ur example by file

not important if this file is word or pdf

plz my keyboard not supported

0

شارك هذا الرد


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

صدقوني انا نسيت هذا الموضوع ،، ساعود واكمله ان شاء الله قريباااااااااااااا :)

0

شارك هذا الرد


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

شرح ممتاز

و أرجو ان تطرح برنامج الرسوم المتحركة الذى لمحت له ... على الأقل أدرج البرنامج من غير كود :)

0

شارك هذا الرد


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

السلام عليكم

مش عارف اقولك ايه اخى prof_1982 على الموضوع الرائع ده بجد موضوع مهم جدا وجديد ارجو الاستمرار بنفس المستوى

البسيط المميز فى الشرح و هذا ليس بجديد عليك فانت متميز دائما.

0

شارك هذا الرد


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

شكرا علي هذا الموضوع الجميل

0

شارك هذا الرد


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

مشكور أخوي

بارك الله فيك

تحياتي

0

شارك هذا الرد


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

شكرااااااا

جزيلا على هذا المجهود

0

شارك هذا الرد


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

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

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