Affichage d'un réctangle rouge
et déplacement de ce rectangle rouge avec la souris
peut être une base d'un system de fenetrage
mode vidéo n°12 : AH=0, AL=12, INT 10h
affichage d'un pixel : AH=0Ch,
AL=couleur,
CX=X,DX=Y,
INT 10h.
pour compiler :
@echo off
tasmx /ml /m2 /q CareRouge
tlink /x /3 CareRouge
del CareRouge.obj
pause
Amenez le curseur au coté gauche du rectangle puis appuyez sur le bouton gauche et bougez
Aidez moi a l'améliorer
TODO : sortie avec touche ESCAPE
enlever les scintillements lors du déplacement
pouvoir limiter le déplacement a la limite de l'écran notamment
la largeur (x)
pouvoir le faire fonctioner dans petit os
comme par exemple sur le petit system cos2000
envoie de contenu d'un fichier a l'intérieur du rectangle
, du texe par exemple :)
enfin vous voyez ce que je veut dire :)
Ne faire bouger que par le haut du rectangle...
email: kimi1632@hotmail.com
j'attend vos commentaire et critiques .
Source / Exemple :
;
; Affichage d'un réctangle rouge
; déplacement d'un réctangle rouge a l'aide de la souris
; peut être une base d'un système de fenêtrage
;
; mode vidéo n°12 : AH=0, AL=12, INT 10h
; affichage d'un pixel : AH=0Ch, AL=couleur,CX=X,DX=Y, INT 10h
;
; Amenez le curseur au coté gauche du rectangle puis appuyez sur le
; bouton gauche et bougez
;
;***************************************************************************************
.MODEL SMALL
.STACK 200H
.586
.data
tmpCx DD ? ; position X du réctangle
tmpDx DD ? ; position Y du réctangle
wcote DD 250
hcote DD 145
ends
.CODE
begin: jmp MAIN
ShowCur proc near ; afficher le curseur souris
push eax
mov eax ,0001h
int 33h
pop eax
ret
endp
HideCur proc near ; cacher le curseur souris
push eax
mov eax , 0002h
int 33h
pop eax
ret
endp
MoveCur proc near ; déplacer le curseur souris
push eax
push ecx
push edx
mov ecx,tmpCx
mov edx,tmpDx
inc ecx
dec edx
mov eax, 0004h
int 33h
pop edx
pop ecx
pop eax
ret
endp
Readkey proc near ; attendre une clé au clavier
mov ah , 00h
int 16h
ret ; remarque : pas de pop ni de push ax !
endp
waitEscap proc near ; attendre ECHAPE
.Wait: call Readkey ; attendre une clé
cmp byte ptr eax, 11Bh ; c'est ESCAPE ?
je .end
CMP EBX,1
je position
ret
endP
clrscr proc near ; effacer l'écran
push eax
push ebx
push ecx
push edx
mov bh , 0 ; couleur (attribut) pour les lignes vides ici noir
mov ecx ,0
mov dh , 48 ; dh = coin inférieur droit ,donc dh = 25 : 0..24 nbr de lignes
mov dl , 179 ; et dl = 80 : 0..79 nbr de colonnes
mov al , 00h ; veut dire "effacer la fenêtre - au lieu de décaler c'est lignes -"
mov ah , 06h
int 10h
pop edx
pop ecx
pop ebx
pop eax
ret
endp
VGA proc near
MOV AL,12h ; VGA
SUB AH,AH ;= 0
INT 10h
ret
endp
refresh proc near ; rafraichir le dessin du réctangle
MOV AL,12 ; rouge
MOV AH,0ch ; écrire pixel
MOV BH,0 ; page 0
MOV BL,250
r1:
INC ECX
INT 10h ; vers la droite
DEC BL
JNZ r1
MOV BL,145
r2:
INC EDX
INT 10h ; vers la bas
DEC BL
JNZ r2
MOV BL,250
r3: DEC ECX
INT 10h ; vers le gauche
DEC BL
JNZ r3
MOV BL,145
r4: DEC EDX
INT 10h ; vers le haut
DEC BL
JNZ r4
ret
endp
draw0 proc near ; draw initial dessin d'un réctangle
MOV AL,12 ; rouge
MOV AH,0ch ; écrire pixel
MOV BH,0 ; page 0
MOV tmpCx, 250
MOV tmpDx, 250
MOV ECX, tmpCx
MOV EDX, tmpDx
MOV BL,250
@1: INC ECX
INT 10h ; vers la droite
DEC BL
JNZ @1
MOV BL,145
@2: INC EDX
INT 10h ; vers la bas
DEC BL
JNZ @2
MOV BL,250
@3: DEC ECX
INT 10h ; vers le gauche
DEC BL
JNZ @3
MOV BL,145
@4: DEC EDX
INT 10h ; vers le haut
DEC BL
JNZ @4
ret
endp
drawx proc near ; draw dynamique dessine un réctangle a la
; position des nouvelles coordonnés curseur.
MOV AL,12 ; rouge
MOV AH,0ch ; écrire pixel
MOV BH,0 ; page 0
MOV BL,250 ; coté
@@1:
INC ECX
INT 10h ; vers la droite
DEC BL
JNZ @@1
MOV BL,145
@@2: INC EDX
INT 10h ; vers la bas
DEC BL
JNZ @@2
MOV BL,250
@@3: DEC ECX
INT 10h ; vers le gauche
DEC BL
JNZ @@3
MOV BL,145
@@4: DEC EDX
INT 10h ; vers le haut
DEC BL
JNZ @@4
ret
endp
position proc near ; la position de la souris
isClick:
mov EAX , 0003h ; si un bouton est appuyé
int 33h
CMP EBX, 1 ; si oui,est ce que c'est le bouton gauche ;de la souris qui est appuyé ?
JNE isClick ; non,alors répéter
.width: MOV EAX,tmpCx
CMP ECX,EAX
JNLE isClick ; répéter si-non.
howMeny: ; récupérer la positon du curseur CX,DX
CMP ECX,tmpCx ; si on a bouger on rafraichie l'écran
;CMP EDX,tmpDx
JE .in
call clrscr ; effacer avec rafraichissement permanent
call refresh
.in: mov EAX , 0003h
int 33h
CMP EBX, 1 ; si oui , le bouton gauche de la souris est il appuyé ?
JE howMeny ; si oui alors répéter
call clrscr ; si non , bouton gauche relâché alors ,efacer avec tracage du caré
call drawx ; et redessiner.
call HideCur
call refresh
call ShowCur
call refresh
call refresh ; et un autre pour bien finir le dessin(enlever ça pour voir)
JMP isClick ; répéter
.out: ret
endp
MAIN:
call VGA ; mode vidéo vga AH= 12h
call clrscr ; effacer
call draw0 ; dessiner un réctangle à la position ;(tempCX , tempDX).
call ShowCur ; montrer le curseur de la souris
deplace:
call position ; CX=tempCX , DX=tempDX
;call waitEscap ; attendre une ESCAPE pour sortir , mai ca ;boucle sur position donc Alt + Tab pour sortir
.end: mov Eax, 4c00h ; fin
int 21h
ends
end begin
Conclusion :
Il est claire que ce n'est pas suffisant pour un système de base GUI
car on n'exploite pas toutes les possibilité de la carte graphique
et la rame mai c'est un début .
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.