المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الصور والرسوم في نظام Windows



PaPEr Cut
21-07-2002, 02:12 PM
من المفيد ان اذكر انها، ان عملية ارسال الرسائل الى النوافذ تتم بشكل منظم في طابور يعرف باسم طابور الرسائل Message Queue. طريقة التعامل مع هذا الطابور تتبع اسلوب FCFS اقصد ان الاول يخدم الاول First Come First Served. مذا يعني هذا الكلام؟ قد يفهم مغزاه بتوضيح مثال. فاحيانا في حالة كون نظام التشغيل مشغول جدا تقوم باجراء عدة عمليات بالفأرة كنقرات او سحب الخ.. يقوم نظام التشغيل بوضع جميع هذه العمليات في طابور الرسائل، وعندما ينتهي نظام التشغيل من المهمة التي اشغلته، تلاحظ عمليات استجابة الرسائل حدثت بشكل مرتب. من او رسالة الى اخر رسالة. جرب مثلا القيام بعملية تشغيل برنامج ثقيل -حتى تجعل النظام مشغول في تحميله- في هذه الاثناء قم بعمل قد ما تستطيع من احداث بالفأرة، ستلاحظ بعد انتهاء عملية تحميل البرنامج الثقيل، ان جميع الاحداث التي سببتها الفأرة قد تم تنفيذها. وهذا الذي لابد من وضعه في الذهن دائما خاصة اذا كانت برنامج يتأثر باحداث الفأرة بشكل ملحوظ او حتى غيرها من احداث.


اختم موضوع الرسائل بالتوضيح البرمجي لسبب عدم استجابة الاحداث. في احيان قليلة جدا تلاحظ انك عندما تقوم بالنقر على النافذة او اي زر لا يتم اي شئ! ولكن سرعان ما تعيد عملية النقر لتتم الامور بشكلها الطبيعي. السبب في الحقيقة ليس فيزيائي في معمارية او تركيبة جهاز او آلة الفأرة -لانها قد ارسلت الرسالة، لكن السبب هو برمجي. وواقعيا، نسبة حدوث هذا الامر ضئيلة جدا قد تكون مقاربة لل، 001. % لكني احببت توضيح السبب، فلا تنسى انت مبرمج ولست مستخدم!

اذا رجعت

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

بما ان الكود موجود في حلقة تكرارية فان عملية تنفيذ الاوامر الموجودة في الحلقة التكرارية ستكون لا نهائية، حسنا افترض ان عملية التنفيذ قد وصلت الى الشرط case WM_MOUSEMOVE وهي اللحظة التي قمت فيها بالنقر على النافذة -اي ارسال الرسالة WM_CLICK- فان المتغير lMsg لا يحتوي على قيمة تمثل الرسالة WM_CLICK وستستمر عملية تنفيذ الحلقة التكرارية بشكل طبيعي دون التأثر بالرسالة التي قد ارسلها نظام التشغيل لكن برنامجك لم يتمكن من قنصها.


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






حان الوقت الان للتحدث عن كيفية تعامل نظام التشغيل Windows مع الصور والرسوم:


بيئة Windows هي بيئة من النوع واجهة المستخدم الرسومية GUI فالنقطة Pixel تمثل حجر الاساس لكل شئ يعرضه لك نظام التشغيل، مما يستلزم تنظيم عمليات عرض الصور والرسوم. التحدث عن طرق ادارة الصور والرسوم موضوع يحتاج -دون مبالغة- كتاب كامل! لكن ساحاول بقدر المستطاع توضيح النقاط الاساسية بشكل مختصر هنا. وسأتحدث عن مبدأ اعادة الرسم وسياقات الاجهزة.



* مبدأ اعادة الرسم Re-Draw


المظاهر خداعة، والذي يدعي ان انه لا يغتر بالمظاهر فهو في الحقيقة اكثر انسان تخدعه المظاهر! ولعل اكثر شئ قد خدعنا نظام التشغيل Windows هو في تكوين او فلسفة الطبقات المتعددة للشاشة. فلو تضع نافذة س فوق النافذة ص ستكون النافذة س هي الظاهرة امامك والنافذة ص خلف النافذة س مما يوحى لنا وجود اكثر من طبقة Layer للشاشة. وبما اننا مبرمجين فلابد ان نكون متيقنين دائما ان الشاشة لا توجد فيها الا طبقة واحدة! بغض النظر عن الايحاء الذي يوهمنا به نظام التشغيل.

