تغيير إعدادات الشاشة برمجيا باستخدام DirectX

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

المحتويات

  • المحتويات
  • نظرة خاطفة
  • مقدمة
  • الخلفية
  • استخدام DirectX لتغيير إعدادات الشاشة برمجيا
  • الحصول على الإعدادات الحالية للشاشة
  • معرفة الأوضاع المتاحة للشاشة
  • تغيير الإعدادات الحالية للشاشة
  • خاتمة

نظرة خاطفة

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

بجانب هذا سنتعلم المزيد داخل الشرح مثل كيفية التعامل مع مكتبات COM وكيفية تطبيق الـ Callbacks.

مقدمة

تحتاج كثيرا إلى تغيير إعدادات الشاشة ربما عند استخدام برنامج معين وربما بل وفي الأغلب عند التعامل مع الألعاب فالألعاب دائما تقوم بتغيير إعدادات الشاشة تلقائيا.

إذا فماذا المقصود بإعدادات الشاشة؟

إعدادات الشاشة أو Display Settings وربما نسميها وضعأو 1280 × 720 في الشاشة العريضة Wide Screen مثل شاشات الأجهزة المحمولة. لاحظ أن الألعاب تقوم بتغيير الشاشة ربما إلى 640 × 480 وهذا لجعل أداء اللعبة أفضل وأسرع.

  • نظام الألوان Color System أو كما يسمى Bit Count
    وهو نظام الألوان في الشاشة أي عدد أو كمية الألوان التي يمكن للشاشة التعامل معها.وهي على الأفضل 32-bit أو 16-bit. وهكذا كلما تزيد عدد البتات Bits تصبح الألوان أفضل ولكن تطلب الشاشة ذاكرة أكبر وبالتالي يصبح النظام أبطأ. تقوم الألعاب بتقليل هذا الرقم ربما إلى 256 لون أي 8-bit. وربما في الوضع Safe Mode للويندوز ستجدها 256 لون أيضا. لاحظ أن الويندوز يسمي هذه الأرقام بأسماء معينة. فعلى سبيل المثال تجد أن الويندوز يسمي النظام 32-bit يسميه High Color والنظام 16-bit يسميه True Color. وهناك بعض الشاشات التي لا تدعم النظام 32-bit بل تدعم نظام أقل منه وهو 24-bit فحينها ستجد النظام يسمي 24-bit يسميه High Color بينما النظام 16-bit يسميه True Color. وأحيانا أخرى تجد أن الشاشة تدعم النظامين 32-bit و 24-bit وحينها تجد True Color هو النظام 24-bit.
  • المعدل Refresh Rate أو كما يسمى Frequency أو Monitor Flicker
    وهو معدل تغيير الشاشة أي أن الشاشة تقوم بعمل Refresh لنفسها بنسبة معينة. وهذا المعدل كلما زاد كلما سبب للمستخدم صُداع وإجهاد للعين. في الأفضل يكون هذا المعدل 75-Hertz فأقل.
  • التدوير Rotation أو بمعنى آخر Orientation
    وهو كيفية تدوير الشاشة. فربما في بعض الشاشات تجد إمكانية لتدوير الشاشة فتجعلها بزاوية °90 مثلا باتجاه عقارب الساعة وهكذا.

وهكذا فإن الأربعة إعدادات وهي الأبعاد Bounds، نظام الألوان Color System، المعدل Refresh Rate، والتدوير Rotation تمثل جميعها إعدادات الشاشة Display Settings وربما نسميها وضع الشاشة Display Mode.

ولكن يجب عليك معرفة أنه ليست جميع الشاشات وكذلك كروت الشاشة تسمح لك بجميع الإعدادات. فعلى سبيل المثال هناك شاشات لا تدعم التدوير Rotation. وهناك شاشات لا تدعم مثلا نظام الألوان 32-bit بل تدعم بدلا منه 24-bit. وهناك شاشات لا تدعم أبعاد أعلى من 1024 × 768 أو في الشاشات العريضة Wide Screen هناك شاشات لا تدعم أبعاد أعلى من 1280 × 720 (مثل شاشتي)، وهكذا…

وأيضا عليك معرفة أن لكل شاشة مجموعة من الأوضاع التي تدعمها Display Supported Mode. فهناك شاشات مثلا لا تدعم الأبعاد 1024 × 786 بينما نظام الألوان هو 32-bit مثلا.

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

