تهيئة الواجهة


تهيئة واجهة المستخدم الرسومية و برمجتها
تهيئة واجهات المستخدم الرسومية GUI
عندما نجعل واجهتك مرئية Visible , فإنها يجب أن تهيأ بحيث تكون جاهزة للمستخدم. سنوضح فيما يلي كيف يمكن :
1.    بناء (تصميم) الواجهة الرسومية بحيث تبدو أو تظهر بشكل لائق عندما يضبط قياسها بتغيير واحدات الشكل  و المكونة إلى normalized. يؤدي ذلك إلى إعادة ضبط قياس المكونات وجعلها متناسبة مع بعضها عند تغيير ضبط قياس الواجهة GUI. إن الواحدات normalized تعطي الزاوية اليسارية السفلى لنافذة الشكل القيمة (0,0) والزاوية اليمينية العلوية القيمة (1,1).
2.    توليد المعطيات للرسم. إن المثال يحتاج ثلاث مجموعات من المعطيات peaks_data , sinc_data , membrane_data. كل مجموعة من هذه المجموعات تقابل أحد أجزاء القائمة المنبثقة.
3.    إنشاء الرسم الأولي على المحاور.
4.    تخصيص اسم الواجهة الذي سيظهر على عنوان النافذة.
5.    تحريك الواجهة الرسومية إلى مركز الشاشة.
6.    جعل الواجهة الرسومية مرئية.

أ‌)       نستبدل الشيفرة التالية في ملف (M-file) :
% Make the GUI visible
set(f,'Visible','on')
     بهذه الشيفرة :
% Initialize the GUI
% Change units to normalized so components resize automatically.
set([f,hsurf,hmesh,hcontour,htext,hpopup],'Units','normalized');
% Generate the data to plot.
peaks_data=peaks(35);
membrane_data=membrane;
[x,y]=meshgrid(-8:.5:8);
r=sqrt(x.^2+y.^2);+eps;
sinc_data=sin(r)./r;
% Create a plot in the axes.
current_data=peaks_data;
surf(current_data);
% Assign the GUI a name to appear in the window title.
set(f,'Name','Simple GUI')
% Move the GUI to the center of the screen
movegui(f,'center')
% Make the GUI visible
set(f,'Visible','on')
ب‌)  وبالتالي سيبدوا الملف M-file الخاص بواجهتك كما يلي :
function simple_gui
% SIMPLE_GUI Select a data set from the pop-up menu, then
% click one of the plot-type push buttons. clicking the button
% plots the selected data in the axes

% Initialize and hide the GUI as it is being consructed.
SCREENSIZE=get(0,'ScreenSize')
f=figure('Visible','off','Position',[360,500,450,285]);

% Construct the components.
hsurf = uicontrol('style','pushbutton','String','Surf','Position',[315,220,70,25]);
hmesh = uicontrol('style','pushbutton','String','Mesh','Position',[315,180,70,25]);
hcontour = uicontrol('style','pushbutton','String','countour','Position',[315,135,70,25]);

hpopup=uicontrol('style','popupmenu','String',{'Peaks','Membrane','Sinc'},'Position',[300,50,100,25]);
htext=uicontrol('style','text','String','Select Data','Position',[325,90,60,15]);

ha=axes('Units' , 'pixels' , 'Position',[50,60,200,185]);

align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');

% Initialize the GUI
% Change units to normalized so components resize automatically.
set([f,hsurf,hmesh,hcontour,htext,hpopup],'Units','normalized');
% Generate the data to plot.
peaks_data=peaks(35);
membrane_data=membrane;
[x,y]=meshgrid(-8:.5:8);
r=sqrt(x.^2+y.^2);
     sinc_data=sin(r)./r;
% Create a plot in the axes.
current_data=peaks_data;
surf(current_data);
% Assign the GUI a name to appear in the window title.
set(f,'Name','Simple GUI')
% Move the GUI to the center of the screen
movegui(f,'center')
% Make the GUI visible
set(f,'Visible','on')
end