فالسر وراء عملية الايحاء هي عملية تعرف في عالم البرمجة المرئية باعادة الرسم ReDraw. فاذا قمت بالضغط على النافذة ص -الموجودة خلف النافذة س- فكل ما سيحدث هي عملية اعادة رسم محتويات النافذة ص مما يؤدي الى عملية الايحاء -التي ركزت عليها- ويبدو لنا ان النافذة ص قد انتقلت الى الطبقة العليا او القريبة من عين المستخدم على الشاشة. الزبدة يا اخوان هي ان كل ما تراه اما عينك عبارة عن طبقة واحدة وليست مجموعة طبقات، والسر وراء هذه الطبخة هي عملية اعادة الرسم. فلو كنت من مبرمجي C فستعلم ان الرسالة WM_PAINT تصل الى النافذة في كل مرة تحتاج الى عملية اعادة رسمها وتكتب الكود اللازم، تماما مثل الحدث Form_Paint الموجود في نافذة النموذج لمبرمجي Visual Basic.



* سياقات الاجهزة Device Context


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

والسؤال الذكي يكون كيف يستطيع نظام التشغيل التمييز بين عشرات السياقات الموجودة؟ والجواب الاذكى هو عن طريق رقم او مقبض السياق hDC ففي كل مرة تقوم بعملية انشاء سياق رسم جديد -باستخدام CreatDC مثلا- يقوم نظام التشغيل باعطاء رقم لهذا السياق او مقبض handle لهذا السياق وهي نفس فكرة مقابض النوافذ hWnd.

اذا فمقبض النافذة hWnd خاص لتمييز النوافذ، اما مقبض سياق الجهاز hDC خاص لتمييز الصور الموجودة. تذكر ان كل صورة -حتى لو كان حجمها نقطة واحدة!- لها مقبض سياق والذي يمثل بياناتها. فلو تقم الان بقطع عملية قراءة هذه المقالة للحظات وتصغير النافذة والقاء نظرة الى الايقونات الموجودة في سطح المكتب، ستعرف كم مقبض سياق موجود الان، كذلك الحال مع شعار Windows الموجود في زر ابدأ Start فهو يحتوي على سياق، ايضا الايقونات الموجودة في صينية النظام Sys Tray فكل رمز منها يحتوي على سياق، وحتى الرموز الموجودة في اعلى المتصفح (شريط الادوات) فكل صورة او رمز له سياق . المزيد ايضا، حتى الاماكن الخاصة لعرض حروف النصوص Text لها سياق! ما اقول الا: الله يكون في عون الذاكرة!!


اعيد توضيح فكرة مقبض السياق من جديد، تذكر ان مقبض السياق عبارة عن رقم يمثل سياق، والسياق يحتوي على جميع المعلومات الخاصة لعرض الصورة، الرسمة او النص. اذن، في حالة تعاملك مع اجراءات API والخاصة بالرسم، ستطلب منك رقم يمثل مقبض السياق، فلا تحاول ان ترسل لها مقبض النافذة hWND وانما مقبض سياق الجهاز hDC. احب ان انوه هنا لمبرمجي Visual Basic انه بامكانهم الحصول على مقبض سياق الجهاز والخاص بمنطقة الرسم الموجودة على النافذة عن طريق الخاصية hDC التابعة لنافذة النموذج Form Window او خانة النص PictureBox فتستطيعون كتابة شيئا مثل:

Print Form1.hDC

Print Picture1.hDC



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


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

REACH
19-08-2002, 10:21 PM
شكرا على المعلوووووووووووووومات

وماقصرت

REACH
19-08-2002, 10:37 PM
اقوووووول يااخ جاسوس انا ابيك تشترك معانا بمشروع MHQ

علشان نتفاهم ظيفني على الماسنجر

MHQ777@HOTMAIL.COM

النجوم السوداء
25-08-2002, 01:06 PM
الله يجزاك الف خير على ها المعلومات المهمة جدا