وهنا يظهر سؤال! لماذا تقوم الألعاب بتغيير دقة الشاشة Resolution و نظام الألوان Color System إلى الأقل؟ لماذا يسبب هذا في تحسين أداء وسرعة اللعبة؟

الفكرة هي أن كي تظهر كل نقطة -بيكسل بمعنى أصح- على الشاشة تحتاج إلى جزء من الذاكرة وهذا الجزء هو لكل نقطة هو نظام الألوان الخاص بها. كيف؟ نفترض مثلا أن نظام الألوان هو 32-bit. فهذا معناه أن كل نقطة (بيكسل) على الشاشة تحتاج إلى 32-bit من الذاكرة. إذا فإذا تخيلنا الدقة 1024 × 768 بيكسل فإن المساحة تكون 786432 بيكسل (نقطة). وبالضرب في نظام الألوان 32-bit لكل نقطة إذا فإن 786432 × 32 = 25165824 بت. وكما تعلم أن البايت Byte هو 8 بت Bit وكل كيلوبايت Kilobyte هو 1024 بايت. وكل ميجابايت Megabyte هي 1024 كيلوبايت. إذا يمكننا تحويل البتات Bits 25165824 إلى ميجابايت عن طريق عملية حسابية بسيطة وهي 25165824 / (8 * 1024 * 1024) فيكون الناتج هو أن الشاشة في الدقة 1024 × 768 ونظام الألوان 32-bit تحتاج إلى 3 ميجابايت من الذاكرة في كل نقطة. فتخيل معي أن لعبة مثلا تحتاج في كل لحظة إلى إزالة 3 ميجابايت من الذاكرة وإنشاء 3 غيرها وهكذا في كل لقطة!!! إذا فالحل هو أننا نقوم بتقليص حجم الشاشة ونظام الألوان كي يتقلص معنا الحجم الذي نريده لكل لقطة.

بالطبع مطورو الألعاب يستخدمون طرق عدة لتسريع أداء اللعبة.

الخلفية

في الويندوز يمكنك تغيير إعدادات الشاشة عن طريق فتح شاشة إعدادات الشاشة Display Settings. شكل 1 يوضح شاشة إعدادات الشاشة Display Settings Dialog.

شكل 1 - Display Settings Dialog
شكل 1 – Display Settings Dialog

نلاحظ أن هذه الشاشة تسمح لك بتغيير الأبعاد Resolution ونظام الألوان Color System فقط. مع ذلك يمكنك تغيير باقي أوضاع الشاشة عن طريق الدخول إلى الخيارات المتقدمة عن طريق الزر Advanced Settings لتظهر لك شاشة الخيارات المتقدمة. شكل 2 يوضح شاشة الخيارات المتقدمة للشاشة Advanced Settings Dialog.

شكل 2 - Display Advanced Settings Dialog
شكل 2 – Display Advanced Settings Dialog

من هذه الشاشة يمكنك الضغط على زر List All Modes لتظهر لك شاشة الأوضاح المتاحة للشاشة والتي يمكن للشاشة العمل على أحدها. شكل 3 يوضح شاشة الأوضاع المتاحة للشاشة Display Supported Modes.

شكل 3 - List All Modes Dialog
شكل 3 – List All Modes Dialog

نلاحظ أن هذه الشاشة عبارة عن قائمة بالأوضاع Modes أو بمعنى آخر مجموعة الإعدادات التي تستطيع الشاشة أن تعمل على أحدها. لاحظ أنه يمكنك اختيار الوضع الذي تريده من هذه القائمة. لاحظ أيضا أن هناك بعض الأوضاع التي لن تجدها في شاشة تغيير إعدادات الشاشة العادية شكل 1. فمثلا لن تجد في الشاشة الأخرى طريقة لتغيير المعدل Frequency أو نظام الألوان Color System إلى 256 لون (8-bit) مثلا.

يلاحظ أيضا في هذه الشاشة أن الأبعاد الخاصة بشاشتي وهي 1280 × 720 لا تعمل إلى مع المعدل 60-Hertz فقط وكذلك الأبعاد 1280 × 600. بينما الأبعاد 800 × 600 تسمح لي بالمعدل 75-Hertz.

