Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: QBasic ja hiiren ohjaaminen

jeesukset [11.01.2009 13:07:35]

#

Mite saa tehtyy qbasicilla ohjelma joka pistää hiire vasemma napi pohjaa laittaa hiire liikkuu nii että se piirtää v muotose jutu?

Grez [11.01.2009 15:08:58]

#

Hiiren paikkaa voi DOSissa muuttaa, mutta nähdäkseni ei painiketta ei ohjelmallisesti voi "painaa". Ainoaksi vaihtoehdoksi moisen toiminnallisuuden tekemiseksi DOSissa näkisinkin oman hiiriajurin kodaamisen.

Alla oleva koodi kuitenkin tekee sen V:n muotoisen liikkeen

DECLARE SUB mywait (s AS SINGLE)
'$INCLUDE: 'qb.bi'

DIM inregs  AS RegTypeX             ' Stuff going in
DIM outregs AS RegTypeX             ' Stuff coming out

DIM i AS INTEGER

inregs.ax = 0
CALL INTERRUPTX(&H33, inregs, outregs)
IF outregs.ax = 0 THEN
  PRINT "Hiirtä ei ole :("
  END
END IF

inregs.ax = 1
CALL INTERRUPTX(&H33, inregs, outregs)
CLS

FOR i = 1 TO 40
  inregs.ax = 4
  inregs.cx = i * 8
  IF i > 20 THEN
	inregs.dx = (40 - i) * 8
  ELSE
	inregs.dx = i * 8
  END IF
  CALL INTERRUPTX(&H33, inregs, outregs)
  inregs.ax = 2
  CALL INTERRUPTX(&H33, inregs, outregs)
  inregs.ax = 1
  CALL INTERRUPTX(&H33, inregs, outregs)
  mywait .1
NEXT

PRINT "Paina nappia"
WHILE INKEY$ = ""
WEND

inregs.ax = 2
CALL INTERRUPTX(&H33, inregs, outregs)



SUB mywait (s AS SINGLE)
	DIM w AS SINGLE
	w = TIMER
	DO
		IF TIMER < w THEN EXIT DO
		IF (w + s) < TIMER THEN EXIT DO
	LOOP
END SUB

Tämä vaatii QB.QLB kirjaston, joten käynnistä QB käyttäen /L -parametria

Jotenkin tämä DOSin suosio vielä nykyaikana jaksaa hämmästyttää ja siihen liittyen miksi pitää saada liikutettua hiirtä nappi pohjassa kun kuitenkaan ei voi olla DOSin luonteesta johtuen muuta ohjelmaa käynnissä samaan aikaan.

Metabolix [11.01.2009 15:40:29]

#

Sanotaan nyt varmuuden vuoksi suoraan tuo, mitä Grez jo viestissään vihjasi: Windowsin hiirtä et voi QB:llä ohjata, koska QB toimii DOSissa (tai Windowsin DOS-virtuaalikoneessa).

Juhko [11.01.2009 16:31:04]

#

Windows-funktioita pystyy kutsumaan niin, että teet Windows-ohjelman, joka kutsuu haluamaasi funktiota, ja ajat sen QB:stä SHELL-komennolla. En kuitenkaan suosittele tekemään niin. :)

Katso myös: https://www.ohjelmointiputka.net/keskustelu/18334-winapi-funktiot-qbasic-ym-ohjelmissa

jeesukset [11.01.2009 16:46:01]

#

Onko muita keinoja tehä se? Pitäs saaha tehtyy ympyräki. Tartte sitä http://www.notdoppler.com/frame/639.html toho pelii.

Metabolix [11.01.2009 17:03:02]

#

Käytä jotain muuta ohjelmointikieltä. Aiheesta on keskusteltu jo kymmeniä kertoja, hae hakusanalla mouse_event.

Juhko [11.01.2009 17:19:27]

#

Napin painaminen QB:llä ei edelleenkään onnistu (ainakaan ilman Windows-funktioita), mutta ympyrän muotoinen liike:

TYPE RegType
  AX AS INTEGER
  BX AS INTEGER
  CX AS INTEGER
  DX AS INTEGER
  BP AS INTEGER
  SI AS INTEGER
  DI AS INTEGER
  FLAGS AS INTEGER
END TYPE

DIM pi AS SINGLE
DIM i AS RegType
DIM x AS SINGLE
DIM y AS SINGLE
pi = 4 * ATN(1)

i.AX = 0
CALL INTERRUPT(&H33, i, i)
i.AX = 1
CALL INTERRUPT(&H33, i, i)

x = 160 'koordinaatit
y = 100
r = 30 'säde
FOR index = 0 TO pi * 2 STEP .01
  i.AX = 4
  i.CX = x + (COS(index) * r)
  i.DX = y + (SIN(index) * r)
  CALL INTERRUPT(&H33, i, i)
  WAIT &H3DA, 8
NEXT index

En testannut tuota, joten virheitä saattaa löytyä.

Kaikki hiirikeskeytykset löytyvät osoitteesta http://heim.ifi.uio.no/~stanisls/helppc/int_33.html
Voit käyttää tietääkseni kaikkia keskeytyksiä, komennolla:

CALL INTERRUPT(&Hkeskeytyksen_numero, lahde, kohde)

QB pitää käynnistää parametrilla /L ja alkuun pitää kirjoittaa:

TYPE RegType
  AX AS INTEGER
  BX AS INTEGER
  CX AS INTEGER
  DX AS INTEGER
  BP AS INTEGER
  SI AS INTEGER
  DI AS INTEGER
  FLAGS AS INTEGER
END TYPE
DIM lahde AS RegType
DIM kohde AS RegType

Keskeytyskutsua ennen ja sen jälkeen esim. lahde.AX vastaa AX-rekisteriä, lahde.BX vastaa BX-rekisteriä jne.
lahde ja kohde voivat toki olla sama muuttuja.

EDIT: FreeBasic tukee tietääkseni WinAPI:a suoraan, ja sillä kääntyy suurin osa QB-ohjelmista. Suosittelen. ;)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta