5 Ağustos 2020 Çarşamba

QuickBasic - 21: Fare (mouse) kullanımı-2

Yayınlama: 5 Ağustos 2020

Fare konumunu değiştirme

Çoğunlukla fare konumunu kullanıcı fareyi hareket ettirerek değiştirir ancak gerekirse kodlarla da farenin konumunu değiştirilebilir.
Bu işlem için kesinti çağrılmadan önce yazmaçlara aşağıdaki değerler aktarılır. Sonra kesinti çağrılır.
AX = &H4
CX = Farenin X konumu
DX = Farenin Y konumu
inreg.ax = &H4
inreg.cx = 100 'fare X konumu
inreg.dx = 120 'fare Y konumu
CALL INTERRUPT(&H33, inreg, outreg)
Örnek 1:
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z
CONST goster = 1, gizle = 2
CLS
DIM SHARED inreg AS RegType, outreg AS RegType
inreg.ax = &H0
Kesinti
IF outreg.ax = &H0 THEN
	PRINT "Fare yok ya da kurulu değil!": END
END IF
CLS
FareIkonu goster
FOR satir = 4 TO 20 STEP 4
	FOR Sutun = 20 TO 60 STEP 20
		LOCATE 1, 1: COLOR 7
		PRINT USING "Fare konumu: Satır:## Sütun:##"; satir; Sutun
		LOCATE satir, Sutun - 2: COLOR 10: PRINT "->"
		x = (Sutun - 1) * 8
		y = (satir - 1) * 8
		FareKonumu x, y
		SLEEP 1
	NEXT
NEXT

SUB FareIkonu (durum%)
	inreg.ax = durum%
	Kesinti
END SUB

SUB FareKonumu (x%, y%)
	inreg.ax = &H4
	inreg.cx = x%
	inreg.dx = y%
	Kesinti
END SUB

SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB
Örnek 2:
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z
CLS
CONST goster = 1, gizle = 2
CONST pi# = 3.1415926535#
DIM SHARED inreg AS RegType, outreg AS RegType
inreg.ax = &H0
Kesinti
IF outreg.ax = &H0 THEN
	PRINT "Fare yok ya da kurulu değil!": END