نرجع إلى شاشة إعدادات الشاشة المتقدمة شكل 2. يمكنك من هذه الشاشة الانتقال إلى التبويب Monitor لتغيير المعدل Refresh Rate أو كما يسمى Frequency أو Monitor Flicker. بالنسبة لشاشتي لا أجد إلا المعدل 60-Hertz وذلك كما ذكرت سابقا أن الأبعاد 1280 × 720 والذي أعمل عليهت لا تدعم معها إلا المعدل 60-Hertz. أما إذا قمت باختيار أبعاد مثل 800 × 600 فحينئد أجد الوضع 75-Hertz أيضا.

لاحظ أيضا أنه كلما زدت عن المعدل 75-Hertz فإن ذلك سوف يسبب لك صُداع في الرأس وإجهاد للعين.

نرجع إلى شاشة إعدادات الشاشة المتقدمة شكل 2. يمكنك من هذه الشاشة أيضا تغيير التدوير Rotation أو Orientation -بالطبع إذا كانت تدعمه شاشتك عن طريق الانتقال إلى تبويب الإعدادات الخاصة بكارت الشاشة الخاص بك من هذه الشاشة واتباع الخطوات المناسبة. شكل 4 يوضح شاشة إعدادات الشاشة بعد تدويرها بزاوية °90 باتجاه عقارب الساعة.

شكل 5 - Display Settings Dialog Rotated 90degree Clockwise
شكل 4 – Display Settings Dialog Rotated 90degree Clockwise

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

لاحظ أيضا أنه ليست كل كروت الشاشة لها خيارات خاصة بها وليست كل الشاشات أيضا تدعم التدوير Rotationأو Orientation.

والآن نحن بصدد أبسط طريقة لتغيير إعدادات الشاشة برمجيا وهي عن طريق استخدام دوال DirectX.

استخدام DirectX لتغيير إعدادات الشاشة برمجيا

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

يمكنك استخدام DirectX لاستغلال جميع إمكانيات الجهاز من الوسائط المتعددة Multimedia مثل الصوت والصورة. فمثلا في درسنا هذا سوف نستخدم أحد مكتبات DirectX لتغيير إعدادات الشاشة من خلال برنامجنا. وهذه المكتبة هي المكتبة dx3j.dll وتسمى Direct 1.0 Type Library وهي موجودة في المجلد %windir%\System32.

كي يمكنك التعامل مع هذه المكتبة يجب عليك إضافتها إلى المراجع References الخاصة بمشروعك لكي تستطيع لك التعامل معها. ويتم ذلك عن طريق اختيار Add Reference من قائمة Project أو عن طريق ضغطة بالزر الأيمن للفأرة على المشروع واختيار Add Reference لتظهر لك شاشة إضافة المرجع Add Reference شكل 5 والتي توفر لك طريقة لإضافة المكتبات إلى مشروعك كي يمكنك التعامل معها.

شكل 5 - Add Reference Dialog - Direct 1.0 Type Library
شكل 5 – Add Reference Dialog – Direct 1.0 Type Library

من هذه الشاشة اختر التبويب COM وذلك لأن مكتبتنا هي عبارة عن COM Library أي أنها لم تطور باستخدام بيئة الدوت نت. بعد اختيارك التبويب COM ابحث عن المكتبة وهي بعنوان Direct 1.0 Type Library وقم بإضافتها. وهذا سوف يضيف إلى مراجع References الخاصة بمشروعك هذه المكتبة ولكنها ستظهر باسم DIRECTLIB.dll وهذا لأن الدوت نت لا يستطيع التعامل مباشرة مع المكتبات الأخرى مكتبات COM ولهذا فإنك لا تقوم بإضافة المكتبة COM نفسها بل تقوم بإضافة مكتبة دوت نت تعمل كوسيط بينك وبين مكتبة COM وتسمى هذه المكتبة Interop Library كما تسمى أيضا Runtime Callable Wrapper أو RCW.

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

لاحظ أن عملية تعامل الدوت نت مع التكنولوجيات الأخرى مثل COM تسمى Interoperability وتختصر إلى Interop.

بعد إضافة المكتبة إلى المشروع يمكنك الآن ببساطة التعامل معها. في الحقيقية، نحن نحتاج فقط من هذه المكتبة عنصر Class واحد هو الذي نحتاجه للتعامل مع إعدادات الشاشة وهو _dxj_DirectDrawClass.

للأسف DirectX لا يسمح لنا بتغيير جميع إعدادات الشاشة بل يسمح لنا بتغيير فقط الأبعاد ونظام الألوان. على الناحية الأخرى لا يمكننا أيضا من معرفة جميع إعدادات الشاشة بل يمكننا من معرفة الأبعاد ونظام الألوان والمعدل Frequency.

