**************RAPID-Q*************** ***********PEATÜKK 12************* ********Kirjutanud:Madedog ********* *********Katsetanud: Madedog****** ==================================== Jah! Rapid-Q KAHETEISTKÜMNES PEATÜKK!!!!! Kas oleksite uskunud? Ma vabandan väga eelnevate 3D osade pärast, aga nüüd on mul küll kõik selge. Alul ei taibanud midagi, aga kui natuke uurisin - nagu punn eest läinud. Muide - eelpool olev tekst(teistes peatükkides, ma mõtlen...) on tõesti arusaamatu. Ka minu jaoks. Muide - see osa ilmselt on KÕIGE pikem... Aga üritame siin valmis teha mõne menüüosa ka. Ühes eelmises peatükis oli juttu kustomiseeritud menüüdest ehk "sinu oma menüü". Leidsin, et selleks on vaja kaussi, jahu, vett ja soola. Ning natuke õunu ja porgandit ka. Ei. See ei olnud nali. Ma rääkisin er.. kirjutasin täitsa õieti. KAUSS - üks QPANEL komponent. JAHU - teine QPANEL komponent, VESI - QLISTBOX komponent, ÕUNAD - mis muud kui väiksed bitmapid PORGAND - üks QBUTTON komponent. Nüüd asume taignasegamise kallale. Kõigepealt paneme paika Kausi. $INCLUDE "RAPIDQ.INC" CREATE Aken AS QFORM Center CREATE Kauss AS QPANEL Align=alTop Height=25 END CREATE END CREATE Aken.ShowModal Kui see käivitada, tekib ekraanile selline aken, millel oleks nagu midagi menüütaolist olemas. Nüüd lisame porgandi - tegelikult mitte QBUTTON vaid QCOOLBTN Pane tähele ühte lahedat asja - FLAT!!! $INCLUDE "RAPIDQ.INC" CREATE Aken AS QFORM Center CREATE Kauss AS QPANEL Align=alTop CREATE Porgand AS QCOOLBTN Flat=True height=25 Caption="Porgand" Width=50 END CREATE END CREATE END CREATE Aken.ShowModal Kas tundub juba menüü moodi olevat? Nüüd lisame ühe komponendi veel - JAHUUUU. $INCLUDE "Rapidq.inc" CREATE AKEN AS QFORM Center CREATE KAUSS AS QPANEL Align=AlTop Height=25 CREATE Porgand AS QCOOLBTN Flat=True height=25 Caption="Porgand" Width=50 END CREATE END CREATE CREATE Jahu AS QPANEL Top=25 Height=150 Visible=False END CREATE END CREATE Aken.ShowModal Päris ilus teine, mis? Aga kus on siis jahu? Kus mujal kui peidetud. Teeme ta nähtavakse nupuvajutuse peale. Programmi algusesse (Peale $INCLUDE rida) lisa rida: DECLARE SUB PorgandKlikk Kusagile peale rida CREATE PORGAND AS QPOR ee.. QCOOLBTN OnClick=PorgandKlikk Ja kõige lõppu(programmis): SUB PorgandKlikk Jahu.Visible=True END SUB Niisiis. Seletan ka natuke. Reaga Declare Sub blablabla... teen programmile teatavaks, et kusagil programmis on selline sub nimega PorgandKlikk, mis käivitatakse: Real OnClick=PorgandKlikk Kas nüüd ilmub nähtavaks? Peaks küll... Nojah, aga nüüd teeb kurvaks see, et kui selle paneeli pealt ära minna, ei kao see kuhugi. Parandame selle vea. Lisa peale esimest DECLARE SUBi rida: DECLARE SUB AkenHiirLiikus Kusagile peale Aken AS QFORM rida... OnMouseMove=AkenHiirLiikus ja lõppu see paljutähendav SUB: SUB AkenHiirLiikus Jahu.Visible=False END SUB Nüüd kaob see ära siis, kui paneeli pealt hiir ära viia. Küll see segab. Teeme nii. et kui millegi peal klõpsata, siis kaob ära. Selleks kirjutame kogu teksti uuesti: $INCLUDE "Rapidq.inc" DECLARE SUB PorgandKlikk DECLARE SUB AkenHiirKlopsas 'Muudetud rida DECLARE SUB KaussKlikk 'Uus rida CREATE AKEN AS QFORM Center OnClick=AkenHiirKlopsas 'Muudetud rida CREATE KAUSS AS QPANEL Align=AlTop Height=25 OnClick=KaussKlikk CREATE Porgand AS QCOOLBTN Flat=True height=25 Caption="Porgand" Width=50 OnClick=PorgandKlikk END CREATE END CREATE CREATE Jahu AS QPANEL Top=25 Height=150 Visible=False END CREATE END CREATE Aken.ShowModal SUB PorgandKlikk If Jahu.Visible=False then Jahu.Visible=True ELSE Jahu.Visible=False END IF END SUB SUB AkenHiirKlopsas 'Muudetud rida Jahu.Visible=False END SUB '''''''Uus SUB siit allpool SUB KaussKlikk Jahu.Visible=False END SUB Nii. On ju olemas. Aga kui meil porgandit süüa ;) ehk seal peal klõpsata, siis ta taastub. Tekitame QCOOLBTN i asemele QPANELi - lihtsam ja loogilisem - kuigi pikem. $INCLUDE "Rapidq.inc" DECLARE SUB PorgandKlikk DECLARE SUB AkenHiirKlopsas DECLARE SUB KaussKlikk CREATE AKEN AS QFORM Center OnClick=AkenHiirKlopsas CREATE KAUSS AS QPANEL Align=AlTop Height=25 OnClick=KaussKlikk CREATE Porgand AS QPANEL BevelInner=bvNone BevelOuter=bvNone Top=1 height=23 Caption="Porgand" Width=50 OnClick=PorgandKlikk END CREATE END CREATE CREATE Jahu AS QPANEL Top=25 Height=150 Visible=False END CREATE END CREATE Aken.ShowModal SUB PorgandKlikk If Jahu.Visible=False then Porgand.BevelOuter=bvLowered Jahu.Visible=True ELSE Porgand.BevelOuter=bvNone Jahu.Visible=False END IF END SUB SUB AkenHiirKlopsas Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB SUB KaussKlikk Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB OK! Aga ikka pole veel menüü moodi - menüünupp ei liigutagi kui hiirega üleminna... $INCLUDE "Rapidq.inc" DECLARE SUB PorgandKlikk DECLARE SUB Liikumine DECLARE SUB PorgandLiikumine DECLARE SUB AkenHiirKlopsas DECLARE SUB KaussKlikk CREATE AKEN AS QFORM Center OnClick=AkenHiirKlopsas CREATE KAUSS AS QPANEL Align=AlTop Height=25 OnClick=KaussKlikk OnMouseMove=Liikumine CREATE Porgand AS QPANEL BevelInner=bvNone BevelOuter=bvNone Top=1 height=23 Caption="Porgand" Width=50 OnClick=PorgandKlikk OnMouseMove=PorgandLiikumine END CREATE END CREATE CREATE Jahu AS QPANEL Top=25 Height=150 Visible=False OnMouseMove=Liikumine END CREATE END CREATE Aken.ShowModal SUB PorgandKlikk If Jahu.Visible=False then Porgand.BevelOuter=bvLowered Jahu.Visible=True ELSE Porgand.BevelOuter=bvNone Jahu.Visible=False END IF END SUB SUB AkenHiirKlopsas Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB SUB KaussKlikk Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB SUB PorgandLiikumine if Jahu.Visible=False then Porgand.BevelOuter=bvRaised end if END SUB SUB Liikumine if Jahu.Visible=False then Porgand.BevelOuter=bvNone end if END SUB Nüüd juba läheb. Edasi on su enda valik, kas teed nuppudega või läheme veel edasi ja teeme asja raskemaks ning ... lahedamaks!!! VARIANT 1: nuputa ise VARIANT 2 Ma nägin kusagil näiteprogrammides sellist vigurit, milles oli piltidega QLISTBOX Vaatame seda lähemalt. ' OwnerDraw ListBox, this can also be extended to comboboxes $INCLUDE "RAPIDQ.INC" DECLARE SUB ListBoxDrawItem(Index AS INTEGER, State AS BYTE, Rect AS QRECT) DECLARE SUB ListBoxMeasureItem(Index AS INTEGER, Height AS INTEGER) DIM Font AS QFont Font.Size = 16 DIM Bitmap(10) AS QBitmap DIM SRect AS QRECT SRect.Top = 0 SRect.Left = 0 SRect.Right = 20 SRect.Bottom = 20 Bitmap(0).BMP = "FLOPPY.BMP" Bitmap(0).Transparent = True Bitmap(1).BMP = "BOOK.BMP" Bitmap(1).Transparent = True Bitmap(2).BMP = "COFFEE.BMP" Bitmap(2).Transparent = True Bitmap(3).BMP = "GAME5.BMP" Bitmap(3).Transparent = True Bitmap(4).BMP = "GAME5.BMP" Bitmap(4).Transparent = True CREATE Form AS QForm Center Caption = "OwnerDraw ListBox" CREATE ListBox AS QListBox Align = alClient Font = Font Style = lbOwnerDrawVariable '-- Variable height OnDrawItem = ListBoxDrawItem OnMeasureItem = ListBoxMeasureItem '-- Note, order IS important! ItemHeight = Bitmap(0).Height AddItems "Floppy Disk","Open Book","Coffee","TicTacToe" ItemIndex = 0 END CREATE ShowModal END CREATE SUB ListBoxMeasureItem(Index AS INTEGER, Height AS INTEGER) ' This subrountine is needed ONLY if your list box is lbOwnerDrawVariable Height = Bitmap(Index).Height+2 END SUB SUB ListBoxDrawItem(Index AS INTEGER, State AS BYTE, Rect AS QRECT) IF State = 0 THEN '-- Selected ListBox.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &H00FF00) ELSE ListBox.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &HFFFFFF) END IF ListBox.TextOut(100, Rect.Top+(Rect.Bottom-Rect.Top)/4, ListBox.Item(index), 0, -1) ListBox.Draw(Rect.Left, Rect.Top, Bitmap(Index).BMP) END SUB Selle jaoks oli vaja nelja bitmapi(tavalised, paintis tehtud) Kui selle listboxi mõni ITEM ekraanile joonistatakse, toimub event OnDrawItem. Siis stiil on lbOwnerDrawVariable, mis tähendab tõlkes: lbOmanikuJoonistatudMuutuv - sellest peaks ju aru saama. Nüüd tulebki mängu sinu joonistamisoskus. Joonista valmis er... IV 16x16 pixlit pilti. Niisiis neli, 32x32(vali Image->Attributes) pixli suurust pilti. Olgu nendeks "new.bmp", "open.bmp", "save.bmp" ja "exit.bmp"(kui su joonistamisoskused jäävad alla nulli, siis lihtsalt kirjuta sellesse 32x32 suurusesse valgesse ruutu, mis ekraanile jäävad, nende nimede algustähed ehk N, O, S, E ;-) Meil on vaja nelja bitmapi... ühte RECTi... Kirjutame selle oma menüüle juurde ehk lisame vee ning viimse osa... $INCLUDE "Rapidq.inc" DECLARE SUB PorgandKlikk DECLARE SUB Liikumine DECLARE SUB PorgandLiikumine DECLARE SUB AkenHiirKlopsas DECLARE SUB KaussKlikk DECLARE SUB VesiJoonista(Index AS INTEGER, State AS BYTE, Rect AS QRECT) DECLARE SUB VesiM66da (Index AS INTEGER, Height AS INTEGER) DECLARE SUB VesiTopeltKl6ps(Index AS INTEGER) DIM Bitmap(10) AS QBITMAP DIM SRect AS QRECT SRect.Top=0 SRect.Left=0 SRect.Right=20 SRect.Bottom=20 Bitmap(0).BMP="new.bmp" Bitmap(1).BMP="open.bmp" Bitmap(2).BMP="save.bmp" Bitmap(3).BMP="exit.bmp" for i=0 to 3 Bitmap(1).Transparent="True" next i CREATE AKEN AS QFORM Center OnClick=AkenHiirKlopsas CREATE KAUSS AS QPANEL Align=AlTop Height=25 OnClick=KaussKlikk OnMouseMove=Liikumine CREATE Porgand AS QPANEL BevelInner=bvNone BevelOuter=bvNone Top=1 height=23 Caption="Porgand" Width=50 OnClick=PorgandKlikk OnMouseMove=PorgandLiikumine END CREATE END CREATE CREATE Jahu AS QPANEL Top=25 Height=150 Visible=False OnMouseMove=Liikumine CREATE Vesi AS QLISTBOX Align=alClient Style=lbOwnerDrawVariable OnDrawItem=VesiJoonista OnMeasureItem=VesiM66da ItemHeight=16 OnDblClick=VesiTopeltKl6ps AddItems "Vesi1","Vesi2","Vesi3","Vesi4" END CREATE END CREATE END CREATE Aken.ShowModal SUB PorgandKlikk If Jahu.Visible=False then Porgand.BevelOuter=bvLowered Jahu.Visible=True ELSE Porgand.BevelOuter=bvNone Jahu.Visible=False END IF END SUB SUB KaussKlikk Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB SUB PorgandLiikumine if Jahu.Visible=False then Porgand.BevelOuter=bvRaised end if END SUB SUB Liikumine if Jahu.Visible=False then Porgand.BevelOuter=bvNone end if END SUB SUB VesiM66da(Index AS INTEGER, Height AS INTEGER) Height=Bitmap(Index).Height+2 END SUB SUB VesiJoonista(Index AS INTEGER, State AS BYTE , Rect AS QRECT) IF State = 0 THEN Vesi.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &H00FF00) ELSE Vesi.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &HFFFFFF) END IF Vesi.TextOut(20, Rect.Top+(Rect.Bottom-Rect.Top)/4, Vesi.Item(index), 0, -1) Vesi.Draw(Rect.Left, Rect.Top, Bitmap(Index).BMP) END SUB SUB VesiTopeltKl6ps(INDEX AS INTEGER) AkenHiirKlopsas ShowMessage Vesi.Item(Index)+"valitud" END SUB SUB AkenHiirKlopsas Jahu.Visible=False Porgand.BevelOuter=bvNone END SUB Loomulikult tuleb siin sul endal suurus määratleda(Mõlema komponendi kõrgus) ja teha üks POPUPMenu aga see on juba teine lugu. Peatükk 12 on ju valmis... mida veel tahta... ***********AEG LENDAB************** Tõsi mis tõsi... aeg lendab tõesti kiiresti! Ma olen nüüd natuke järele mõelnud ja otsustanud ka 13 peatüki kirjutada. Aga mis seal tuleb - see jäägu sulle endale nuputamiseks. Igatahes võin ma öelda, et seal on tegemist piraatlusevastase programmi vastase tegevusega...oeh, keerulised sõnad, mis? Noh hea küll - LINUX. Aga ma seletan 13. peatükis lähemalt!!!