كيف أغير لون أو صورة خلفية فورم من نوع MDI في الدوت نيت ؟

البرامج من نوع MDI هي برامج تحتوي على واجهة رئيسية تشمل كل شاشات البرنامج وتمكننا من عرض أكثر من شاشة في وقت واحد والتحكم فيها جميعا بأمر واحد، كأن نغلق جميع الشاشات الفرعية من قائمة موجودة في الشاشة الرئيسية وما إلى ذلك.
في الدوت نيت (فيجوال بزيك و سي شارب) إذا أردنا أن نجعل واجهة معينة رئيسية لمجموعة من الواجهات الأخرى فلا بد لنا من تغيير الخاصية IsMdiContainer من القيمة الافتراضية False إلى القيمة الافتراضية True.
لكن المشكلة التي ستواجهها أن لون خلفية الواجهة سيصبح رماديا داكنا لا يتغير حتى وإن استبدلته بلون آخر، بل ولا يعرض حتى الصورة التي نحددها له كخلفية سواء فعلنا ذلك يدويا من نافذة الخصائص Properties Window أو كتابة بالكود.
كل ما ستراه هو ذلك اللون البائس أعلاه :(
توجد أكثر من طريقة لحل المشكلة، إما أن نضع شرطا يتحقق من نوع الفورم فإن كان من نوع MDI Client نضع له صورة أو نغير لون خلفيته وهذه هي الطريقة الأسهل والأفضل على الإطلاق والتي سنستعرضها بإذن الله.
أو نقوم برسم صورة الخلفية بواسطة مستطيل Rectangle في الحدث Paint الخاص بالفورم الرئيسي.
الآن تعال معي لنستعرض الحلول.

تغيير لون الخلفية (بلغة Visual Basic.Net):

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each ctl As Control In Me.Controls
            If TypeOf ctl Is MdiClient Then
                ctl.BackColor = Color.Aquamarine
            End If
        Next ctl
    End Sub

تغيير لون الخلفية (بلغة  C sharp.Net):

        private void Form1_Load(object sender, EventArgs e)
        {
                    foreach (Control ctl  in this.Controls)
                    {
                        if (ctl.GetType() ==typeof(MdiClient))
                        {
                            ctl.BackColor = Color.Aquamarine;
                        }
                    }
}

تغيير صورة الخلفية (بلغة Visual Basic.Net):


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each ctl As Control In Me.Controls
            If TypeOf ctl Is MdiClient Then
                ctl.BackgroundImage = Image.FromFile("c://myPic.jpeg")
            End If
        Next ctl
    End Sub

تغيير صورة الخلفية (بلغة  C sharp.Net):

        private void Form1_Load(object sender, EventArgs e)
        {
                    foreach (Control ctl  in this.Controls)
                    {
                        if (ctl.GetType() ==typeof(MdiClient))
                        {
                            ctl.BackgroundImage = Image.FromFile("c://myPic.jpeg");
                        }
                    }
        }
هذه بعض الطرق السريعة لإنجاز المطلوب وكما ذكرنا آنفا، يوجد لدينا طرق أخرى للقيام بنفس العمل.
نكتفي بهذا القدر ونلتقي في تدوينة قادمة إن شاء الله.
دام لكم البشر والفرح.

هناك 10 تعليقات:

  1. أخي الكريم
    طلب مساعد
    أريد تصميم textbox يعكس من خلاله خلفية سطح المكتب
    ويكتب من خلال text1 النص أو القيمه المطلوبة وتنعكس على المستند الذي خلفة على سطح المكتب
    سواء مفكرة أو مستند ورد ألخ..

    ردحذف
  2. أخي الكريم
    نرجو تنزيل درس عن User Control

    ردحذف
  3. السلام عليكم ورحمة الله وبركاته

    جزاكم الله خيراً على المعلومات
    ولكن أود التنويه على أنه عند تغيير صورة الخلفية فإنها لن تعمل إذا كانت خاصية الـ Right To Left للـ MdiContainer مفعلة
    لذلك يجب إلغاؤها وجعلها False حتى تعمل الصورة بشكل جيد, وذلك حسب تجربتي الشخصية

    ردحذف
    الردود
    1. وعليكم السلام ورحمة الله وبركاته،
      أحسنت أخي الحبيب فؤاد، وجازاك الله خيرا على الإشارة إلى هذه الحيثية

      حذف
  4. استادنا خالد السعداني ما الفرق بين استخدام الكلاس عن البرمجة العادية وايهما افضل

    ردحذف
    الردود
    1. السلام عليكم ورحمة الله وبركاته،
      التفصيل في هذا الموضوع قد يطول والمقام يقصر عنه، لذلك ألخص لك إن شاء الله:
      توجد أنماط عديدة للبرمجة، منها الطريقة العادية التي تحدثت عنها والتي تسمى البرمجة الإجرائية Procedural Programming ومنها الطريقة الكائنية التي تحدثت عنها والتي تسمى Object Oriented Programming ويوجد غيرهم كثير..
      طيب ما الفرق بين هذين النمطين؟ وأيهما أفضل من الآخر؟
      الفرق يتمثل في أسلوب كل نمط في حل المشاكل البرمجية وتصور الحلول، حيث في الطريقة العادية نبني البرامج بالاعتماد على الإجراءات والدوال، بينما في النمط الثاني نرتكو على الفئات Classes والكائنات Objects التي تعد نسخا من الفئات.
      في نظري لا توجد مشكلة إن استخدمت أحد النمطين، لكنني أنصحك بالبرمجة كائنية التوجه لأنها ستسهل عليك عملية بناء المشاريع إضافة إلى كونها نمط العصر الذي وجب الإلمام به واستعماله.
      في حفظ الله ورعايته

      حذف
  5. تم تجريب الكود على البرنامجي حيث استخدم الدوت نت 2015
    ومانجحت

    ردحذف
    الردود
    1. السلام عليكم ورحمة الله وبركاته،
      قم بجعل خاصية RighToLeft تساوي False وسوف تنجح إن شاء الله

      حذف
  6. السلام عليكم و رحمة الله تعالى و بركاته
    استاذي الفاضل عندي سؤال اتعبي كثيرا و عو عبارة عن السترجاع قيمة هذا الاجرا المخزن و الذي عبارة عن اجراع لتخزين البيانات في قاعدة المبانات مع ارجاع قيمة اؤكد مدى اتمان العملية او عدمها و هذا نص الاجراء المخزن
    =============================================================
    CREATE PROCEDURE PS_AJOU_ABS
    (
    @ABS_ID VARCHAR(70),
    @ELEVE_NNI VARCHAR(10),
    @ABS_DATE DATE,
    @ABS_DE INT,
    @ABS_A INT,
    @ABS_NH INT,
    @OK BIT OUTPUT
    )
    AS
    DECLARE @ERR INT
    SET @ERR =0
    SET @OK =0
    IF NOT EXISTS (SELECT ABS_ID FROM ABSENCE WHERE ABS_ID=@ABS_ID)
    BEGIN
    BEGIN TRANSACTION
    INSERT INTO ABSENCE (ABS_ID, ELEVE_NNI,ABS_DATE, ABS_DE, ABS_A,ABS_NH )
    VALUES (@ABS_ID, @ELEVE_NNI, @ABS_DATE, @ABS_DE, @ABS_A, @ABS_NH)
    SET @ERR =@ERR + @@ERROR
    IF @ERR =0
    BEGIN
    COMMIT TRANSACTION
    SET @OK =1
    END
    ELSE
    ROLLBACK TRANSACTION
    END
    ============================================================
    اريد استرجاع قيمة المتغبر @OK استخدم C#

    شكرا جزيلا و جزاكم الله خيرا

    ردحذف