الحصول على الإعدادات الحالية للشاشة

كما قلنا أن الـ DirectX يسمح لنا بالحصول على بعض إعدادات الشاشة وهي الأبعاد Bounds ونظام الألوان Color System والمعدل Frequency. وتتم عمليات إعدادات الشاشة كما قلنا من العنصر _dxj_DirectDrawClass الخاص بمكتبة DirectX المختارة.

للحصول على إعدادات الشاشة حاليا يمكنك استخدام الدالة getDisplayMode() للحصول على هذه الإعدادات. تقوم هذه الدالة بأخذ مدخل Argument واحد وهو من النوع DDSurfaceDesc وهو عبارة عن Structure موجود أيضا في مكتبة DirectX.

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

  • width and height:
    أبعاد الشاشة Bounds، العرض والطول.
  • rgbBitCount:
    نظام الألوان أي عدد البتات bits.
  • refreshRate:
    المعدل Frequency.

الكود التالي يوضح كيفية الحصول على إعدادات الشاشة الحالية. لاحظ أن الكود يعتمد على أنك قمت بإضافة المكتبة dx3j.dll وأنك تعمل على مشروع Console Application. بالطبع يمكنك تغيير نوع المشروع. لاحظ أيضا أن جميع عناصر المكتبة موجودة في الـ Namespace المسمى DIRECTLIB.

// C# Code
static void Main()
{
    DIRECTLib._dxj_DirectDrawClass ddraw =
        new DIRECTLib._dxj_DirectDrawClass();
    DIRECTLib.DDSurfaceDesc desc;
    ddraw.getDisplayMode(out desc);
    Console.WriteLine("{0} by {1}, {2} bit, {3} Hertz",
        desc.width, desc.height,
        desc.rgbBitCount, desc.refreshRate);
}
' VB.NET Code
Sub Main()
    Dim ddraw As _
        New DIRECTLib._dxj_DirectDrawClass()
    Dim desc As DIRECTLib.DDSurfaceDesc
    ddraw.getDisplayMode(desc)
    Console.WriteLine("{0} by {1}, {2} bit, {3} Hertz", _
        desc.width, desc.height, _
        desc.rgbBitCount, desc.refreshRate)
End Sub

يقوم البرنامج بطباعة التالي على جهازي (بالطبع يكون المطبوع هو الإعدادات الخاصة بشاشتك):

1280 by 720, 32 bit, 60 Hertz

معرفة الأوضاع المتاحة للشاشة

لمعرفة الأوضاع المتاحة للشاشة Display Supported Modes التي تستطيع العمل عليها يمكنك استخدام الدالة enumDisplayModes() والموجودة أيضا في نفس العنصر _dxj_DirectDrawClass الخاص بالشاشة. تقوم هذه الدالة بأخذ أربعة مدخلات Arguments وهي على الترتيب:

  • d: وهي عبارة عن اختيارات يمكنك تحديدها. في مثالنا هذا سوف نحدد الاختيار DDEDM_REFRESHRATES كي نقوم باسترجاع المعدل Refresh Rate أيضا وإلا عند استرجاعنا للأوضاع المتاحة لن يتم استرجاع المعدل Freq.
  • desc: عبارة عن عنصر من نوع DDSurfaceDesc يمثل الوضع.
  • args: بياانات أخرى خاصة بالمبرمج يمكنه الرجوع إليها في دالة الـ Callback. سوف يتم الشرح قريبا.
  • fn: أي عنصر يقوم المستخدم بإنشائه يدعم الـ Interface المسماة IEnumModesCallback.

