15 Ağustos 2020 Cumartesi

QuickBasic - 22: Fare (mouse) kullanımı-3

Yayınlama: 15 Ağustos 2020
Güncelleme: 22 Ağustos 2020

Fare imleç görüntüsünü değiştirme

Varsayılan fare(mouse) imleç(cursor) görüntüsü grafik ekranda standart ok şeklinde(yandaki resim), metin(text) ekranda ise içi dolu dikdörtgen kutu karakteri(karakter kodu=219) şeklindedir.
İstenirse grafik ve/veya metin ekranda imleç görüntüsü değiştirilebilir.
İşlemler ve yazmaçlara aktarılacak değerler farklı olduğu için iki ayrı başlık altında açıklama yapılacaktır.

1) Grafik ekranda fare imleç görüntüsünü değiştirme

Yazmaçlara aktarılacak değerler:
AX = &H9
BX = Etkin nokta X değeri (Hot Spot)
CX = Etkin nokta Y değeri
DX = Görüntü bilgilerini içeren bellek adresi (64 bayt)

İmleç görüntüsü bilgileri 64 bayt uzunluğundadır. 32 baytlık 2 set halinde hazırlanır. Her set 16x16 bitlik bir desende oluşturulur. Örneğin 16 satır ve her satırda 2 baytlık(16 bit) veri.

İlk desen 32 baytlık veri AND maskesi içindir.
İkinci desen 32 baytlık veri XOR maskesi içindir.

Bu iki desen, iki grafik düzlemi oluşturur. İki grafik düzleminde oluşan grafik görüntü ekrana önce AND ile sonra onun üzerine XOR ile basılır. Böylece nihai fare imleci görüntüsü oluşur.

İlk ve ikinci desendeki 0 ve 1 bit değerlerin çakıştırılmasıyla ekranda 4 farklı durum oluşur.
00: Siyah
01: Beyaz
10: Şeffaf (Transparan)
11: Zemin zıt rengi

Etkin nokta: Fare imleç görüntüsündeki konum bilgisi için kullanılacak nokta.
X için soldan, Y için üstten kaçıncı bir olacağı belirtilir.
X=0,Y=0 imlecin sol üst köşesidir.

Örnek 1: Standart fare imleci görüntüsünü biraz değiştirerek aşağıdaki görüntüyü oluşturdum.

Büyütülmüş görüntüdür
' Fare imleç görüntüsünü değiştirme
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z: DEFSTR S: DEFLNG L
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
FOR n = 240 TO 60 STEP -30
	r = r + 1
	CIRCLE STEP(0, 0), n, r
	PAINT STEP(0, 0), r
NEXT
PAINT (10, 10), 15, 1

inreg.ax = &H1 'fareyi göster
Kesinti
FOR m = 1 TO 32
	READ StrSatir 'data satırları
	LngSayi = 0
	' 2 lik sayıyı 10 luk sayıya dönüştür
	FOR n = 16 TO 1 STEP -1
		' satırdaki karakter "." değilse ( .=0 )
		IF MID$(StrSatir, n, 1) <> "." THEN
			'Konumundaki sayı değerini hesapla ve topla
			LngSayi = LngSayi + 2 ^ (16 - n)
		END IF
	NEXT
	IF LngSayi > &H7FFF THEN LngSayi = LngSayi - &H10000
	StrImlec = StrImlec + MKI$(LngSayi)
NEXT

inreg.ax = &H9
inreg.bx = 0 ' Etkin nokta X değeri (Hot Spot)
inreg.cx = 0 ' Etkin nokta Y değeri
inreg.dx = SADD(StrImlec) ' String değişkeninin bellek adresi
Kesinti
DO: LOOP UNTIL INKEY$ = CHR$(27)

' Desenin belirgin görünmesi için
' 1 yerine X
' 0 yerine .
' kullanılmıştır

' 16x16 AND maskesi
DATA ..XXXXXXXXXXXXXX
DATA ...XXXXXXXXXXXXX
DATA ....XXXXXXXXXXXX
DATA .....XXXXXXXXXXX
DATA ......XXXXXXXXXX
DATA .......XXXXXXXXX
DATA ........XXXXXXXX
DATA .........XXXXXXX
DATA ..........XXXXXX
DATA ...........XXXXX
DATA ............XXXX
DATA .............XXX
DATA XXXX......XXXXXX
DATA XXXX......XXXXXX
DATA XXXXX......XXXXX
DATA XXXXX......XXXXX

' 16x16 XOR maskesi
DATA XX..............
DATA X.X.............
DATA X..X............
DATA X...X...........
DATA X....X..........
DATA X.....X.........
DATA X......X........
DATA X.......X.......
DATA X........X......
DATA X.........X.....
DATA X..........X....
DATA XXXX....XXXXX...
DATA ....X....X......
DATA ....X....X......
DATA .....X....X.....
DATA .....XXXXXX.....

SUB Kesinti
	CALL INTERRUPT(&H33, inreg, outreg)
END SUB
Aynı imleç görüntüsünün ters renklisi istenirse (beyaz yerine siyah, siyah yerine beyaz) yukarıdaki kodlarda XOR maskesini aşağıdaki ile değiştirin.

