Déplacement d'un réctangle rouge a l'aide de la souris

Contenu du snippet

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 .

A voir également

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.