ما هي فكرة هذه الدالة؟ فكرة هذه الدالة هي أنها تستخدم دالة أخرى دالة Callback لكي تقوم بإرجاع الأوضاع المتاحة Supported Modes للمبرمج. وهنا سؤال آخر! ما هي دوال الـ Callback؟ دوال الـ Callback هي عبارة عن دوال يتم النداء عليها عند حدوث أمر معين. فدالتنا التي بأيدينا الآن وهي enumDisplayModes() تستخدم المدخل الثالث والرابع في تطبيق الـ Callback Mechanism. كيف؟ تقوم دالة enumDisplayModes() داخليا باسترجاع جميع الأوضاع المتاحة ثم تقوم بإرجاعها لنا واحدة تلو الأخرى. حيث تقوم بالنداء على دالة الـ Callback تكراريا لكل وضع. وبالنسبة لهذه الدالة enumDisplayModes() فإنها تطلب من المبرمج إنشاء دالة الـ Callback بنفسه. وكي يستطيع المبرمج إنشائها فإنه يقوم بإنشاء عنصر Class معين وهذا العنصر يقوم بالاعتماد على الـ Interface المسماة IEnumModesCallback المحددة من دالة enumDisplayModes(). تحتوي الـ Interface المسماة IEnumModesCallback على دالة واحدة فقط -بالطبع يجب على العنصر الذي أنشأه المبرمج تطبيقها-، هذه الدالة لها مدخلين الأول هو العنصر DDSurfaceDesc يحتوي على بيانات الوضع المحدد والثاني هو عنصر بيانات أخرى وهو الذي أدخله المستخدم عند ندائه على دالة enumDisplayModes().

تشبه فكرة الـ Callback إلى حد كبير فكرة Delegates الموجودة في بيئة الدوت نت.

لاحظ الشكل التالي شكل 6 والذي يوضح كيفية عمل الدالة enumDisplayModes().

شكل 6 - enumDisplayModes() callback
شكل 6 – enumDisplayModes() callback

المثال التالي يوضح كيفية معرفة الأوضاع المتاحة للشاشة. لاحظ الكود جيدا.

    // C# Code
    static void Main()
    {
        DIRECTLib._dxj_DirectDrawClass ddraw =
            new DIRECTLib._dxj_DirectDrawClass();
        DIRECTLib.DDSurfaceDesc desc =
            new DIRECTLib.DDSurfaceDesc();
        ModeCallback callback = new ModeCallback();
        const uint DDEDM_REFRESHRATES = 3;
        string format = "{0} by {1}, {2} bit, {3} Hertz";
        ddraw.enumDisplayModes
            (DDEDM_REFRESHRATES, ref desc, format, callback);
    }
    class ModeCallback : DIRECTLib.IEnumModesCallback
    {
        public void callbackEnumModes
            (ref DIRECTLib.DDSurfaceDesc surfDesc, object ctxt)
        {
            Console.WriteLine(ctxt.ToString(),
                surfDesc.width, surfDesc.height,
                surfDesc.rgbBitCount, surfDesc.refreshRate);
        }
    }
    ' VB.NET Code
    Sub Main()
        Dim ddraw As New DIRECTLib._dxj_DirectDrawClass()
        Dim desc As New DIRECTLib.DDSurfaceDesc()
        Dim callback As New ModeCallback()
        Const DDEDM_REFRESHRATES As UInt32 = 3
        Dim format As String = "{0} by {1}, {2} bit, {3} Hertz"
        ddraw.enumDisplayModes _
            (DDEDM_REFRESHRATES, desc, format, callback)
    End Sub
    Class ModeCallback
        Implements DIRECTLib.IEnumModesCallback
        Public Sub callbackEnumModes _
            (ByRef surfDesc As DIRECTLib.DDSurfaceDesc, _
            ByVal ctxt As Object) _
            Implements _
            DIRECTLib.IEnumModesCallback.callbackEnumModes
            Console.WriteLine(ctxt.ToString(), _
                surfDesc.width, surfDesc.height, _
                surfDesc.rgbBitCount, surfDesc.refreshRate)
        End Sub
    End Class

من البيانات المطبوعة على جهازي باختصار:

320 by 200, 8 bit, 70 Hertz
320 by 200, 16 bit, 70 Hertz
320 by 200, 32 bit, 70 Hertz
. . .
640 by 480, 8 bit, 59 Hertz
640 by 480, 8 bit, 60 Hertz
. . .
800 by 600, 8 bit, 60 Hertz
800 by 600, 8 bit, 72 Hertz
800 by 600, 8 bit, 75 Hertz
. . .
1280 by 720, 8 bit, 60 Hertz
1280 by 720, 16 bit, 60 Hertz
1280 by 720, 32 bit, 60 Hertz

في الكود السابق قمنا بإنشاء الكلاس ModeCallback والتي تقوم بتطبيق الـ Interface المسماة IEnumModesCallback كي نستطيع تطبيق آلية Callback.

تغيير الإعدادات الحالية للشاشة

