 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 31.01.2005, 20:23 Titel: maus in QBasic |
|
|
also ich hab da mal ne frage wie kann man machen das ein kreis gezeichnet wird und das programm wird dann nicht beendet und der kreis bleibt stehen und wenn man mit der maus in den kreis drückt dann wird der bildschirm leer und es wird "hallo"angezeigt und das programm wird beendet.
ich würde mich sehr freuen wenn mir wer ein beispiel geben könnte und es mir auch erklären konnte
danke schon im voraus  |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 31.01.2005, 20:32 Titel: |
|
|
Hi, hi!
Als erstes einmal musst du dir aus der Download-Section einer QBasic-Seite eine Mausroutine holen.
Diese liefert dir normalerweise 3 Werte:
x%, y% und k% (=Klick, ja nein)
anschließend musst du eine Schleife schreiben, in der der Bereich des Bildschirms abgefragt wird, der klicksensitiv ist.
Code: |
screen 12
LINE (201,201)-(299,299), 1, BF
LINE (201,201)-(299,299), 14, B
DO
Mausroutine x%,y%,k%
IF x%>200 and x%<300 and y%>200 and y%<300 and k% then exit do
LOOP
CLS
?"Halo, HalfLife2 und wie sie alle heißen"
|
Ich hab dir oben den klicksensitiven Bereich auch mit LINE dargestellt, damit du es sehen kannst.
Das mit dem Kreis wird schon etwas schwieriger - denn auch bei den meißten neueren Programmen gibt es keine Abfragen für runde Buttons - am einfachsten ist es, wenn du dich auf ein Rechteck festlegst, das in der Mitte liegt..
Code: | Du kannst ja mal dieses gegen den Zeichen-Code oben austauschen:
CIRCLE (250, 250), 55, 10
PAINT (250, 250), 10, 10
LINE (201, 201)-(299, 299), 2, B
|
Da siehst du den Kreis, und etwas dunkler den tatsächlichen Bereich, den du anklicken kannst.
Grüßle,
Mecki _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 01.02.2005, 07:51 Titel: danke |
|
|
danke euch beiden aber ich versuchs lieber zuerst mit Mausroutinen ich hab da noch ne frage wo bekomm ich diese Mausroutinen her ich kenn nur eine QBasic seite und auf der gibts das nicht |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 01.02.2005, 10:08 Titel: |
|
|
Guckst du hier
QBasic.de -> Downloads -> Maus&Tastatur
Also wenn du dich auf Qbasic.de da durchklickst, findest du schon was passendes. |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 02.02.2005, 07:45 Titel: jetzt |
|
|
jetzt hab ich zwar mitlerweile ne mausroutine aber ich weiß nicht wie und wo ich sie einbauen muss
kann mir da bitte einer helfen |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 02.02.2005, 10:08 Titel: |
|
|
Normalerweise ist da immer eine Readme.txt dabei. Aber erzähl mal, was du dir da für eine Routine besorgt hast.
P.S. Hi, warum bist du verwarnt? _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 02.02.2005, 10:19 Titel: |
|
|
Hallo
Wenn du dann eine Mausroutine gefunden hast, kannst du relativ einfach feststellen, ob innerhalb eines Kreises geklickt wurde. Wenn xm,ym die Koordinaten des Mauspfeils sind und xk,yk der Mittelpunkt des Kreises, musst du nur den Abstand d zwischen beiden ausrechnen und vergleichen, ob dieser grösser ist als der Radius. In dem Fall ist der Pfeil ausserhalb.
d = SQR((xk-xm)^2 + (yk-ym)^2)
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 02.02.2005, 11:01 Titel: |
|
|
Skilltronic hat Folgendes geschrieben: |
d = SQR((xk-xm)^2 + (yk-ym)^2)
|
Normalerweise ist ein Quadrat einer Zahl schneller zu berechnen, als die Quadratwurzel zu ziehen, deswegen tut es
Code: | d^2 = (xk-xm)^2 + (yk-ym)^2 |
das auch. _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 02.02.2005, 13:22 Titel: aha |
|
|
aha das probier ich mal wenn ich noch probleme hab sag ichs |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.02.2005, 14:57 Titel: |
|
|
@SpionAtom: Deine Variante funktioniert nicht. QBasic ist kein Formelberechner, kann also das d^2= ebbes nicht verarbeiten. Du musst das also zu SQR umformen, sonst kann QB das nicht ausrechnen und gibt dir nen Syntaxerror. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 02.02.2005, 15:26 Titel: |
|
|
MisterD hat Folgendes geschrieben: | @SpionAtom: Deine Variante funktioniert nicht. QBasic ist kein Formelberechner, kann also das d^2= ebbes nicht verarbeiten. Du musst das also zu SQR umformen, sonst kann QB das nicht ausrechnen und gibt dir nen Syntaxerror. |
Das war auch kein Quelltext, sondern lediglich der mathematische Umformung des Wurzelausdrucks. Hab mich wohl nicht verständlich ausgedrückt.
Dennoch:
Guckst du hier
Code: |
'mausx, mausy sind die Mauskoordinaten
'mittex, mittey sind die Mittelpunktskoordinaten des Kreises
'radius ist der Radius des Kreises
IF radius^2 < (mausx-mittex)^2 + (mausy-mittey)^2 THEN
mausImKreis = 1
ELSE
mausImKreis = 0
END IF
|
So war das gedacht. Habs nicht getestet, aber müsste klappen  _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.02.2005, 17:33 Titel: |
|
|
joa gut, so geht das. Bei ner Abfrage ist das kein Problem, da muss er ja beide Ausdrücke zu Werten umrechnen. Hatte gedacht du meinst als Programmzeile weil das von Skill war nämlich eine. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 04.02.2005, 08:41 Titel: ok |
|
|
ok gut jetzt hab ich zwar verstanden das man mausroutinen in sein programm einbauen kann aber eine frage hab ich trotzdem noch:
wie funktionieren mausroutinen eigentlich(wie macht man die maus am bildschirm sichtbar, wie macht man das der computer auf mausklicke reagiert, .................)
ich hoffe irgend ein mausroutinen erfinder schaut jetzt ins forum oder irgendein anderer sehr guter programmierer kann mir jetzt helfen
ich danke euch schon im foraus  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.02.2005, 09:16 Titel: |
|
|
Mecki bezeichnet zwar gerne INT 33h als kompliziert; aber INT 33h entspricht genau demjenigen API (Application Programming Interface), welches seinerzeit Microsoft / Logitech festgelegt haben.
Kurz & bündig: Es gibt zwar mit INT 33h/AX=000Ch die Möglichkeit, einen sog. Event-Handler zu definieren, aber diese Möglichkeit macht eigentlich nur für Assembler-Programmierer Sinn. Siehe
http://www.ctyme.com/intr/rb-5968.htm
Daher empfehle ich eigentlich eher ein INKEY$-mässiges Abfragen, d.h. Du rufst im allereinfachsten Fall periodisch INT 33h/AX=0003h auf.
http://www.ctyme.com/intr/rb-5959.htm
Der ganz saubere Weg sind INT 33h/AX=0005h und INT 33h/AX=0006h, weil sich diese Funktionen auch bei ganz langsamen Programmen die Mauszeigerpositionen beim Niederdrücken und Loslassen der Maustasten merken.
Zwei nette kleine Programme, wo alle diese Techniken vorkommen:
http://beilagen.dreael.ch/QB/MALPROG2.ZIP
http://www.dreael.ch/QB/mini_des.zip
Letzteres demonstriert noch die Abfrage der Umschalt- und Strg-Taste, so dass Windows-mässige Dinge wie Strg-Taste gedrückt halten beim Loslassen, um Element zu kopieren statt bloss verschieben.
Wie weit all diese INT 33h-Grundfunktionen in diese Drittanbieter-.QLBs eingepackt zur Verfügung gestellt werden, kann ich zuwenig beurteilen, da für mich halt immer
http://www.ctyme.com/intr/int-33.htm
die Referenz darstellt und somit dank CALL INTERRUPT auch diejenigen Features der allerletzten DOS-Maustreiber-Versionen bei Bedarf genutzt werden können. :-) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 04.02.2005, 16:04 Titel: ich |
|
|
och bin zu dumm ich verstehs noch immer nicht ich glaub dass geht nur mit einem tutorial
sagt mir bitte wenn ihr wisst wo es eins gibt wo es eine maustutorial gibt |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 04.02.2005, 17:02 Titel: |
|
|
Dann wollen wir mal ganz von vorne anfangen, was?
(Anmerkung: Es kann sein, dass die hier beschriebenen Codes nicht funktionieren, weil du ja noch QBASIC 1.1 benutzt. Ich hab das aber schon so lange nicht mehr hergenommen, dass ich nicht mehr weiß, welche standards für qb 1.1 galten. In qbx 7.1 sind jedenfalls andere, und deswegen funzen die codes in diesem Post bei dir vllt nicht. Trotzdem solltest du dir das ganze hier durchlesen. Dann nämlich wirst du zumindest etwas mehr über INTERRUPTS wissen, so dass es dir einfacher fallen wird, dein mausprog zu bauen *g*)
(Du solltest auf jeden fall auf qb45 umsteigen, weil das um einiges schneller ist, EXE dateien erzeugen kann, und - soweit ich weiß - im forum die verbreiteste sprache ist. Deine alten Programme sollten voll kompatibel sein, und dir steht ein größerer Befehlsschatz zur verfügung, der unbedingt nötig ist, wenn du irgendwann einmal richtig professionell werden willst *g*)
Aaaalso:
INTERRUPTS sind kleine Programme, die sozusagen im System integriert sind. Man könnte sagen, es sind SUB's im BIOS, was wohl gar nicht mal sooo falsch ist. Jedes dieser Programme hat jetzt eine eigene Nummer. Diese Nummern gehen von 0 bis 255.
Die Programmierer haben sich aber untereinander geeinigt, diese Nummer als Hexadezimalwerte anzugeben, deswegen immer die h's hinter der Interruptnummer.
Damit QB weiß, dass du ihm jetzt eine Hexadezimale Zahl eingibst, muss davor immer ein &H stehen, sonst wertet es die zahl als etwas ganz anderes, oder vllt sogar als variable.
Beispiel:
33 = 33 (ja ne, is klar, wat )
&H33 = 51
33 = &H21
Für manche dieser INTERRUPTS genügt schon die Nummmer, um sie aufzurufen, die meisten von ihnen brauchen aber auch noch ein paar Parameter.
Und die müssen auf eine ganz besondere Art übergeben werden. Um zu verstehen, wie das geht, musst du erst einmal ein bischen etwas über den Prozessor wissen:
Der Prozessor ist nämlich nicht nur eine einfache Maschine, die Berechnungen anstellt, sondern hat auch noch eine eigene "Festplatte". Diese Festplatte ist ziemlich klein - nur ein paar Bytes passen da drauf. Das genügt aber für seine Aufgaben schon.
Wozu braucht man so einen kleinen Speicher?
Genau, hier werden die Parameter für die INTERRUPTS zwischengespeichert!
(und noch ein paar andere Daten, aber das musst du erst wissen, wenn du mit ASSEMBLER anfängst...)
Jetzt werden die Parameter nicht einfach so auf den speicher des Prozessors draufgeklatscht. Sie sind nämlich in so genannten Registern organisiert.
Und jedes Register hat einen eigenen Namen. Als da wären:
AX
BX
CX
DX
EX
CS
DS
ES
DI
SI
Komische Namen, was?
Naja, wie gesagt, jedes dieser Register übergibt nun einen Parameter an einen INTERRUPT. Nur wie schreibt man von QB aus in die Register?
Hier beginnt der Teil der für QB 4.5 oder höher gilt.
Deswegen solltest du entweder qb45 von qbasic.de runterladen, oder dich nach anderen tutorials umsehen...
Dazu brauchst du erst einmal eine SUB, die MS praktischerweise gleich mit QB ausliefert: INTERRUPT. Die ist aber nicht im Programm integriert, sondern als LIB/QLB beigelegt. Deswegen musst du QB 4.5 mit der Zeile "QB /L" starten.
Das schreiben in die Register übernimmt qb eigentlich ganz automatisch.
Damit du Die SUBs in dieser LIB benutzen kannst, musst du sie deklarieren:
DECLARE SUB INTERRUPT (intnum AS INTEGER, EinReg AS RegTypX, AusReg AS RegTypX)
Das einzige, was du dazu tun musst, ist einen eigenen Datentyp zu erstellen:
Code: |
TYPE RegTypX
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
FLAGS AS INTEGER
DS AS INTEGER
ES AS INTEGER
END TYPE
DIM Regs AS RegTypeX
|
(Merkst dus? das sind genau die Namen der Register!)
Jetzt belegtst du die Register einfach mit den Werten die du brauchst:
das wäre z.B.:
Mausstaus 1 (An oder aus?)
AX = 0
Maus sichtbar machen:
AX = 1
Maus unsichtbar machen:
AX = 2
Mausstatus 2 (Position, Buttons)
AX = 3
Du schreibst also:
Regs.AX = 1
Um das Register AX auf 1 zu setzen.
Und jetzt der INTERRUPT-Aufruf:
CALL INTERRUPT (&H33, Regs, Regs)
Fertig, die Maus wird angezeigt!
Jetzt wollen wir den Maussatus abfragen, also, wo sich die Maus gerade befindet, und ob gerade eine Taste geklickt wird:
Code: |
Regs.AX = 3
CALL INTERRUPT (&H33, Regs, Regs)
b = Regs.BX
x = Regs.CX
y = Regs.DX
|
x und y zeigen dann die Koordinaten der Maus zum Zeitpunkt des Interruptaufrufs an, b die nummer der Buttons, die gerade angeklickt wurden.
So, das ist doch schon mal was, oder?
Aber, es geht noch komfortabler:
Code: |
DECLARE SUB INTERRUPT (intnum AS INTEGER, EinReg AS RegTypX, AusReg AS RegTypX)
DECLARE FUNCTION MoX
DECLARE FUNCTION MoY
DECLARE FUNCTION MoB
TYPE RegTypX
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
FLAGS AS INTEGER
DS AS INTEGER
ES AS INTEGER
END TYPE
DIM Regs AS RegTypeX
Regs.AX = 1
CALL INTERRUPT (&H33, Regs, Regs)
DO
LOCATE 1,1
PRINT "Koordinaten:";MoX, MoY,"Buttons:";MoB
LOOP UNTIL LEN(INKEY$)
FUNCTION MoX
Regs.AX = 3
CALL INTERRUPT (&H33, Regs, Regs)
MoX = Regs.CX
END FUNCTION
FUNCTION MoY
Regs.AX = 3
CALL INTERRUPT (&H33, Regs, Regs)
MoX = Regs.DX
END FUNCTION
FUNCTION MoB
Regs.AX = 3
CALL INTERRUPT (&H33, Regs, Regs)
MoX = Regs.BX
END FUNCTION
|
Jederzeit abfragbar, praktisch, wunderbar. Ich hoffe, du hast das jetzt soweit verstanden
Wie gesagt, diese Version ist auf QB45 oder höher ausgelegt, aber du solltest unbedingt auf diese Version umsteigen. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 04.02.2005, 20:38 Titel: ich |
|
|
ich probier das mal aber wenn jemand ein tutorial findet wo man das lernen kann dann bitte her damit!!! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.02.2005, 21:19 Titel: |
|
|
Zu CALL INTERRUPT habe ich sonst auch einen Artikel in der Sammlung:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/DOS-Interrupts.html
Die Ausgangssituation: Jedes Betriebssystem besitzt fundamentale "SUB"-Routinen (Begriff nicht einmal so unpassend von Dusky_Joe). Microsoft hatte seinerzeit wohl ein grosser Teil dieser Aufrufe in Befehle einpacken versucht, aber weil mit jeder neuen MS-DOS-Version wiederum neue APIs dazukamen, hinkte der QB-Befehlssatz hoffnungslos hinterher. Gewisse Dinge wurden gar nie richtig abgedeckt. Beispiel: FILES - Was nützt mir ein Befehl zum Verzeichnis einlesen, der seinen Output nicht in einer Feldvariable hinterlässt?
Bei MS-DOS wird nun einmal alles über Software-Interrupts als API-Aufrufmethode abgewickelt. CALL INTERRUPT eröffnet einem das ganze Potenzial der Möglichkeiten. Beispiel mein TCP/IP-Artikel: Dieser Neuseeländer hatte seinerzeit ein TSR (Terminate and Stay Resident)-Programm geschrieben, welches Waterloo TCP in ein entsprechendes API einpackt. Dank CALL INTERRUPT kann ich dieses API nun ohne Probleme auch von QB aus voll nutzen.
Hinweis: API = Application Programming Interface = Schnittstelle, die der Hersteller eines Betriebssystems oder Erweiterung zur Verfügung stellt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|