Etiketler

5 Ağustos 2020 Çarşamba

QuickBasic Kursu: Bölüm 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
' akcansoft.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:

2 Ağustos 2020 Pazar

QuickBasic Kursu: Bölüm 20: Fare (mouse) kullanımı-1

Önceki Bölüm: QuickBasic Kursu: Bölüm 19: Grafik işlemleri-7

Yayınlama: 29 Temmuz 2020
Güncelleme: 2 Ağustos 2020

Kötü haber: Qbasic ve QuickBasicde doğrudan fare(mouse) kullanmak için komut bulunmuyor.
Belkide Qbasic'in piyasaya sürüldüğü tarihlerde fare kullanımı yaygın değildi ya da fare standartları tam oturmamıştı.
İyi haber: Qbasicde DOS kesintilerini(interrupt) çalıştırmak için ve assembler kodlarını belleğe aktarıp çalıştırmak için kodlar bulunuyor. Böylece dolaylı olarak da olsa fare kullanılabiliyor.

DOS kesintisi ile fare çalıştırma

DOS işletim sistemi yapısı gereği Windows gibi çoklu görev(multitasking) özelliği yoktur. DOS, kesinti denilen bir özelliği kullanarak sahte çoklu görev işlevini yerine getirir.

DOS kesinti listesine bakıldığında çok sayıda kesinti olduğu görülecektir. Liste için: Link1, Link2
Bu yazının konusu olan ve bize gerekli olan kesinti &H33 (16'lık sayı)

Ön hazırlık

Kesinti kullanmadan önce QuickBasic'de bazı ön hazırlıklar yapmak gereklidir.
Bunlar:
1) QuickBasic editörünü komut satırından çalıştırılırken yalnızca QB.EXE ile değil
QB.EXE /L
ile çalıştırmalıyız.
Bu /L eklentisi LIB klasörü altında bulunan QB.QLB kütüphane(library) dosyasını belleğe yükler.
Bu dosya içinde fare kullanımı için bize gerekli olan alt rutinler(subroutine) bulunmaktadır.

2) &H33 kesintisini oluşturmak için INTERRUPT fonksiyonunu çağıracağız.

28 Temmuz 2020 Salı

QuickBasic Kursu: Bölüm 19: Grafik işlemleri-7

Yayınlama: 25 Temmuz 2020
Güncelleme: 28 Temmuz 2020

GET

Dosya işlemlerinde kullanılan GET komutundan farklı olarak grafik işlemlerinde kullanılan farklı bir GET komutu vardır. Kullanımları farklıdır.
Kullanımı:
GET [STEP] (x1-y1)-[STEP](x2,y2),değişkenadı[(indeks)]
Ekran üzerinde x1,y1 ile x2,y2 dikdörtgeni içinde kalan görüntü bilgisi belirtilen boyutlu değişkenadı'na aktarılır. Değişkene aktarılan görüntü PUT komutu ile ekranın istenilen konumuna basılır(aktarılır).

STEP : Göreceli koordinat kullanmak içindir. Bir önceki komutun aktif noktası 0,0 kabul edilir.
(x1,y1) : seçim alanı başlangıç köşe noktası
(x2,y2) : seçim alanı bitiş karşı köşe noktası
değişkenadı : Görüntü bilgilerinin aktarılacağı çok boyutlu değişken. Değişken boyutu görüntü bilgilerini aktaracak büyüklükte olmalıdır aksi halde GET komutu çalıştırılmaz. Illegal function call hatası verir.

Boyutun ne kadar olacağını hesaplamak için kullanılan formül Qbasic yardım'da verilmiştir.
4 + INT(((x2 - x1 + 1) * (düzlemdeki pikselin bit sayısı) + 7)/8) * düzlem * ((y2 - y1) + 1)
Ekran
Modu
Düzlemdeki pikselin
bit sayısı
Düzlem
121
211
714
814
912
1012
1111
1214
1381
Örneğin, SCREEN 2, sol üst köşe (0,0) sağ alt köşe (32,32) için değişkenin bayt cinsinden gerekli boyutu:
= 4 + INT ((33 * 1 + 7) / 8) * 1 * (33)
Sonuç = 169 bayt.
Bu 85 elemanlı INTEGER(2 bayt) bir değişken görüntüyü aktarmak için yeterli olacaktır.
INTEGER değişken yerine LONG, SINGLE veya DOUBLE değişken türü de kullanılabilir. Değişkenin türünün bellekte kapladığı bayt miktarına göre eleman sayısı değişir. Formülden çıkan sonuç değişken türü bayt miktarına bölünür.
INTEGER için Sonuç / 2
LONG için Sonuç / 4
SINGLE için Sonuç / 4
DOUBLE için için Sonuç / 8
Örnek:
'©2020 Mesut Akcan
SCREEN 1
' bayt sayısı = 4+int(((32-0+1)*2+7)/8)*1*((32-0)+1)
' bayt sayısı = 301
' integer için 301/2 = 151
' DIM a(150) AS INTEGER '0 dahil toplam 151
' long için 301/4 = 76
' DIM a(75) AS LONG
' single için 301/4 = 76
' DIM a(75) AS SINGLE
' double için 301/8 = 38
DIM a(37) AS DOUBLE

CIRCLE (16, 16), 16, 2, , , 1
PAINT STEP(0, 0), 1, 2
CIRCLE (16, 16), 10, 0, , , 1
PAINT STEP(0, 0), 2, 0
CIRCLE (12, 13), 4, 3, , , 1
PAINT STEP(0, 0), 3, 3
GET (0, 0)-(32, 32), a
PUT (40, 0), a
PUT (73, 0), a
PUT (40, 0), a, XOR

PUT

Dosya işlemlerinde kullanılan PUT komutunun grafik işlemlerinde kullanılan farklı bir kullanımı daha vardır.
Kullanımı:
PUT [STEP](x,y), değişkenadı[(indeks)], baskıyöntemi
GET komutu ile değişkene aktarılan görüntü PUT komutu ile (x,y) koordinatına basılır.
STEP : Göreceli koordinat kullanmak içindir. Bir önceki komutun aktif noktası 0,0 kabul edilir.