1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
| ; Titre : Scroll
; ==============================================================================
; Auteur : Crisanar
; E-mail : crisanar@be.tf
; IDE : MASM32 8
; ==============================================================================
; v1.1 [21.11.2004]
.386
.model flat, stdcall
option casemap: none ; Sensible à la casse
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Lib functions
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INCLUDE \masm32\include\windows.inc
INCLUDE \masm32\include\user32.inc
INCLUDE \masm32\include\kernel32.inc
INCLUDE \masm32\include\gdi32.inc
INCLUDELIB \masm32\lib\user32.lib
INCLUDELIB \masm32\lib\kernel32.lib
INCLUDELIB \masm32\lib\gdi32.lib
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Macros
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INCLUDE C:\ASM\Includes\fcts\Macros.inc
.const
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Constantes
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INCLUDE CTRLIDS.inc
IDC_TIMER EQU 10
cCRLF EQU 13,10
.data
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Données
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ScrollOffset DWORD 1
.data?
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Données non initialisées
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TimerID DWORD ?
rRect RECT <?>
rScroll RECT <?>
.code
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Code
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL ps:PAINTSTRUCT
LOCAL hbmp:HANDLE
LOCAL hdc:HDC
LOCAL chdc:HDC
SZTEXT szBanderolle,<"coucou",cCRLF,"Ca va?",cCRLF,cCRLF,"Crisanar's scrolling the text">
.IF uMsg == WM_INITDIALOG
INVOKE GetClientRect,hWnd,ADDR rRect
;----------Récupérer la taille du texte à faire défiller--------------
INVOKE GetDC,hWnd
mov hdc,eax
INVOKE DrawText,hdc,ADDR szBanderolle,SIZEOF szBanderolle -1 ,ADDR rScroll,DT_CALCRECT + DT_NOPREFIX + DT_NOCLIP + DT_CENTER + DT_TOP
INVOKE ReleaseDC,hWnd,hdc
;----------Réaranger certaines dimensions du rectangle-------------------
m2m rScroll.right,rRect.right
add rScroll.bottom,5
INVOKE SetTimer,hWnd,IDC_TIMER,35,NULL
mov TimerID,eax
.ELSEIF uMsg == WM_PAINT
INVOKE BeginPaint,hWnd,ADDR ps ; Obtenir le hdc de la fenetre
mov hdc,eax
;-------------Creer le buffer en mémoire----------------
INVOKE CreateCompatibleBitmap,hdc,rRect.right,rRect.bottom
mov hbmp,eax
INVOKE CreateCompatibleDC,hdc
mov chdc,eax
;--------Ecrire le texte dans le buffer-------------------
INVOKE SelectObject,chdc,hbmp
INVOKE SetBkMode,chdc,TRANSPARENT
INVOKE SetTextColor,chdc,White
INVOKE DrawText,chdc,ADDR szBanderolle,SIZEOF szBanderolle -1 ,ADDR rScroll,DT_CENTER + DT_TOP + DT_NOCLIP + DT_NOPREFIX
;--------Recopier le buffer sur l'ecran------------------
INVOKE BitBlt,hdc,0,0,rRect.right,rRect.bottom,chdc,0,0,SRCCOPY
;--------Supprimer les objet utilisés--------------
INVOKE DeleteDC,chdc
INVOKE DeleteObject,hbmp
INVOKE EndPaint,hWnd,ADDR ps
.ELSEIF uMsg == WM_TIMER
add rScroll.top,GETV(ScrollOffset)
add rScroll.bottom,eax
.IF SDWORD PTR rScroll.top >= GETV(rRect.bottom) ; Caster pour travailler avec des nombres signés
mov ScrollOffset,-1
.ELSE
.IF SDWORD PTR rScroll.bottom <= GETV(rRect.top)
mov ScrollOffset,1
.ENDIF
.ENDIF
INVOKE InvalidateRect,hWnd,NULL,FALSE
.ELSEIF uMsg == WM_CLOSE
.IF TimerID!=0
INVOKE KillTimer,hWnd,TimerID
.ENDIF
INVOKE EndDialog,hWnd,NULL
.ELSE
return FALSE
.ENDIF
return TRUE
DlgProc ENDP
start PROC
LOCAL hInstance:HINSTANCE
INVOKE GetModuleHandle,NULL
mov hInstance,eax
INVOKE DialogBoxParam,hInstance,IDD_DLGMAIN,NULL,ADDR DlgProc,NULL
INVOKE ExitProcess,NULL ; Terminer le programme
start ENDP
END start |
Partager