Home  Contents

Events in GTK#

فى هذه الجزئية سنتحدث عن الأحداث

مكتبة GTK# يتم هى نظام يتم تسييره بالأحداث، كل التطبيقات الرسومية تعتمد على الأحداث، التطبيق يبدأ بحلقة تختبر الأحداث اللتى يتم توليدها... وفى حال عدم حدوث اى شئ ينتظر التطبيق ولايفعل شئ

Simple event example

فى المثال التالى سنشرح كيفية التفاعل مع نوعين بسيطين من الأحداث

quitbutton.cs
 
using Gtk;
using System;
 
class SharpApp : Window {

    public SharpApp() : base ("Button")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        
        DeleteEvent += delegate { Application.Quit(); };
        
        Fixed fix = new Fixed();

        Button quit = new Button("Quit");
        quit.Clicked += OnClick;
        quit.SetSizeRequest(80, 35);

        fix.Put(quit, 50, 50);
        Add(fix);
        ShowAll();
    }
    
    void OnClick(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

فى مثالنا، سنتفاعل مع الحدثين Delete, Click .. يتم اطلاق الحدث delete عندما نغلق النافذة.. لايحدث شئ افتراضيا



 DeleteEvent += delegate { Application.Quit(); };

عندما نستخدم الكلمة delegate، نستطيع ان نكتب سطرا يتفاعل مع ذلك الحدث

 quit.Clicked += OnClick;

هنا نحدد اننا نتفاعل مع الحدث Clicked عن طريق الطريقة OnClick

 void OnClick(object sender, EventArgs args)
 {
     Application.Quit();
 }

الطريقة OnClick تأخذ معاملين، المرسل ومعاملات الحدث -يعطى معلومات اضافية عن الحدث- وتعتمد دائما على نوع الحدث.. تستطيع ان تجد توقيع الطريقة فى الوثائق الخاصة ب GTK# هنا http://www.go-mono.com/docs/



Moving window

فى المثال التالى، سنعرض كيف نتعامل مع احداث التحريك لنافذة فنعرض الموضع الحالى لأعلى يسار النافذة فى شريط العنوان



move.cs
 
using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("")
    {
        SetDefaultSize(250, 150);
        SetPosition(WindowPosition.Center);

        DeleteEvent += delegate { Application.Quit(); };
        Show();
    }

    protected override bool OnConfigureEvent(Gdk.EventConfigure args)
    {
        base.OnConfigureEvent(args);
        Title = args.X + ", " + args.Y;
        return true;
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

فى المثال السابق، ربطنا delegate او طريقة لحدث، فى GTK# الكثير من الأحداث تعالج تلقائيا ولكننا نستطيع ان نغير سلوك معالجتها كما فى ذلك المثال



 protected override bool OnConfigureEvent(Gdk.EventConfigure args)
 {
     base.OnConfigureEvent(args);
     Title = args.X + ", " + args.Y;
     return true;
 }

هنا نعيد تعريف الطريقة OnConfigureEvent، يتم اطلاق الحدث Configure event عندما نعيد تحديد المساحة او ننقل الويدجت،لاحظ اننا نستدعى معالج الحدث الخاص OnConfigureEvent الخاص بالأب اولا ولا لن يعمل المثال بصورة سليمة، السطر اللذى يليه نضع فيه احداثيات ال س ، ص على عنوان النافذة




Move event

Figure: Move event



EnterNotifyEvent

الحدث EnterNotifyEvent يتم اطلاقه عند دخولنا لمنطقة الزر بمؤشر الفأرة

enter.cs

using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Enter")
    {
        SetDefaultSize(200, 150);
        SetPosition(WindowPosition.Center);

        DeleteEvent += delegate { Application.Quit(); };

        Button button = new Button("Button");
        button.EnterNotifyEvent += OnEnter;

        Fixed fix = new Fixed();
        fix.Put(button, 20, 20);

        Add(fix);

        ShowAll();
    }


    void OnEnter(object sender, EnterNotifyEventArgs args)
    {
        Button button = (Button) sender;
        button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220));
    }


    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

هنا نغير لون الخلفية للزر عندما يمر عليه مؤشر الفأرة



 button.EnterNotifyEvent += OnEnter;

نربط الطريقة OnEnter للحدث EnterNotifyEvent



 Button button = (Button) sender;
 button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220));

نحصل على الزر بالتحويل القسرى ونحدد لون الخلفية.

Disconnecting an event handler

هنا سنقوم بعرض كيفية فصل معالج الحدث -ايقاف عمله-

disconnect.cs

using Gtk;
using System;
 
class SharpApp : Window {
 
    Button button;

    public SharpApp() : base("Disconnect")
    {
        SetDefaultSize(250, 150);
        SetPosition(WindowPosition.Center);

        DeleteEvent += delegate { Application.Quit(); };

        button = new Button("Button");

        CheckButton cb = new CheckButton("connect");
        cb.Toggled += OnToggled;

        Fixed fix = new Fixed();
        fix.Put(button, 30, 50);
        fix.Put(cb, 130, 50);

        Add(fix);

        ShowAll();
    }


    void OnClick(object sender, EventArgs args)
    {
        Console.WriteLine("Click");
    }

    void OnToggled(object sender, EventArgs args)
    {
        CheckButton cb = (CheckButton) sender;
        if (cb.Active) {
            button.Clicked += OnClick;
        } else {
            button.Clicked -= OnClick;
        }
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

فى الأسطر بالأعلى لدينا زر وصندوق اختبار، نظهر كلمة Click فى الكونسول عندما نضغط على الزر اذا كان صندوق الإختبار مفعل ، حيث انه يربط او يفصل معالج الحدث Clicked الخاص بالزر



 CheckButton cb = new CheckButton("connect");
 cb.Toggled += OnToggled;



لدينا صندوق اختبار، ونقوم بربط حدث عكس الحالة بالطريقة OnToggled

 CheckButton cb = (CheckButton) sender;
 if (cb.Active) {
     button.Clicked += OnClick;
 } else {
     button.Clicked -= OnClick;
 }

هذه الأسطر تربط او تفصل معالج الحدث بناءا على حالة صندوق الإختبار




Disconnect

Figure: Disconnect

هذا الفصل كان حول الأحداث فى GTK#



Home ‡ Contents ‡ Top of Page