جـ) قم بتنفيذ برنامجك النصي عن طريق كتابة simple_gui على سطر الأوامر , وبالتالي ستظهر واجهتك كما يلي.


برمجة واجهة المستخدم الرسومية GUI
إنك ستستخدم استدعاءات لتبرمج مكونات GUI. إن الاستدعاءات عبارة عن توابع يتم تنفيذها بالتجاوب مع الأحداث المولدة من قبل المستخدم مثل نقر الفأرة مثلاً. نوضح فيما يلي كيف يمكن كتابة الاستدعاءات من أول واجهة بسيطة , و بعدها نبين كيف يمكن ربط كل استدعاء مع مكونته.
-         برمجة القائمة المنبثقة في الواجهة الرسومية
إن القائمة المنبثقة تمكن المستخدمين من اختيار المعطيات التي سترسم. عندما يقوم مستخدم GUI باختيار أحد المجموعات الثلاثة من المعطيات , فإن MATLAB يضبط خاصية Value للقائمة المنبثقة بالدليل المقابل للعبارة النصية المختارة. عندها فإن استدعاء القائمة المنبثقة يقرأ خاصية Value لهذه القائمة ليحدد ما هو الجزء الذي يجب عرضه حالياً و يضبط Current_data تبعاً لذلك.

أضف الاستدعاء التالي إلى ملفك بعد شيفرة التهيئة و قبل تعليمة end النهائية.
% Pop-up menu callback. Read the pop-up menu Value property
% to determine which item is currently displayed and make it
% the current data. This callback automatically has access to
% current data because this function is nested at a lower level.
    function popup_menu_Callback(source,eventdata)
        %Determine the selected data set.
        str=get(sourse,'string');
        val=get(source,'Value');
        % Set current data to the selected data set.
        switch str{val}
            case 'Peaks' %User selects Peaks
                current_data=peaks_data;
            case 'Membrane' %User selects Membrane
                current_data=membrane_data;
            case 'Sinc'  % User selects Sinc
                current_data=sinc_data;
        end
    end

-         برمجة ازرار الضغط في الواجهة الرسومية
ينشئ كل من أزرار الضغط الثلاثة نوعاً من الرسم باستخدام المعطيات المحددة من الاختيار الحالي في القائمة المنبثقة. إن استدعاءات زر الضغط ترسم المعطيات الموجودة في current_data. إنها و بشكل أوتوماتيكي تدخل إلى Current_data بسبب أنها متداخلة عند مستوى منخفض.
أضف الاستدعاءات التالية إلى ملف MATLAB الخاص بك بعد استدعاء القائمة المنبثقة و قبل تعليمة end النهائية :
% Push button callbacks. Each callback plots current_data in the
% specified plot type.

    function surfbutton_Callback(source,eventdata)
        % Display surf plot of the currently selected data.
        surf(current_data)
    end

    function meshbutton_Callback(source,eventdata)
        % Display mesh plot of the currently selected data.
        mesh(current_data)
    end

    function contourbutton_Callback(source,eventdata)
        % Display contour plot of the currently selected data.
        contour(current_data)
    end

-         ربط الاستدعاءات مع مكوناتها
عندما يقوم مستخدم الواجهة الرسومية باختيار مجموعة المعطيات من القائمة المنبثقة أو ينقر على أحد أزرار الضغط , فإن MATLAB ينفذ الاستدعاء المرافق مع هذا الحدث الجزئي. و لكن كيف يعرفMATLAB  ماهو الاستدعاء الذي سينفذ ؟ من أجل ذلك يجب عليك أن تستخدم خاصية callback للمكونات لتحديد اسم الاستدعاء الذي يترافق مع المكونة.

1.    لتعليمة uicontrol التي تعرف زر الضغط Surf, أضف زوج قيمة/خاصية property/value التالي :
'Callback',{@surfbutton_Callback}
إن الاستدعاء Callback هو اسم الخاصية , بينما Surfbutton_callback هو اسم الاستدعاء الذي يخدم في زر الضغط Surf.