Büyütülmüş görüntüdür
' 16x16 XOR maskesi
DATA ................
DATA .X..............
DATA .XX.............
DATA .XXX............
DATA .XXXX...........
DATA .XXXXX..........
DATA .XXXXXX.........
DATA .XXXXXXX........
DATA .XXXXXXXX.......
DATA .XXXXXXXXX......
DATA .XXXXXXXXXX.....
DATA ....XXXX........
DATA .....XXXX.......
DATA .....XXXX.......
DATA ......XXXX......
DATA ................
Örnek 1'de fare görüntüsü için 2'lik sayı ile oluşturulan desendeki sayılar dönüştürülerek değişkene aktarıldı.

Aşağıdaki örnekte ise desen çizmeden 16'lık sayılar ile değişkene değerler aktarılır.

Örnek 2:
' Fare imleç görüntüsünü değiştirme
' ©2020 Mesut Akcan
' mesutakcan.blogspot.com
'$INCLUDE: 'qb.bi'
DEFINT A-Z: DEFSTR S: DEFLNG L
DIM SHARED inreg AS RegType, outreg AS RegType

SCREEN 12
WIDTH 80, 60
COLOR 15: PRINT "AND maskesi"
COLOR 10
FOR m = 1 TO 32
	READ lngSayi 'data verileri
	StrImlec = StrImlec + MKI$(lngSayi)
	strBinary = ""
	IF lngSayi < 0 THEN lngSayi = lngSayi + &H10000
	lngHxSayi = lngSayi
	WHILE lngSayi <> 0 'onluk sayıyı ikilik sayıya dönüştür
		IF lngSayi MOD 2 = 0 THEN strB = "." ELSE strB = "X"
		strBinary = strB + strBinary 'ikilik sayı
		lngSayi = lngSayi \ 2
	WEND
	IF m = 17 THEN COLOR 15: PRINT : PRINT "XOR maskesi": COLOR 12
	PRINT RIGHT$(STRING$(16, ".") + strBinary, 16); " ";
	PRINT RIGHT$(STRING$(4, "0") + HEX$(lngHxSayi), 4)
NEXT

inreg.ax = &H9
inreg.bx = 4 ' Etkin nokta X değeri (Hot Spot)
inreg.cx = 0 ' Etkin nokta Y değeri
inreg.dx = SADD(StrImlec) ' String değişkeninin bellek adresi
Kesinti
inreg.ax = &H1 'fareyi göster
Kesinti
DO: LOOP UNTIL INKEY$ = CHR$(27)

'İnsan eli şeklinde imleç simgesi
'AND maskesi
DATA &HF3FF,&HE1FF,&HE1FF,&HE1FF,&HE049,&HE000,&H8000,&H0000
DATA &H0000,&H0000,&H0000,&H8000,&HC001,&HE001,&HE001,&HE001
'XOR maskesi
DATA &H0000,&H0C00,&H0C00,&H0C00,&H0C00,&H0DB6,&H0DB6,&H6DB6
DATA &H6FFE,&H6FFE,&H7FFE,&H3FFE,&H1FFC,&H0FFC,&H0FFC,&H0000

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



Fare imleci için birkaç örnek: Data kodlarını Örnek 2 deki ile değiştirin.
'Aşağıdaki fare imleç görüntü kodlarının kaynağı:
'Brian Roche. FidoNet QUIK_BAS Echo
'KumSaati
DATA &HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &HFFFF,&H2004,&H2004,&H2004,&H1008,&H990,&H420,&H240
DATA &H240,&H420,&H810,&H1008,&H2084,&H2144,&H22A4,&HFFFF

'Kronometre
DATA &HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &H3000,&H63E0,&HDC18,&H1004,&H2002,&H2602,&H4301,&H4181
DATA &H40C1,&H4081,&H4081,&H2082,&H2082,&H1004,&HC18,&H3E0

'El-1
DATA &HF3FF,&HEDFF,&HEDFF,&HEC7F,&HED8F,&HEDB1,&HEDB6,&H8DB6
DATA &H6DB6,&H6FFE,&H6FFE,&H7FFE,&H7FFE,&H7FFE,&HBFFD,&HC003
DATA &HC00,&H1200,&H1200,&H1380,&H1270,&H124E,&H1249,&H7249
DATA &H9249,&H9001,&H9001,&H8001,&H8001,&H8001,&H4002,&H3FFC

'El-2
DATA &HF3FF,&HE1FF,&HE1FF,&HE07F,&HE00F,&HE001,&HE000,&H8000
DATA &H0,&H0,&H0,&H0,&H0,&H0,&H8001,&HC003
DATA &H0,&HC00,&HC00,&HC00,&HD80,&HDB0,&HDB6,&HDB6
DATA &H6DB6,&H6FFE,&H6FFE,&H7FFE,&H7FFE,&H7FFE,&H3FFC,&H0

Fare imleci oluşturma programı: fgce100.zip
Pacal, c, Fortran, Basic dilleri için imleç data kodunu kaydeder. Bedava.



Önceki Bölüm: 21: Fare (mouse) kullanımı-2 Sonraki Bölüm: 23: Fare (mouse) kullanımı-4

Hiç yorum yok:

Yorum Gönder