لمحة عن الوصول إلى الموارد Resources في السي والسي بلس بلس

This article is available in English too, check it out here.

المحتويات

محتويات هذا الموضوع:

  • المحتويات
  • نظرة خاطفة
  • مقدمة
  • أكواد التعريف
  • أسماء الموارد
  • التطبيق
    • استخدام الكود التعريفي
    • استخدام أسماء الموارد
  • خاتمة

نظرة خاطفة

اليوم نأخذ لمحة عن كيفية الوصول إلى الموارد Resources مثل الصور والأيكونات والنصوص Strings والقوائم Menus ونحوها في الفيجوال ستوديو باستخدام لغتي الـ C والـ C++.

هذا الدرس يمثل واحدة من مبادئ مبادئ استخدام الموارد Resources في برنامجك.

مقدمة

يمكنك الإشارة إلى مورد معين باستخدام إحدى طريقتين:

  • المعرِّف ID (أو ResID)
  • اسم المورد

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

أكواد التعريف

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

فمثلا، عند إضافتك لصورة Bitmap إلى مشروعك ولنفترض أن اسم هذه الصورة هو background.bmp نجد أن الفيجوال ستوديو يقوم بإضافة رقم معرف إلى هذه الصورة ويسجل هذا المعرف كثابت يسمى (بناءا على اسم ونوع المورد) على الأغلب IDB_BACKGROUND. بعد ذلك يمكنك استخدام هذا الثابت في الوصول إلى الصورة من خلال الكود.

لاحظ أنه عند قيامك بتحديد مورد في الفيجوال ستوديو وفتح خصائصه فإنك يمكنك مشاهدة بل وتعديل اسم الثابت الخاص بهذا المورد. شكل 1 يوضح شاشة الخصائص في Microsoft Visual C++ والشكل الثاني يوضح نفس الشاشة لكن في Microsoft Visual Studio (لاحظ أن وضع الألوان هو High-Contrast نعتذر عن ذلك.)

شكل 1 - خصائص المورد في Microsoft Visual C++
شكل 2 - خصائص المورد في Microsoft Visual Studio

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

أسماء الموارد

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

التطبيق

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

استخدام الكود التعريفي

لنفترض أن الصورة خاصتنا لها الثابت IDB_BACKGROUND وهذا الثابت يحوي رقم التعريف وهو مثلا 101. بعد حصولنا على هذه المعلومات يمكننا الإشارة إلى هذا المورد باستخدام ربما الثابت:

	// DO NOT FORGET to include "resource.h"
	LoadBitmap ( hInstance , MAKEINTRESOURCE ( IDB_BACKGROUND ) );

أو يمكننا كتابة الرقم التعريفي مباشرة (لا نفضل هذا إطلاقا) والذي تحصل عليه بالنظر في ملف resource.h:

	// No need to include "resource.h"
	LoadBitmap ( hInstance , MAKEINTRESOURCE ( 101 ) );

أو ربما لا تريد استخدام الكود التالي بدلا من استخدام أي ماكرو Macro (نقصد MAKEINTRESOURCE):

	// No need to include "resource.h"
	LoadBitmap ( hInstance , "#101" );

لاحظ أن الماكرو MAKEINTRESOURCE يقوم فقط بتحويل الرقم إلى نص لذلك أمكننا استخدام آخر كود بدلا من سابقه. وهذا هو سطر تعريف هذا الماكرو MAKEINTRESOURCE:

	#define MAKEINTRESOURCE(i) ((LPTSTR)((ULONG_PTR)((WORD)(i))))

أخيرا، يمكنك وضع الثابت بدلا من الرقم الأصلي:

	LoadBitmap ( hInstance , (LPTSTR) IDB_BACKGROUND );

بالتأكيد أنت تعرف أنه لا يوجد فرق بين الثابت والرقم الذي يحويه. نحن لا نقصد الإهانة أبدا بعرض كل هذه الطرق ولكن هذه فقط “حركات” نقوم بها في الكود :).

استخدام أسماء الموارد

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

في حالة قيامنا بإدخال الاسم “MyBackground” في خانة ID لمورد الصورة خاصتنا، فيمكننا استخدام الكود التالي للإشارة إليه:

	LoadBitmap ( hInstance , "MyBackground" );

لاحظ أنه يجب عليك استخدام إما الكود التعريفي أو اسم المورد وليس الإثنان.

خاتمة

أخيرا كانت هذه فقط أحد مبادئ مبادئ الموارد في C/C++. قمنا باستعراض بعض الأكواد البسيطة وبعض الأفكار. وفي دروس أخرى بإذن الله تعالى نستعرض تفصيليا كيفية التعامل مع الموارد.

اترك تعليقا