Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
3.3paSekStanu
Przeanalizujmyponiższy,niecozmodyfikowanykodkonstruktoraMyFrame:
MyFrame::MyFrame(wxWindow*parent,wxWindowIDid,constwxString&title,
constwxPoint&pos,constwxSize&size,longstyle)
:wxFrame(parent,id,title,pos,size,style)
{
wxStatusBar*sb=CreateStatusBar(4);
intsbwd[4]={150,-1,-2,70};
sb->SetStatusWidths(4,sbwd);
for(inti=0;i<4;i++)//Wypisanieszerokościpól
{
SetStatusText(wxString::Format("Szer.:%d",sbwd[i]),i);
}
CenterOnScreen();
}
71
PasekstanujestobiektemklasywxStatusBar.Wskaźnikdoobiektupaskajestzwracanypodczas
jegotworzeniaprzezfunkcjęCreateStatusBar(),jednorazowowkażdejinstancjioknaklasyMyFrame
(lubinnego,dziedziczącegoodwxFrame).Abyuzyskaćdostępdoobiektupaskastanu,musieliśmy
posłużyćsięwskaźnikiemsb.Myślę,żejesttooczywisteiniewymagakomentarza.Dziękitemu,
żesbwskazujeteraznaszkonkretnypasekstanu,mogliśmyustawićszerokościjegopólzapomocą
funkcjiSetStatusWidths().
PrzywykorzystaniufunkcjiGetStatusBar(),zwracającejbezpośredniwskaźnikdopaskastanuutwo-
rzonegowobrębiedanejinstancjiMyFrame,równoważnyzpowyższymkodmógłbywyglądaćtak:
CreateStatusBar(4);//Zwykłeutworzeniepaskastanu
intsbwd[4]={150,-1,-2,70};
GetStatusBar()->SetStatusWidths(4,sbwd);
UżycieGetStatusBar()możewydawaćsięniezbytbezpieczne,naszczęściejednocześnieokno
programumożezawieraćtylkojedenpasekstanu.Innymisłowy,dojednejkonkretnejinstancjiobiektu
MyFramewjednymczasiemożebyćprzypisanytylkojedenobiekttypuwxStatusBar.
CzasprzyjrzećsiędokładniejfunkcjiSetStatusWidths(),któraodpowidazaustawienieszerokości
poszczególnychpólpaskastanu.Przyjmujeonadwaargumenty,zktórychpierwszyokreślaliczbępól,
drugizaśjestwskaźnikiemdokontenera(wnaszymprzypadkudotablicyliczbcałkowitychsbwd8)
zawierającegodefinicjęszerokościposzczególnychpól.
Zpewnościązastanawiaszsię,dlaczegoniektórewielkościzapisanewtablicywartościami
ujemnymi.Matozwiązekzmożliwościądefiniowaniaszerokościpóljakowartościstałychwyrażo-
nychwpikselach(wartościdodatnie)lubjakostosunekszerokościczęścipolaniewykorzystanego
przezprzypisaniestałychrozmiarów(wartościujemne).Wobectego,żeujemnewartościokreślają
wzajemnystosunekszerokościpól,ichrozmiaryzmieniająsiędynamiczniewrazzezmianąrozmiaru
oknaprogramu.
Wnaszymprzykładziepierwszepolezawszebędziemiećszerokość150pikseli.Poladrugieitrzecie
będądynamiczniezmieniaćswójrozmiarwzależnościodrozmiaruoknaprogramu,przyczymstosunek
ichszerokościzawszebędziewynosił1do2.Ostatniepolebędziemiałostałąszerokość70pikseli.
Szerokośćkażdegopola,wyrażonąwpikselach,możeszwkażdejchwilipobraćzapomocąfunk-
cjiintGetStatusWidth(intn),którajakoswójjedynyargumentprzyjmujeliczbęcałkowitąbędącą
indeksempola.Funkcjata,wpołączeniuzfunkcjąintGetFieldsCount()zwracającąliczbępólpaska
stanu,możesięokazaćbardzoprzydatnaprzydynamicznymzarządzaniustrukturąpaskawczasie
działaniaprogramu.
8
Jakzapewnewiesz,nazwatablicyjestwskaźnikiemdojejpierwszegoelementu.Wprzypadkuprojektowania
aplikacji,którychpasekstanumożemiećzmiennąliczbępól,rozważużycieodpowiednichkontenerów,umożliwiają-
cychdynamicznezarządzaniedanymi(np.wxVectorbędącyklonemklasyvectorpochodzącejzestandardowejbiblioteki
C++).