:: منتدى شبابنا ::

أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 613623
عزيزي الزائر / عزيزتي الزائرة يرجي التكرم بتسجبل الدخول اذا كنت عضو معنا
او التسجيل ان لم تكن عضو وترغب في الانضمام الي اسرة المنتدي
سنتشرف بتسجيلك
شكرا أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 829894
ادارة المنتدي أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 103798


انضم إلى المنتدى ، فالأمر سريع وسهل

:: منتدى شبابنا ::

أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 613623
عزيزي الزائر / عزيزتي الزائرة يرجي التكرم بتسجبل الدخول اذا كنت عضو معنا
او التسجيل ان لم تكن عضو وترغب في الانضمام الي اسرة المنتدي
سنتشرف بتسجيلك
شكرا أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 829894
ادارة المنتدي أدخل الي عالم البرمجة الحقيقية ., للمحترفين و ذوي الانفاس الطويلة 103798

:: منتدى شبابنا ::

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

منتدى الشباب منتدى متكامل به كل ماتتمناه به اقسام للكمبيوتر اقسام للترفيه المرئيات قسم للخريجين الطلبة المنتدى الاسلامى قسم الديكور والكثير الكثير


2 مشترك

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

    eed
    eed
    مشرف برتبة ( وزير )
    مشرف برتبة  ( وزير )


    ذكر
    عدد الرسائل : 2070
    العمر : 52
    الموقع : القليوبية
    العمل/الترفيه : فنى
    السٌّمعَة : 8
    نقاط : 655
    تاريخ التسجيل : 10/05/2008

    بطاقة الشخصية
    الاسم ثلاثى: النشاط
    العمر :

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

    مُساهمة من طرف eed السبت مايو 10, 2008 9:19 pm

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

    * رسائل ،،، ماهي الرسائل و من أين تأتي ؟يقوم ويندوز بتعريف المئات بل الآلآف من الرسائل المتنوعه وغالبية هذه الرسائل تبدأ بالأحرف _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 فلم أجد اي مشاكل تذكر حتي الان في عدد انشاء الكادرات
    eed
    eed
    مشرف برتبة ( وزير )
    مشرف برتبة  ( وزير )


    ذكر
    عدد الرسائل : 2070
    العمر : 52
    الموقع : القليوبية
    العمل/الترفيه : فنى
    السٌّمعَة : 8
    نقاط : 655
    تاريخ التسجيل : 10/05/2008

    بطاقة الشخصية
    الاسم ثلاثى: النشاط
    العمر :

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

    مُساهمة من طرف eed السبت مايو 10, 2008 9:19 pm

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

    الدوال التي سوف نقوم بإستخدامها في هذه الجلسة والجلسات القادمة إن شاء الله ، وهي كالأتي :
    CreateWindowEx
    PostMessage
    SendMessage
    PostMessage
    GetMessage
    DestroyWindow
    TranslateMessage
    DispatchMessage
    DefWindowProc
    ShowWindow
    UpdateWindow
    SetFocus

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

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

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

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

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

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


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

    اولا، سوف نقوم بإدراج كافة الدول الي التطبيق ،، والرسائل التي سوف نستخدمها .
    في الموديول ضع الدوال والرسائل التالية :
    'الدوال التي سوف نستخدمها
    eed
    eed
    مشرف برتبة ( وزير )
    مشرف برتبة  ( وزير )


    ذكر
    عدد الرسائل : 2070
    العمر : 52
    الموقع : القليوبية
    العمل/الترفيه : فنى
    السٌّمعَة : 8
    نقاط : 655
    تاريخ التسجيل : 10/05/2008

    بطاقة الشخصية
    الاسم ثلاثى: النشاط
    العمر :

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

    مُساهمة من طرف eed السبت مايو 10, 2008 9:19 pm

    كود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&)
    Anas
    Anas
    عسكرى
    عسكرى


    ذكر
    عدد الرسائل : 7
    السٌّمعَة : 0
    نقاط : 15
    تاريخ التسجيل : 14/05/2010

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

    مُساهمة من طرف Anas الجمعة مايو 14, 2010 5:49 pm

    thank you

      الوقت/التاريخ الآن هو الأحد مايو 12, 2024 10:41 pm