تعلمنا كيفية الحصول على إعدادات الشاشة وكيفية الحصول على جميع أوضاع الشاشة المتاحة. في هذا القسم سنتعلم كيفية تغيير الإعدادات الحالية للشاشة. لسوء الحظ لا يسمح لنا DirectX إلا بتغيير الأبعاد ونظام الألوان ويتم ذلك عن عن طريق الدالة setDisplayMode() وهي أيضا موجودة في الكلاس _dxj_DirectDrawClass. وتأخذ هذه الدالة خمس مدخلات Arguments ولكننا يهمنا فقط أول ثلاثة وهم على الترتيب:

  • w: عرض الشاشة بالبيكسل Pixel.
  • h: طول الشاشة بالبيكسل Pixel.
  • bpp: نظام الألوان أي عدد البتات في كل بيكسل Bits Per Pixel.

بالطبع لا يمكنك تغيير إعدادات الشاشة إلى وضع غير مدعوم من شاشتك. فعلى سبيل المثال، إذا كنت تمتلك شاشة عادية وليست عريضة Wide Screen فإنك لن تستطيع تحويل الأبعاد إلى 1280 × 720 بيكسل مثلا. وإذا حاولت سيحدث الخطأ System.NotImplementedException. يعد تغيير الإعدادات باستخدام الدالة setDisplayMode() مؤقتا حيث أنك عند انتهائك من البرنامج ترجع الأوضاع كما هي قبل بدأك في تنفيذ كود التغيير. كما يمكنك أيضا النداء على الدالة restoreDisplayMode() إذا كنت تريد استرجاع الأوضاع كما كانت عند نقطة معينة. فباختصار، إذا لم تقم بالنداء على الدالة restoreDisplayMode() لاسترجاع الإعدادات قبل تنفيذ الكود، سوف يقوم DirectX باسترجاع الإعدادات تلقائيا عند انتهاء البرنامج. الكود التالي يوضح كيفية تغيير إعدادات الشاشة كي تصبح الأبعاد 640 × 480 بيكسل ويصبح نظام الألوان 8-bit أي 256 لون. وسوف نعتمد على الـ DirectX كي يقوم باسترجاع الأوضاع الأصلية تلقائيا فور انتهاء البرنامج. لاحظ أننا أضفنا سطر إلى نهاية الكود كي يمنع البرنامج من الانتهاء حتى يقوم المستخدم بضغط أي زر.

// C# Code
static void Main()
{
    DIRECTLib._dxj_DirectDrawClass ddraw =
        new DIRECTLib._dxj_DirectDrawClass();
    ddraw.setDisplayMode(640, 480, 8, 0, 0);
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey(true);
}
' VB.NET Code
Sub Main()
    Dim ddraw As New DIRECTLib._dxj_DirectDrawClass()
    ddraw.setDisplayMode(640, 480, 8, 0, 0)
    Console.WriteLine("Press any key to continue . . .")
    Console.ReadKey(True)
End Sub

خاتمة

تعلمنا في هذا الدرس…

  • ما هي إعدادات الشاشة وكيفية تغييرها من خلال الويندوز.
  • ما هي الأوضاع Modes وكيفية الحصول على الأوضاع المتاحة للشاشة أيضا من خلال الويندوز.
  • ما هو DirectX وكيفية استخدام مكتباته.
  • كيفية التعامل مع مكتبات COM من خلال بيئة الدوت نت.
  • كيفية الحصول على الإعدادات الحالية للشاشة برمجيا.
  • كيفية الحصول على الأوضاع المتاحة للشاشة برمجيا.
  • كيفية تطبيق الـ Callback وآليته.
  • كيفية تغيير الإعدادات الحالية للشاشة برمجيا.

وهذا كله تعلمناه من خلال DirectX. وفي دروس أخرى سنتعلم أكثر وأكثر. سنتعلم كيفية تغيير جميع الإعدادات ليس فقط الأبعاد ونظام الألوان، بل سنتعلم كيفية تغيير المعدل Frequency وأيضا كيفية تدوير الشاشة Rotation وسوف يتم هذا عن طريق دوال ويندوز أي Win32 API Functions.

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

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...
  • كمال

    ماشاء الله عليك مبدع

    ربنا يفتح عليك

  • كمال

    ماشاء الله عليك مبدع

    ربنا يفتح عليك

  • عبدالرحمن

    شرح ممتاز يا محمد …
    ربنا يباركلك

  • عبدالرحمن

    شرح ممتاز يا محمد …
    ربنا يباركلك

  • Pingback: Changing Screen Resolution Programmatically via DirectX | Just Like a Magic()