END IF
SCREEN 12
COLOR 12
FareIkonu goster
FOR n = 0 TO 360 STEP 60
	radyan# = n * pi# / 180
	x = 320 + SIN(radyan#) * 180
	y = 220 + COS(radyan#) * 180
	IF n = 0 THEN r = 0 ELSE r = 10
	FareKonumu x, y
	FareIkonu gizle
	LINE -(x, y), r
	FareIkonu goster
	SLEEP 1
NEXT
y$ = "ALTIGEN"
FOR n = 37 TO 44
	FareKonumu n * 8, 225
	LOCATE 14, n: PRINT MID$(y$, n - 36, 1)
	SLEEP 1
NEXT

SUB FareIkonu (durum%)
	inreg.ax = durum%
	Kesinti
END SUB

SUB FareKonumu (x%, y%)
	inreg.ax = &H4
	inreg.cx = x%
	inreg.dx = y%
	Kesinti
END SUB

SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB

Fare Sınırlarını belirleme

Normalde fare ile ekranın her bir noktasına erişebiliriz. Yani farenin sınırları ekranın kenarlarıdır ancak kodlama ile fare sınırları belirlenip farenin ekrandaki kullanım alanı kısıtlanabilir.
Kısıtlama, ekranın X ve Y koordinatının minumum ve maksimum değerleri verilerek yapılır.
X ve Y konum değerlerini belirlemek için iki ayrı kesinti çağırmak gerekir.

X konumu için yazmaçlara aşağıdaki değerler aktarılır. Sonra kesinti çağrılır.
AX = &H7
CX = Konum sınırı x1 değeri
DX = Konum sınırı x2 değeri

Y konumu için yazmaçlara aşağıdaki değerler aktarılır. Sonra kesinti çağrılır.
AX = &H8
CX = Konum sınırı y1 değeri
DX = Konum sınırı y2 değeri
inreg.ax = &H7
inreg.cx = 50'x1
inreg.dx = 400'x2
CALL INTERRUPT(&H33, inreg, outreg)
inreg.ax = &H8
inreg.cx = 50'y1
inreg.dx = 200'y2
CALL INTERRUPT(&H33, inreg, outreg)
Örnek:
' Fare konum sınırlarını ayarla
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z
DIM SHARED FareX, FareY
CLS
CONST goster = 1, gizle = 2, Sol = 1
DIM SHARED inreg AS RegType, outreg AS RegType
inreg.ax = &H0
Kesinti
IF outreg.ax = &H0 THEN
	PRINT "Fare yok ya da kurulu değil!": END
END IF
SCREEN 12
COLOR 12
x1 = 50: y1 = 50 'Fare sınırı sol üst köşe
x2 = 400: y2 = 200 'Fare sınırı sağ alt köşe
LINE (x1 - 1, y1 - 1)-(x2 + 1, y2 + 1), 14, B
FareSINIRI x1, y1, x2, y2 'Fare sınırlarını belirle
FareIkonu goster
DO
	FareXYal 'Fare koordinatını al
	tus = outreg.bx 'Fare tuş bilgisi
	IF tus = Sol THEN 'sol tuş basılı ise
		FareIkonu gizle
		LINE (px, py)-(FareX, FareY), 10
		FareIkonu goster
	END IF
	px = FareX: py = FareY 'Fare önceki konumu
LOOP UNTIL INKEY$ = CHR$(27) 'ESC: Çıkış

SUB FareIkonu (durum%)
	inreg.ax = durum%
	Kesinti
END SUB

DEFINT A-Z
SUB FareSINIRI (x1, y1, x2, y2)
	inreg.ax = &H7
	inreg.cx = x1
	inreg.dx = x2
	Kesinti
	inreg.ax = &H8
	inreg.cx = y1
	inreg.dx = y2
	Kesinti
END SUB

SUB FareXYal
	inreg.ax = &H3
	Kesinti
	FareX = outreg.cx
	FareY = outreg.dx
END SUB

DEFSNG A-Z
SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB

Fare hızını ayarlama

Fareyi zeminde kaydırdığımızda ekranda kaç karakter ya da kaç piksel ilerleyeceğini fare hız ayarı ile yapılabilir.
Yazmaçlara aktarılacak değerler:
AX = &HF
CX = Yatayda fare hızı
DX = Dikeyde fare hızı
Fare hızı varsayılan değeri CX=8 ve DX=16 'dır.
CX ve DX yazmacına aktarılacak hız değeri hesaplanırken aşağıdaki formül kullanılır.
Metin ekranda: 200 / farenin zemin üzerinde 1 inç(2.54 cm) hareketinde ekranda kaç karakter ilerleyeceği
Örneğin: 200 / 25 karakter = 8
Grafik ekranda: 25 * farenin 1 inç hareketinde ekranda kaç piksel ilerleyeceği
Örneğin: 25 * 200 piksel = 8

Örnek:
' Fare hızını ayarla
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z
CLS
DIM SHARED inreg AS RegType, outreg AS RegType
SCREEN 12
inreg.ax = &H1 'fare göster
Kesinti
FOR hiz = 0 TO 80 STEP 8
	LOCATE 1, 1: PRINT "Fare Hız değeri:"; hiz
	inreg.ax = &HF
	inreg.cx = hiz
	inreg.dx = hiz
	Kesinti
	SLEEP 2
NEXT

SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB

Fare hassasiyetini ayarlama

Farenin ekrandaki piksel başına fare koordinatlarının oranını ayarlayarak fare hassasiyetini ayarlar.
Fare hızını ayarlamaya benzer bir etki oluşturur.
Kesintiden önce yazmaçlara aktarılacak değerler:
AX = &H1A
BX = Yatayda fare hassasiyeti
CX = Dikeyde fare hassasiyeti
DX = Çift hıza çıkmak için eşik değeri
Fare eşik hızına ulaştığında fare hızı iki katına çıkar (Bu değer AX=&H13 ve DX ile de ayarlanabilir)

Örnek:
' Fare hassasiyetini ayarla
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z
CLS
DIM SHARED inreg AS RegType, outreg AS RegType
SCREEN 12
inreg.ax = &H1 'fare göster
Kesinti
inreg.ax = &H1A
inreg.bx = 20 'Yatay
inreg.cx = 40 'Dikey
inreg.dx = 30 'Eşik
Kesinti
SLEEP

SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB


Önceki Bölüm: 20: Fare (mouse) kullanımı-1 Sonraki Bölüm: 22: Fare (mouse) kullanımı-3

Hiç yorum yok:

Yorum Gönder