تـصـمـيـم الـواجـهـات الـرسـومـية
بـرمـجـيـاً
Graphic User Interface
إنشاء GUI
نوضح فيما يلي كيف يمكنك كتابة البرنامج النصي
الذي ينشئ البرنامج النصي الذي واجهة المستخدم GUI الموضحة في الشكل المبين .
إن كافة الكائنات الموجودة في البرنامج
المبينة تم التعرف عليها في الدرس الأول , إن واجهة المثال تتضمن :
-
جملة محاور axes.
-
قائمة منبثقة pop-up menu تسرد مجموعات مختلفة من المعطيات
و التي تقابل توابع في MATLAB
هي sine , membrane , peaks.
-
نص استاتيكي من أجل وضع تسمية للقائمة
المنبثقة.
-
ثلاثة أزرار ضغط تعطي ثلاثة أنواع مختلفة من
الأشكال contour
, mesh , surface.
من أجل استخدام هذا المثال (GUI) فإن
المستخدم يختار مجموعة من المعطيات من القائمة المنبثقة , وعندها فإنه ينقر أحد من
أزرار ضغط نوع الرسم , إن النقر على الزر يشمل تنفيذ الاستدعاء الذي يرسم المعطيات
المختارة ضمن جملة المحاور.
أهـم الـتـوابـع
المسـتـخـدمة
يوفر برنامج الماتلاب مجموعة من التوابع
لإنشاء وبناء واجهات المستخدم الرسومية. يوضح الجدول التالي أهم التوابع التي
تحتاجها لبناء المثال المدروس.
الـتـابـع
|
الـوصـف
|
Align
|
يحاذي محاور و عناصر
التحكم لواجهة المستخدم
|
Axes
|
ينشئ عناصر محاور
|
Figure
|
ينشئ عناصر الشكل حيث
أن GUI هي عنصر شكل
|
Movegui
|
يحرك شكل GUI إلى مكان محدد على الشاشة
|
Uicontrol
|
ينشئ عناصر التحكم
بواجهة المستخدم مثل أزرار الضغط , نص ستاتيكي , و القوائم المنبثقة
|
3.7 إنـشـاء
مـلـف MATLAB
لواجهة المستخدم الرسومية
ابدأ بإنشاء و بناء ملف M-file للواجهة المدروسة .
1. على موجه MATLAB , اكتب edit فيقوم الماتلاب بفتح المحرر.
2. اكتب التعليمات التالية. تعليمة التابع هذه هي السطر الأول من الملف function simple_gui .
3. أضف هذه التعليقات إلى ملف MATLAB
بعد تعليمة التابع. سوف تُعرض هذه التعليقات في سطر الأمر استجابة للأمر help. و يجب أن تتبع بسطر فارغ.
function
simple_gui_test
% 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
end
نحتاج هنا لكتابة التعلمية end بسبب أن المثال مكتوب باستخدام التوابع
المتداخلة (nested
functions).
4. خزن الملف على مجلدك الحالي أو في المكان الذي فيه مسار ملفات MATLAB الخاصة بك. الخطوة التالية
ستكون تخطيط الواجهة GUI
البسيطة .
تـخـطـيـط GUI
يتم تخطيط واجهة المستخدم الرسومية على مرحلتين :
يتم تخطيط واجهة المستخدم الرسومية على مرحلتين :
-
بناء الشكل .
-
إضافة المكونات.
-
بناء الشكل (تـصـمـيـم الـواجـهـة) :
في برنامج الماتلاب , فإن الواجهة عبارة عن شكل. و بالتالي فإن الخطوة الأولى هي أن تنشئ الشكل و نوضعه على الشاشة. إنها أيضاً تجعل GUI غير مرئية و لذا فإن مستخدم GUI لا يستطيع أن يرى المكونات المضافة أو المهيأة. عندما يتم إضافة جميع المكونات على الواجهة و تكون مهيأة , فإن المثال سيجعلها مرئية.
في برنامج الماتلاب , فإن الواجهة عبارة عن شكل. و بالتالي فإن الخطوة الأولى هي أن تنشئ الشكل و نوضعه على الشاشة. إنها أيضاً تجعل GUI غير مرئية و لذا فإن مستخدم GUI لا يستطيع أن يرى المكونات المضافة أو المهيأة. عندما يتم إضافة جميع المكونات على الواجهة و تكون مهيأة , فإن المثال سيجعلها مرئية.
% Initialize and hide the GUI as it is being
consructed.
f=figure('Visible','off','Position',[360,500,450,285]);
و يمكن تغيير لون خلفية الواجهة بكتابة :
f=figure('Visible','off','Position',[360,500,450,285],'Color',[0.1 0.2 0.6]);
لو أردنا وضع أسماء نختارها نحن لتكون مناسبة أكثر
لمحتوى الواجهة الرسومية أو لتحمل اسم التطبيق , يمكن ببساطة كتابة :
f=figure('Visible','off','Position',[360,500,450,285],'Color',[0.1 0.2 0.6],'Name','Demo Design');
لو أردنا التخلص من التسمية التلقائية التي تضيفها
الواجهة نكتب و ببساطة :
f=figure('Visible','off','Position',[360,500,450,285],'Color',[0.1 0.2 0.6],'Name','Demo Design','NumberTitle','off');
وبالنتيجة نحصل على الواجهة :
لو أردنا تعطيل صلاحية تغيير حجم الشاشة
نكتب :
f=figure('Visible','off','Position',[360,500,450,285],'Color',[0.1 0.2 0.6],'Name','Demo Design','NumberTitle','off','Resize','off');
والغاية من ذلك الحفاظ على توزع العناصر
المكونة للواجهة و عدم إنحصارها في ركن واحد عند تكبيرها. يمكن أن تحدث هذه
المشاكل عندما تكون الإحداثيات المسندة للمكونات ثابتة و مستقلة عن حجم الواجهة
الذي تحدده قيمة المتغير ScreenSize.
كان التعريف السابق لقيمة المتغير Position بطريقة بدائية . لأنه لم يكن هناك أخذ بعين الاعتبار لحجم الشاشة المتغير من حاسوب لآخر , ولتجاوز هذا الإشكال يمكننا إستغلال المتغير ScreenSize
كان التعريف السابق لقيمة المتغير Position بطريقة بدائية . لأنه لم يكن هناك أخذ بعين الاعتبار لحجم الشاشة المتغير من حاسوب لآخر , ولتجاوز هذا الإشكال يمكننا إستغلال المتغير ScreenSize
SCREENSIZE=get(0,'ScreenSize')
f=figure('Visible','off','Position',[SCREENSIZE(1) SCREENSIZE(2) SCREENSIZE(3) SCREENSIZE(4)],'Color',[0.1 0.2 0.6],'Name','Demo Design','NumberTitle','off','Resize','off');
إن طلب تابع figure يستخدم زوجي قيمة/خاصية property/value. إن خاصية Position عبارة عن شعاع رباعي العناصر (4-element)
يحدد مكان GUI على الشاشة و أبعادها : ]المسافة من
اليسار , المسافة من الأسفل , الارتفاع, العرض[. الواحدات الافتراضية هي البيكسل pixels.
ويمكن للمبرمج إضافة عدة تعديلات أخرى على
الواجهة الرسومية عبر إدراج خاصيات أخرى. و يبين الجدول التالي أهم الخصائص و
وظيفة كل منها .
الوظيفة
|
الخاصية
|
تعديل لون الواجهة
|
Color
|
إبقاء أو حذف شريط المهام
|
Menubar
|
تسمية الواجهة الرسومية
|
Name
|
تعديل ترقيم الواجهة
|
Numbertitle
|
تحديد الواجهة الأم
|
Parent
|
تحديد المكان و المقاييس
|
Position
|
صلاحية تعديل حجم الشاشة
|
Resize
|
تحديد المؤشر
|
Tag
|
إبقاء أو حذف شريط الأدوات
|
Toolbar
|
بيانات المستخدم
|
Userdata
|
إظهار أو إخفاء الواجهة
|
Visible
|
-
إضافة
المكونات :
يضم المثال المدروس لواجهة GUI ستة مكونات : ثلاثة أزرار ضغط , نص ستاتيكي واحد , وقائمة منبثقة
واحدة , وجملة محاور واحدة. لنبدأ بكتابة التعليمات التي تضيف هذه المكونات إلى GUI. إن إنشاء أزرار الضغط , النص الستاتيكي, القائمة المنبثقة يتم
بالتابع uicontrol. أما إنشاء المحاور فيتم من خلال التابع axes.
1. أضف أزرار الضغط الثلاثة إلى واجهتك بإضافة هذه
التعليمات إلى الملف M-file
وذلك بعد طلب التابع figure.
% 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]);
تستخدم هذه التعليمات التابع uicontrol لإنشاء أزرار الضغط. كل تعليمة تستخدم سلسلة
من الأزواج قيمة/خاصية propert/value
لتعريف زر الضغط. ويوضح الجدول و يصف أهم الخصائص مع العلم أنه في كل طلب يتم
استرجاع مقبض المكونة التي تم إنشاؤها.
الـخـاصـيـة
|
الـوصـف
|
Style
|
في المثال , pushbutton تحدد المكون كزر ضغط
|
String
|
نحدد الاسم الذي سيظهر
على كل زر ضغط.
|
Position
|
تستخدم شعاع رباعي
العناصر لتحديد مكان كل زر ضغط ضمن GUI وقياسه , و الواحدات
الافتراضية هي البيكسل.
|
Parent
|
تحديد الواجهة الأم
|
Backgroundcolor
|
تحديد لون الخلفية
|
Tag
|
تحديد المؤشر
|
FontWeight
|
تحديد نوع الكتابة
|
Callback
|
الاستدعاء , تحديد اسم الدالة التي
نريد استدعائها لتنفيذ السطور البرمجية المطلوبة عن الضغط على الكائن
|
Interruptible
|
التعطيل , توفر إمكانية تعطيل
الوظيفة المسندة للمكون , كما يوحي إسمها.
|
Value
|
تحديد القيمة
|
2. أضف القائمة المنبثقة و عنوانها إلى واجهتك بإضافة هذه التعليمات إلى الملف
M-file و ذلك بعد تعريفات زر الضغط.
hpopup=uicontrol('style','popupmenu','String',{'Peaks','Membrane','Sine'},'Position',[300,50,100,25]);
htext=uicontrol('style','text','String','Select Data','Position',[325,90,60,15]);
من أجل القائمة المنبثقة فإن خاصية String تستخدم مصفوفة خلية لتحدد
الأجزاء الثلاثة من القائمة المنبثقة : Sinc , Membrane , Peaks . أما بالنسبة للنص الستاتيكي
فإنه يستخدم لعنونة القائمة المنبثقة. إن خاصية String لهذا النص تخبر مستخدم GUI ليختار معطيات Select Data. الوحدات
الافتراضية لهذه المكونات هي البيكسل.
3. أضف المحاور إلى GUI
وذلك بإضافة التعليمة التالية إلى الملف M-file.
اضبط خاصية Units على البيكسل
بحيث انها تملك نفس واحدات المكونات الاخرى.
ha=axes('Units' , 'pixels' , 'Position',[50,60,200,185]);
4. حاذي جميع المكونات ما عدا المحاور حول مركزها وذلك بالتعليمة التالية ,
أضفها إلى الملف M-file بعد كل
تعريفات المكونات :
align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
5. اجعل واجهتك GUI
مرئية هذا الأمر بعد أمر المحاذاة :
set(f,'Visible','on')
6. بهذا الشكل سيكون
ملف 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.
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','Sine'},'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');
set(f,'Visible','on')
end