Ëåêöèÿ 3. Ðàçðàáîòêà èíòåðôåéñíûõ ïðîãðàìì

Áåëîøàïêèí Â.Â.

Copyright © Êðàñíîÿðñêèé ãîñóäàðñòâåííûé óíèâåðñèòåò 2003

 

Ñîäåðæàíèå

Ôóíêöèÿ uicontrol äëÿ ðàçðàáîòêè èíòåðôåéñíûõ ïðîãðàìì 
Êàê èç ôóíêöèè íà ÿçûêå matlab ïðèãîòîâèòü êîä íà ÿçûêå Ñè è èç íåãî
ïðèãîòîâèòü exe-ôàéë 
  
  
  
 
  
 Çàäà÷è 



 Ôóíêöèÿ uicontrol äëÿ ðàçðàáîòêè èíòåðôåéñíûõ ïðîãðàìì 
 


     Ôóíêöèÿ uicontrol ÿâëÿåòñÿ îñíîâíîé ôóíêöèåé äëÿ ðàçðàáîòêè èíòåðôåéñíûõ ïðîãðàìì.
Îíà ðàçìåùàåò â ïàìÿòè è âûñâå÷èâàåò íà óêàçàííîì ãðàôè÷åñêîì îêíå èíòåðôåéñíûå ýëåìåíòû.
Ñëåäóþùèå äâå ñòðîêè îòêðûâàþò ãðàôè÷åñêîå îêíî è ðàçìåùàþò íà íåì èíòåðôåéñíûé ýëåìåíò.
h1=figure;
hu=uicontrol(h1);
Òèï èíòåðôåéñíîãî ýëåìåíòà, åãî ðàçìåðû, ðàñïîëîæåíèå â ãðàôè÷åñêîì îêíå, öâåò è ò.ä.
îïðåäåëÿþòñÿ çíà÷åíèÿìè ïîëåé èíòåðôåéñíîãî îáúåêòà. Ïîñìîòðåòü âñå âîçìîæíûå ïîëÿ îáúåêòà
è èõ çíà÷åíèÿ ïî óìîë÷àíèþ ìîæíî êîìàíäîé set(hu).  ñëåäóþùåé òàáëèöå ïðèâîäÿòñÿ íåêîòîðûå
ïîëÿ èíòåðôåéñíûõ îáúåêòîâ è èõ âîçìîæíûå çíà÷åíèÿ. Çíà÷åíèÿ ïî óìîë÷àíèþ âûäåëåíÿ â 
ôèãóðíûå ñêîáêè.
    

  
    

Ïîëå

Íàçíà÷åíèå

BackgroundColor

Îïðåäåëÿåò öâåò îáúåêòà.

FontUnits

Åäèíèöû èçìåðåíèÿ ðàçìåðà øðèôòà. Âîçìîæíûå çíà÷åíèÿ

[ inches | centimeters | normalized | {points} | pixels ]

FontName

Èìÿ øðèôòà.

FontSize

Ðàçìåð øðèôòà.

Units

Åäèíèöû èçìåðåíèÿ äëÿ ïîëîæåíèÿ ýëåìåíòà â ãðàôè÷åñêîì îêíå

è åãî ðàçìåðîâ. Íà÷àëî ñèñòåìû êîîðäèíàò âñåãäà â ëåâîì íèæíåì

óãëó. Âîçìîæíûå çíà÷åíèÿ [ inches | centimeters | normalized | points | {pixels} | characters ]. Îáû÷íî äëÿ ïîëÿ Units èñïîëüçóþò çíà÷åíèå normalized. Ïðè òàêîì âûáîðå â ëåâîì íèæíåì óãëó ãðàôè÷åñêîãî îêíà âñåãäà ðàñïîëîæåíà òî÷êà (0,0), à â ïðàâîì âåðõíåì (1,1). Ýòî ïîçâîëÿåò ñîçäàâàòü èíòåðôåéñû, íåçàâèñÿùèå îò ðàçðåøåíèÿ ìîíèòîðà è ôàêòè÷åñêîãî ðàçìåðà ãðàôè÷åñêîãî îêíà íà äèñïëåå.

 

