Putkassa on toistaiseksi vain yksi (1) vastaava hiirivinkki, ja sekin Laaksosen itsensä kirjoittama. Mutta tässä on uudenlainen vinkki, kätevällinen paketti, jonka voi suoraan kopioida omaan ohjelmaan. Awww.. sitähän me kaikki tahdomme <3
Ylempänä on siis subit, jotka copypastetat omaan projektiisi, ja sen alla esimerkki rottaviritelmän käytöstä.
Tämä käyttää Call Absolutea keskeytyskutsujen sijasta, mutta QBX:n käyttäjät joutuvat yhä käyttämään /L -parametriä. Vanhemmilla QBasiceilla ei tämänsortinlaisia ongelmallisuuksia ilmene. Hiirinarun (STRING) heksa-arvot minä muuten häpeäkseni kopioitsin muualta, koska en omista tietämystä siitä, miksi ne ovat sellaisia kuin ovat. Mutta se toimii ;)
Miten toimii?
MouseStruct -tyypin ja declare-julistukset kopioitset siis ohjelmasi alkuun. Niiden perässä on kutsu MouseInit -subiin, jonka tehtävänä on muuttaa hiirinaru ymmärrettävään muotoon (heksat asciimerkeiksi), mutta siitä ei todellisen copypastettajan tarvitse kantaa huolta. (Phew!)
Loput subit voit kopioida minkä tahansa subin väliin, ennen subeja tai jälkeen subien.
GetMouse päivittää hiirirakenteen arvot, kuten painetun napin (1 = vasen, 2 = oikea, 3 = molemmat) ja kohdistimen sijainnin.
ShowMouse (0 TAI -1) määrittää näytetäänkö oletuskursori. Pelkän Mouse.Visiblen muuttaminen ei siis käy!
Oletuskursorilla on muuten paha tapa jättää jälkensä, jos sen alle piirustetaan grafiikkaa. Sitä en siis suosittele käytettäväksi.
DECLARE SUB MouseShow (Visibility AS INTEGER) DECLARE SUB MouseInit () DECLARE SUB GetMouse () TYPE MouseStruct X AS INTEGER Y AS INTEGER Buttons AS INTEGER Visible AS INTEGER END TYPE DIM SHARED Mouse AS MouseStruct DIM SHARED MouseSegment AS STRING: MouseInit SUB GetMouse CALL Absolute(3, Mouse.Buttons, Mouse.X, Mouse.Y, SADD(MouseSegment)) END SUB SUB MouseInit 'Luetaan heksanumeroketju, ja muutetaan se ascii-koodeiksi 'Saatu tekstinaru toimii segmenttiviittaajana (DEF SEG) MouseSegment = "" ASCSource$ = "5589E58B5E0C8B07508B5E0A8B07508B5E088B0F8B5E068B175B581E07CD33538B5E0C8907588B5E0A89078B5E08890F8B5E0689175DCA0800" FOR X = 1 TO LEN(ASCSource$) STEP 2 MouseSegment = MouseSegment + CHR$(VAL("&H" + MID$(ASCSource$, X, 2))) NEXT END SUB SUB MouseShow (Visibility AS INTEGER) DEF SEG = VARSEG(MouseSegment) 'Boolean muutetaan hiiren vaatimaksi "2=FALSE, 1=TRUE" -oudokkeeksi 'Muutosta ei tehdä CALL Absoluten attribuuttina, jotta palautusarvo 'säilyisi muuttujassa '+0, -1 => +2, +1 Mouse.Visible = 2 - ABS(SGN(Visibility)) CALL Absolute(Mouse.Visible, Mouse.Buttons, Mouse.X, Mouse.Y, SADD(MouseSegment)) '+2, +1 => +0, -1 Mouse.Visible = -ABS(SGN(Mouse.Visible - 2)) END SUB
DECLARE SUB MouseShow (Visibility AS INTEGER) DECLARE SUB MouseInit () DECLARE SUB GetMouse () CONST False = 0, True = NOT False TYPE MouseStruct X AS INTEGER Y AS INTEGER Buttons AS INTEGER Visible AS INTEGER END TYPE DIM SHARED Mouse AS MouseStruct DIM SHARED MouseSegment AS STRING: MouseInit SCREEN 12 MouseShow True DO GetMouse LOCATE 1 PRINT "Buttons:"; Mouse.Buttons PRINT " LocX:"; Mouse.X PRINT " LocY:"; Mouse.Y PRINT "Visible:"; Mouse.Visible SELECT CASE INKEY$ CASE " ": MouseShow NOT Mouse.Visible CASE CHR$(27): END END SELECT LOOP
Jos joku on kiinnostunut TAICA-COODISTA, joka palauttaa vasemman ja oikean napin simppelit totuusarvot, se on tässä:
VasenNappi = ((Mouse.Buttons AND 1) <> 0) OikeaNappi = ((Mouse.Buttons AND 2) <> 0)
(kyseinen taica-coodi on hiirinarun heksa-arvojen lisäksi toinen qbasic.comista kopioimani asia)
ggggggggggggg
hei mitenkä tuota käytetään, miten tehdään sellainen,
että jos hiiren kohdistin menee tietyn jutun ylle ja painetaan nappia, niin tapahtuu jotain?
t. todellinen copypastettaja, joka ei ymmärrä ohjelmoinnista hölkäisen pölähdystä.
Miks toi tekee niin että ku mä yritän ajaa sen ni se sulkee ja kumittaa kaiken ja sanoo "Ohjelma on suorittanut laittoman toiminnon ja se lopetetaan"???
No nyt mä sain sen toimimaan. Siistin näkönen.
lainaus:
hei mitenkä tuota käytetään, miten tehdään sellainen, että jos hiiren kohdistin menee tietyn jutun ylle ja painetaan nappia, niin tapahtuu jotain?
Se tehdään niin, että vertaat Mouse.Y:tä ja Mouse.X:ää siihen, mitä haluat että klikataan. Esimerkiksi:
IF Mouse.Buttons = 1 THEN IF Mouse.X < Kuvake.X + 50 and Mouse.X > Kuvake.X - 50 and Mouse.Y < Kuvake.Y + 50 and Mouse.Y > Kuvake.Y - 50 BEEP END IF
Tuon voit lisätä ennen LOOP-riviä, ja laittaa SCREEN 12:n jälkeen näin:
Kuvake.X = 200 Kuvake.Y = 200 CIRCLE (Kuvake.X, Kuvake.Y), (50)
Jos meni oikein, niin kun klikkaat ympyrää, kuuluu piip.
Mitä toi ASCSource$ oikeen meinaa?
emt ja epäselvän näkönen (ja juhkolle tiedoksi että beep ei päästä "piippausta" vaan sen tekee sound, beep tekee semmoisen oudohkon äänen, mitä ei voi kuvailla) mutta kivan näköinen on kyllä.
EDIT: puhvelilla on hauskat vitsit, "sub" ohjaa enkkuwikin sivulle "submarine"
Minun vanhassa koneessa beep päästää piippauksen, kun siinä on vaan piipperiäänet. Kaverin koneessa se sanoo psöörs ja dospoksilla puup. XD
PS: KoTW etm (ei tiedä mitään) XD (no ei, vitsi vitsi)
Hmm. rottaviritelmä. Hiiriajurit. Hmm. Rotanajurit.
Juhko kirjoitti:
Miks toi tekee niin että ku mä yritän ajaa sen ni se sulkee ja kumittaa kaiken ja sanoo "Ohjelma on suorittanut laittoman toiminnon ja se lopetetaan"???
Sama
Juhko kirjoitti:
No nyt mä sain sen toimimaan. Siistin näkönen.
miten?
Edit: mulla vissiin ei toimi CALL Absolute ku mä oon koittanu muutaki niin ei oo toiminu.
Mä kokeilin tota QBX:llä ja sillä ei toiminu mut QBASIC 1.1:llä kyllä toimii.
En tiedä miten teillä...
mul ei toimi
Aihe on jo aika vanha, joten et voi enää vastata siihen.