2.    بشكل مشابه , بالنسبة للتعليمة uicontrol التي تعرف القائمة المنبثقة أضف زوج قائمة/خاصية كمايلي :
'Callback',{@popup_menu_Callback}

تنفيذ واجهة المستخدم الرسومية النهائية
من خلال الفقرات السابقة قمت ببناء واجهة بسيطة , و فيما يلي نبين الملف M-file  النهائي و كيفية تنفيذ الواجهة الرسومية. طبعاً الآن أصبح لديك برنامج M-file موضح بالتعليمات التالية :
function simple_gui
% SIMPLE_GUI Select a data set from the pop-up menu, then
% click one of the plot-type push buttons. clicking the button
% plots the selected data in the axes

% Initialize and hide the GUI as it is being consructed.
SCREENSIZE=get(0,'ScreenSize')
f=figure('Visible','off','Position',[360,500,450,285]);

% Construct the components.
hsurf = uicontrol('style','pushbutton','String','Surf','Position',[315,220,70,25],'Callback',{@surfbutton_Callback});
hmesh = uicontrol('style','pushbutton','String','Mesh','Position',[315,180,70,25],'Callback',{@meshbutton_Callback});
hcontour = uicontrol('style','pushbutton','String','countour','Position',[315,135,70,25],'Callback',{@contourbutton_Callback});

hpopup=uicontrol('style','popupmenu','String',{'Peaks','Membrane','Sinc'},'Position',[300,50,100,25],'Callback',{@popup_menu_Callback});
htext=uicontrol('style','text','String','Select Data','Position',[325,90,60,15]);

ha=axes('Units' , 'pixels' , 'Position',[50,60,200,185]);

align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');

% Initialize the GUI
% Change units to normalized so components resize automatically.
set([f,hsurf,hmesh,hcontour,htext,hpopup],'Units','normalized');
% Generate the data to plot.
peaks_data=peaks(35);
membrane_data=membrane;
[x,y]=meshgrid(-8:.5:8);
r=sqrt(x.^2+y.^2);
sinc_data=sin(r)./r;
% Create a plot in the axes.
current_data=peaks_data;
surf(current_data);
% Assign the GUI a name to appear in the window title.
set(f,'Name','Simple GUI')
% Move the GUI to the center of the screen
movegui(f,'center')
% Make the GUI visible
set(f,'Visible','on')

% Pop-up menu callback. Read the pop-up menu Value property
% to determine which item is currently displayed and make it
% the current data. This callback automatically has access to
% current data because this function is nested at a lower level.
   
    function popup_menu_Callback(source,eventdata)
        %Determine the selected data set.
        str=get(source,'string');
        val=get(source,'Value');
        % Set current data to the selected data set.
        switch str{val}
            case 'Peaks' %User selects Peaks
                current_data = peaks_data;
            case 'Membrane' %User selects Membrane
                current_data = membrane_data;
            case 'Sinc'  % User selects Sinc
                current_data = sinc_data;
        end
    end

% Push button callbacks. Each callback plots current_data in the
% specified plot type.

    function surfbutton_Callback(source,eventdata)
        % Display surf plot of the currently selected data.
        surf(current_data)
    end

    function meshbutton_Callback(source,eventdata)
        % Display mesh plot of the currently selected data.
        mesh(current_data)
    end

    function contourbutton_Callback(source,eventdata)
        % Display contour plot of the currently selected data.
        contour(current_data)
    end
end

من أجل تنفيذ الواجهة الرسومية قم بالخطوات التالية :
1.    نفذ الواجهة الرسومية البسيطة بكتابة اسم ملف M-file على سطر الأوامر
Simple_gui
ستظهر لك الواجهة الموضحة فيما يلي . . .

2.    في القائمة المنبثقة , اختر Membrane و انقر على الزر Mesh. ستظهر لك الواجهة رسم شعار MATLAB من النوع Mesh كما هو موضح.
3.    قم بتنفيذ كل الخيارات الاخرى الممكنة قبل إغلاق الواجهة GUI.