Position

Îïðåäåëÿåò ïîëîæåíèå ëåâîãî íèæíåãî óãëà ýëåìåíòà è åãî øèðèíó è âûñîòó. Çàäàåòñÿ âåêòîðîì èç ÷åòûðåõ ýëåìåíòîâ. Íàïðèìåð, ñòðîêà set(hu,'position',[0.1 0.1 0.4 0.5]); çàäàåò ëåâûé íèæíèé óãîë â òî÷êå (0.1,0.1) , øèðèíó 0.4 è âûñîòó 0.5.

Style

Îïðåäåëÿåò òèï èíòåðôåéñíîãî ýëåìåíòà. Âîçìîæíûå çíà÷åíèÿ [ {pushbutton} | togglebutton | radiobutton | checkbox | edit | text | slider | frame | listbox | popupmenu ].
 

String

Çàäàåò íàäïèñü íà èíòåðôåéñíîì ýëåìåíòå.

UiContextmenu

Ññûëêà íà âñïëûâàþùåå ìåíþ, ñâÿçàííîå ñ îáåêòîì.

Callback

Îïðåäåëÿåò èìÿ ôóíêöèè, êîòîðàÿ âûçûâàåòñÿ , êîãäà ñ îáúåêòîì ïðîèñõîäèò ñîáûòèå ( íàïðèìåð, ùåë÷îê ìûøè íà îáúåêòå).

Íàïðèìåð, ÷òîáû ñîçäàòü èíòåðôåéñíûé îáúåêò òèïà togglebutton (êíîïêà ñ äâóìÿ ïîëîæåíèÿìè
- óòîïëåííàÿ è îòæàòàÿ)  è íàïèñàòü ôóíêöèþ äëÿ îáðàáîòêè íàæàòèé íóæíî íàïèñàòü â ìàòëàáå
global ht
ht=uicontrol(h1,'style','togglebutton','callback','togl');.
Äëÿ îáðàáîòêè íàæàòèé íà êíîïêó íóæíî íàïèñàòü ôóíêöèþ togl, êîòîðàÿ ìîæåò âûãëÿäåòü ïðèìåðíî
òàê
function togl()
global ht
val=get(ht,'value');
if val==0 % êíîïêà îòæàòà
.
.
.
else    %êíîïêà óòîïëåíà
.
.
.
end
Êîãäà ïðîèñõîäèò íàæàòèå íà êíîïêó togl, âûçûâàåòñÿ ôóíêöèÿ togl. Ýòà ôóíêöèÿ ïîëó÷àåò
óêàçàòåëü íà îáúåêò ht ÷åðåç îïåðàòîð global. Ôóíêöèÿ get ñ÷èòûâàåò çíà÷åíèå ïîëÿ 'value'
îáúåêòà ht. Ýòî ïîëå îïðåäåëÿåò ñîñòîÿíèå îáúåêòà togglebutton, 0 - êíîïêà îòæàòà,
1 - êíîïêà óòîïëåíà. 

Ñëåäóþùèé ïðèìåð ðàçìåùàåò èíòåðôåéñíûé îáúåêò òèïà 'popup' è èïèñûâàåò ôóíêöèþ mycall
äëÿ îáðàáîòêè ñîáûòèé. 
global hpop
hpop=uicontrol('style','popup','units','normalized','position',[0.1 0.1 0.4 0.05],...
'string','hsv|hot|cool|jet','callback',mycall');
Ôóíêöèÿ mycall âûãëÿäèò ïðèìåðíî òàê:
function mycall()
global hpop
val=get(hpop,'value');
switch val      % âûáèðàåì âûñâå÷åííóþ ñòðîêó
case 1          % âûñâå÷åíà ïåðâàÿ ñòðîêà
.
.
.
case 2          % âûñâå÷åíà âòîðàÿ ñòðîêà
.
.
.
otherwise
.
.
.
end

Âèä ýëåìåíòà popup ïîêàçàí íà ðèñ. 3.1.



Ðèñ. 3.1

 êà÷åñòâå ïîëíîãî ïðèìåðà ïðèâåäó ïðîãðàììó äëÿ îòðèñîâêè ãðàôèêà çàäàííîé ôóíêöèè.
Âñå íåîáõîäèìûå èíòåðôåéñíûå ýëåìåíòû îòðèñîâûâàþòñÿ ôóíêöèåé graphic.m.

function graphic()
%#function myplot
global x0 dx xend fun 
h1=figure;
a1=axes('units','normalized','position',[0.1 0.1 0.8 0.5]);
set(h1,'currentaxes',a1,'numbertitle','off','name','grafik f(t)');
xlabel('t');
ylabel('f');
pos=[0.1 0.7 0.1 0.05];
x0=uicontrol('style','edit','units','normalized','position',pos,'string','0');
pos1=[0.1 0.77 0.1 0.05];
dx=uicontrol('style','edit','units','normalized','position',pos1,'string','0.1');
pos2=[0.1 0.84 0.1 0.05];
xend=uicontrol('style','edit','units','normalized','position',pos2,'string','1');
pos3=[0.01 0.7 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos3,'string','t0');
pos4=[0.01 0.77 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos4,'string','dt');
pos5=[0.01 0.84 0.07 0.05];
uicontrol('style','text','units','normalized','position',pos5,'string','tend');
pos6=[0.01 0.91 0.07 0.05];
uicontrol('style','pushbutton','units','normalized','position',pos6,...
'string','plot','backgroundcolor',[1 0 0],'callback','myplot');
pos7=[0.3 0.91 0.5 0.05];
fun=uicontrol('style','edit','units','normalized','position',pos7,'string',...
'cos(2*pi*t).*exp(-t.^2)');
pos8=[0.2 0.91 0.08 0.05];
uicontrol('style','text','units','normalized','position',pos8,'string','f(t)=');

Âîò êàê âûãëÿäèò ðåçóëüòàò ðàáîòû ýòîé ôóíêöèè íà ýêðàíå.




Ïðè íàæàòèè êíîïêè plot âûçûâàåòñÿ ôóíêöèÿ myplot èç ôàéëà myplot.m,
êîòîðàÿ è îòðèñîâûâàåò ãðàôèê. 

function myplot()
global x0 dx xend fun 
s1=get(x0,'string');
s2=get(dx,'string');
s3=get(xend,'string');
s4=get(fun,'string');
sx=strcat('[',s1,':',s2,':',s3,']');
t=eval(sx); % âûïîëíÿåì ñòðîêó sx, êàê êîìàíäó ìàòëàáà è ðåçóëüòàò çàíîñèì â t.
%next string for compilation to the standalone application only
%you can to comment these string for work in matlab only
str=strrep(s4,'t',sx); % çàìåíà â ñòðîêå s4 ñèìâîëà t íà ñòðîêó sx
f=eval(str); % ñòðîêà str âûïîëíÿåòñÿ êàê êîìàíäà ìàòëàáà, à ðåçóëüòàò çàíîñèòñÿ â f
plot(t,f);

×èòàòåëþ ïðåäîñòàâëÿåòñÿ ñàìîñòîÿòåëüíî ðàçîáðàòü òåêñò ôóãíêöèè myplot. Çàìå÷ó ëèøü,
÷òî çàìåíà ñèìâîëà t â ñòðîêå s4 íà ñòðîêó sx ñâÿçàíà ñ òåì, ÷òî â äàëüíåéøåì 
ôóíêöèÿ myplot áóäåò êîìïèëèðîâàòüñÿ â Cè êîä. Â ìàòëàá çàïðåùåíî êîìïèëèðîâàòü â Ñè
ôóíêöèè ñîäåðæàùèå âûçîâ ôóíêöèè eval ñî ñòðîêîé, ñîäåðæàùåé èìåíà ïåðåìåííûõ èç ðàáî÷åãî
ïðîñòðàíñòâà ìàòëàáà. 



 Êàê èç ôóíêöèè íà ÿçûêå matlab ïðèãîòîâèòü êîä íà ÿçûêå Ñè è èç íåãî
ïðèãîòîâèòü exe-ôàéë 
  

     Êàê ïðîèçâîäèòñÿ êîìïèëÿöèÿ ïðîãðàìì, íàïèñàííûõ íà ÿçûêå matlab, â êîä 
íà ÿçûêå Ñè è çàòåì ãîòîâèòñÿ íåçàâèñèìîå exe-ïðèëîæåíèå ÿ ïîêàæó íà ïðèìåðå 
ôóíêöèè graphic.m. Ïðåæäå âñåãî íåîáõîäèìî çàìåòèòü, ÷òî  êîìïèëèðóþòñÿ òîëüêî ôóíêöèè
ìàòëàáà.  Êîìïèëÿöèÿ îñóùåñòâëÿåòñÿ ñ ïîìîùüþ êîìïèëÿòîðà mcc. 
Ïåðåä êîìïèëÿöèåé íåîáõîäèìî íàñòðîèòü êîìïèëÿòîð ñ ïîìîùüþ êîìàíäû mbuild -setup,
êîòîðóþ ìîæíî ââîäèòü ëèáî èç êîìàíäíîãî îêíà matlab , ëèáî èç êîìàíäíîé ñòðîêè Windows.
Âîò êàê âûãëÿäèò äèàëîã â êîìàíäíîì îêíå.
   

  

Ïîñëå íàñòðîéêè êîìïèëÿòîðà ìîæíî ïðèñòóïàòü ê êîìïèëÿöèè ñ ïîìîùüþ êîìàíäû.

mcc -m -B sgl graphic.m

Ïîñëå êîìïèëÿöèè â âàøåì ðàáî÷åì êàòàëîãå îáðàçóþòñÿ ôàéëû graphic.c è graphic.exe.
Ôàéë graphic.exe ÿâëÿåòñÿ íåçàâèñèìûì exe-ôàéëîì, êîòîðûé ìîæåò âûïîëíÿòüñÿ íåçàâèñèìî
îò ìàòëàáà. Îäíàêî, åñëè â âàøåé ñèñòåìå íå óñòàíîâëåí matlab, òî äëÿ âûïîëíåíèÿ exe-ôàéëîâ
íåîáõîäèìî èíñòàëëèðîâàòü dll áèáëèîòåêè ìàòäàáà. Îíè õðàíÿòñÿ â ñïåöèàëüíîì
ñàìîðàñïàêîâûâàþùåìñÿ àðõèâå mglinstaller.exe, êîòîðûé îáû÷íî õðàíèòñÿ â 
%MATLAB%\extern\lib\win32.
     Îáðàòèòå âíèìàíèå íà âòîðóþ ñòðîêó ôàéëà graphic.m.
%#function myplot     
 Âñå callback ôóíêöèè äîëæíû áûòü îáÿâëåíû ïîäîáíûì îáðàçîì, åñëè ôóíêöèÿ áóäåò êîìïèëèðîâàòüñÿ
â Ñè. 
 
   

        




  Çàäà÷è 
 

1. Íàïèñàòü èíòåðôåéñíóþ ïðîãðàììó äëÿ âû÷èñëåíèÿ îïðåäåëåííûõ èíòåãðàëîâ. Ïîäèíòåãðàëüíàÿ
ôóíêöèÿ è ïðåäåëû èíòåãðèðîâàíèÿ äîëæíû ââîäèòüñÿ ñ èíòåðôåéñà.
2. Èñïîëüçóÿ èíòåðôåéñíûé ýëåìåíò popup ðàçðàáîòàòü èíòåðôåéñ "íàó÷íûé êàëüêóëÿòîð".
Âêëþ÷èòü èíòåðôåéñû äëÿ îòðèñîâêè îòðèñîâêè ãðàôèêîâ, âû÷èñëåíèÿ îïðåäåëåííûõ èíòåãðàëîâ,
âû÷èñëåíèÿ íåîïðåäåëåííûõ èíòåãðàëîâ, äèôôåðåíöèðîâàíèÿ çàäàííîé ôóíêöèè, ðàçëîæåíèÿ 
ôóíêöèè â ðÿä Òýéëîðà â îêðåñòíîñòè çàäàííîé òî÷êè.

previous     next     home