Accueil > > > CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS
CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS
Information sur la source
Description
Les exemples de tracés de courbes ne sont pas très fréquents en assembleur, aussi peut être que ce code pourra aider les débutants. La création de la dialogbox a été reprise d'une source de Bombela (et d'autres), j'y ai rajouté quelques fonctions graphiques à commencer par la création d'un hdc. Les fonctions incluses comprennent: -création du hdc -création de brosses, de traits -création de rectangles -création d'axes, de courbes -affichage d'une légende Le programme utilise quelques instructions en virgule flottante (ce qui était nouveau pour moi)dont des conversions
Source
- ;nasmw -fobj courbe.asm pour compiler avec Nasm
- ;alink -oPE courbe.obj pour linker avec alink (pas de lib necessaire ici)
-
-
-
-
- ;déclaration des api à importer
-
- EXTERN ExitProcess
- import ExitProcess kernel32.dll
- EXTERN CreateWindowExA
- import CreateWindowExA user32.dll
- extern GetModuleHandleA
- import GetModuleHandleA kernel32.dll
- extern GetCommandLineA
- import GetCommandLineA kernel32.dll
- EXTERN RegisterClassExA
- import RegisterClassExA user32.dll
- EXTERN ShowWindow
- import ShowWindow user32.dll
- EXTERN LoadIconA
- import LoadIconA user32.dll
- EXTERN LoadCursorA
- import LoadCursorA user32.dll
- EXTERN DefWindowProcA
- import DefWindowProcA user32.dll
- EXTERN PostQuitMessage
- import PostQuitMessage user32.dll
- EXTERN TranslateMessage
- import TranslateMessage user32.dll
- EXTERN DispatchMessageA
- import DispatchMessageA user32.dll
- EXTERN GetMessageA
- import GetMessageA user32.dll
- EXTERN PostMessageA
- import PostMessageA user32.dll
- EXTERN BeginPaint
- import BeginPaint user32.dll
- EXTERN CreateFontIndirectA
- import CreateFontIndirectA gdi32.dll
- EXTERN DeleteObject
- import DeleteObject gdi32.dll
- EXTERN Rectangle
- import Rectangle gdi32.dll
- EXTERN SetPixel
- import SetPixel gdi32.dll
- EXTERN CreateSolidBrush
- import CreateSolidBrush gdi32.dll
- EXTERN CreatePen
- import CreatePen gdi32.dll
- EXTERN SelectObject
- import SelectObject gdi32.dll
- EXTERN DeleteObject
- import DeleteObject gdi32.dll
- EXTERN MoveToEx
- import MoveToEx gdi32.dll
- EXTERN LineTo
- import LineTo gdi32.dll
- EXTERN SetTextColor
- import SetTextColor gdi32.dll
- EXTERN TextOutA
- import TextOutA gdi32.dll
-
-
- ;définition des constantes utilisées
-
- %define NULL 0
- %define SW_SHOW 5
- %define CS_HREDRAW 2
- %define CS_VREDRAW 1
- %define IDC_ARROW 0x00007F00
- %define COLOR_BTNFACE 0x0000000F
- %define WS_TILEDWINDOW 0x00CF0000
- %define WS_EX_LEFT 0
- %define WM_CREATE 0x00000001
- %define WM_DESTROY 0x00000002
- %define TRUE 0x00000001
- %define WM_SETFONT 0x00000030
- %define WM_QUIT 0x00000012
- %define WM_SETFONT 0x00000030
- %define WM_SETFONT 0x00000030
- %define BS_SOLID 0
- %define PS_SOLID 0
- %define WM_PAINT 0x0000000F
- %define IDI_WINLOGO 0x00007F05
- %define IDC_HAND 0x00007F89
- %define COLOR_ACTIVECAPTION 0x00000002
-
-
- ;définition des structures
-
- struc WNDCLASSEX
- .cbSize resd 1
- .style resd 1
- .lpfnWndProc resd 1
- .cbClsExtra resd 1
- .cbWndExtra resd 1
- .hInstance resd 1
- .hIcon resd 1
- .hCursor resd 1
- .hbrBackground resd 1
- .lpszMenuName resd 1
- .lpszClassName resd 1
- .hIconSm resd 1
- ENDSTRUC
-
- struc MSG
- .hwnd resd 1
- .message resd 1
- .wParam resd 1
- .lParam resd 1
- .time resd 1
- .pt resd 1
- ENDSTRUC
-
- struc PAINTSTRUCT
- .hdc resd 1
- .fErase resd 1
- .rcPaint.left resd 1
- .rcPaint.top resd 1
- .rcPaint.right resd 1
- .rcPaint.bottom resd 1
- .fRestore resd 1
- .fIncUpdate resd 1
- .rgbReserved resb 32
- ENDSTRUC
-
- struc POINT
- .x resd 1
- .y resd 1
- ENDSTRUC
-
-
- ;il est possible de s'affranchir de ces déclarations en incluant les librairies ad-hoc
-
-
-
-
-
-
- SECTION CODE USE32 CLASS=CODE
-
- ..start:
-
-
- push dword NULL
- call [GetModuleHandleA]
- mov dword [Instance], eax
-
- Call [GetCommandLineA]
- mov dword [CommandLine], eax
-
- push dword SW_SHOW
- push dword eax
- push dword NULL
- push dword [Instance]
- call WinMain
-
- push dword eax
- call [ExitProcess]
-
-
- ;************************************************
- ;* winMain *
- ;************************************************
- %define hInstance ebp+8
- %define hPrevInstance ebp+12
- %define lpCmdLine ebp+16
- %define nCmdShow ebp+20
-
-
- WinMain:
- enter 48,0 ;reserve 48 octets pour la structure WNDCLASSEX
- mov [ebp-48],byte 48 ;cbsize
- mov [ebp-44],dword CS_HREDRAW | CS_VREDRAW ;style
- mov [ebp-40],dword WinProc ;Winproc
- mov [ebp-36],byte 0 ;cbClsExtra
- mov [ebp-32],byte 0 ;cbWndExtra
- mov eax,dword [Instance] ;hInstance
- mov [ebp-28],eax
- push dword IDI_WINLOGO
- push dword NULL
- call [LoadIconA]
- mov [ebp-24],eax ;hIcon
- mov [ebp-4],eax ;hIconSm
- push dword IDC_HAND
- push dword NULL
- call [LoadCursorA]
- mov [ebp-20],eax ;hCursor
- mov [ebp-16],dword COLOR_ACTIVECAPTION ;hbrBackground
- mov [ebp-12],dword NULL ;lpszMenuName
- mov [ebp-8],dword ClassName ;lpszClassName
- push esp ;pointeur sur la structure WNDCLASSEX (dans la pile)
- call [RegisterClassExA]
-
- cmp eax,0
- jne .RegisterOk
-
- mov eax, 1
- jmp Fin
-
- .RegisterOk
- mov dword [Atom], eax
- push dword NULL
- mov eax, dword [hInstance]
- push dword eax
- push dword NULL
- push dword NULL
- push dword 768 ; Hauteur fenêtre
- push dword 1024 ; Largeur fenêtre
- push dword 0 ; Haut
- push dword 0 ; Gauche
- push dword WS_TILEDWINDOW
- push dword WindowName
- push dword ClassName
- push dword WS_EX_LEFT
- call [CreateWindowExA]
-
- cmp eax , 0
- jne .CreateWindowOk
-
- mov eax, 2
- jmp Fin
-
- .CreateWindowOk
-
- mov dword [WindowHandle], eax
-
- push dword SW_SHOW
- push dword [WindowHandle]
- call [ShowWindow]
-
-
- .BoucleMessages
-
- push dword 0
- push dword 0
- push dword [WindowHandle]
- push dword Msg
- call [GetMessageA]
-
- cmp eax, WM_QUIT
- je .FinBoucle
-
- cmp eax, -1
- jne .GetMEssageOk
-
- mov eax, 3
- jmp Fin
-
-
- .GetMEssageOk
-
- push dword Msg
- call [TranslateMessage]
- push dword Msg
- call [DispatchMessageA]
- jmp .BoucleMessages
-
- .FinBoucle
- mov eax, dword [Msg+MSG.wParam]
-
- Fin:
- leave
- ret 16
-
- ;*********************************************
- ;* WindowProc *
- ;*********************************************
- %define hwnd ebp+8
- %define uMsg ebp+12
- %define wParam ebp+16
- %define lParam ebp+20
-
- WinProc:
-
- enter 0,0
- mov eax,[uMsg]
- cmp eax,WM_CREATE
- je near .Create
- cmp eax,WM_DESTROY
- je near .Destroy
- cmp eax,WM_PAINT
- je .Paint
-
- .Defaut
- push dword [lParam]
- push dword [wParam]
- push dword [uMsg]]
- push dword [hwnd]
- call [DefWindowProcA]
-
- .Fin
- leave
- ret 16
-
- .Create ;**************************************
- push dword FontStandard
- call [CreateFontIndirectA]
- mov dword [hFontStandard], eax
-
- jmp .Fin
-
- .Destroy ;*************************************
- push dword [hFontStandard]
- call [DeleteObject]
- jmp .Fin
-
-
- .Paint ;début de la partie graphique______________________________________________________________________________________
-
- push dword mystruc
- push dword [WindowHandle]
- call [BeginPaint] ;créé un handle de contexte (hdc)
- mov [mystruc+PAINTSTRUCT.hdc],eax
-
- push dword [couleurbrosse] ;définit la nouvelle couleur de la brosse
- call [CreateSolidBrush]
- mov [hbrosse],eax ;sauvegarde le handle correspondant
-
- push eax
- push dword [mystruc+PAINTSTRUCT.hdc]
- call [SelectObject] ;selectionne la nouvelle brosse, retourne le handle de l'ancienne
- mov [hbrosseanc],eax
-
- push dword 684
- push dword 812
- push dword 84
- push dword 100
- push dword [mystruc+PAINTSTRUCT.hdc]
- call [Rectangle] ;dessine un rectangle avec la couleur de remplissage de la brosse (rouge)
-
- push dword[hbrosseanc]
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [SelectObject] ;revient à l'ancienne brosse
-
- push dword[hbrosse]
- call [DeleteObject] ;suprime la brosse devenue inutile
-
- push dword 128
- push dword 150
- push dword 640
- push dword 756
- push dword [mystruc+PAINTSTRUCT.hdc]
- call [Rectangle] ;dessine un autre rectangle (couleur par défaut - blanc)
-
- push dword 0
- push dword 3
- push dword PS_SOLID
- call [CreatePen] ;définit un nouveau trait (pour les axes)
- mov [hpen],eax
-
- push eax
- push dword [mystruc+PAINTSTRUCT.hdc]
- call [SelectObject] ;sélectionne ce dernier, retourne le handle de l'ancien
- mov [hpenanc],eax
-
- ; axe des abscisses
- push dword NULL
- push dword 384
- push dword 150
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [MoveToEx] ;définit le point de départ de la ligne à tracer
- push dword 384
- push dword 756
- push dword[mystruc+PAINTSTRUCT.hdc] ;définit le point d'arrivée de la ligne
- call [LineTo]
-
- ; axe des ordonnées
- push dword NULL
- push dword 640
- push dword 200
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [MoveToEx] ;définit le point de départ de la ligne à tracer
- push dword 128
- push dword 200
- push dword[mystruc+PAINTSTRUCT.hdc] ;définit le point d'arrivée de la ligne
- call [LineTo]
-
- push dword [couleurpen]
- push dword [largeurpen]
- push dword PS_SOLID
- call [CreatePen] ;définit un nouveau trait (bleu)
- mov [hpen],eax
-
- push eax
- push dword [mystruc+PAINTSTRUCT.hdc]
- call [SelectObject] ;sélectionne ce dernier, retourne le handle de l'ancien
- mov [hpenanc],eax
-
- ; tracé de la courbe
-
- push dword NULL
- mov eax,384
- mov [y],eax
- push eax
- mov eax,200
- mov [x],eax
- push eax
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [MoveToEx] ;définit le point de départ de la ligne à tracer
- mov ecx,512
-
- boucle push ecx ;à sauvegarder car utilisé par windows
- inc dword [x]
- fild dword[x] ;convertit la valeur entière en flottant
- fsub dword[xo] ;calcule à partir de l'origine (soustraction flottante)
- fmul dword [pi]
- fdiv dword[f]
- fsin
- fmul dword[g] ;fonction=g*sin(pi*(x-xo)/f)
- fchs
- fadd dword [yo] ;inverse le sens et décale (origine écran en haut)
- fistp dword[y] ;reconvertit en entier (et vide la pile)
- push dword [y]
- push dword [x]
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [LineTo] ;définit le point d'arrivée de la ligne
- pop ecx
- loop boucle
-
- ; légende
- push dword 0x00808000
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [SetTextColor] ;définit la couleur du texte
-
- push dword 8 ;nombre de caractères du texte
- push dword texte
- push dword 200
- push dword 600
- push dword[mystruc+PAINTSTRUCT.hdc]
- call [TextOutA] ;affiche le texte en x=600 y=200
- leave
- ret 16
- ;fin de la partie graphique_____________________________________________________
-
-
-
- ; Procedures et fonctions secondaires
- ;_______________________________________________
-
- ;Procedure qui assigne une font standard à un contrôle
- ; Param : Handle du contrôle dans eax
-
- SetFontStandard:
- push dword TRUE
- push dword [hFontStandard]
- push dword WM_SETFONT
- push dword eax
- call [PostMessageA]
- ret
-
- ;_______________________________________________
-
- SECTION DATA USE32 CLASS=DATA
-
-
- Atom resd 1
- WindowHandle resd 1
- Msg resd 6
-
- Instance resd 1
- CommandLine resd 1
-
- FontStandard dd 10
- resd 6
- db "MS sans Serif",0
-
- hFontStandard resd 1
- ClassName db "WindowClass01",0
- WindowName db "Exemple de graphisme", 0
-
- mystruc resd 16
- couleurbrosse dd 0x000000ff ;rouge
- hbrosse resd 1
- hbrosseanc resd 1
- couleurpen dd 0x00ff0000 ;bleu
- largeurpen dd 1
- hpen resd 1
- hpenanc resd 1
-
- pi dd 3.1415926535 ;nota il est possible d'utiliser l'instruction fldpi qui charge cette constante
- f dd 256. ;le point signifie virgule flottante
- g dd 200.
-
- x resd 1
- y resd 1
- texte db "y=sin(x)"
- var resd 1
- xo dd 200.
- yo dd 384.
;nasmw -fobj courbe.asm pour compiler avec Nasm
;alink -oPE courbe.obj pour linker avec alink (pas de lib necessaire ici)
;déclaration des api à importer
EXTERN ExitProcess
import ExitProcess kernel32.dll
EXTERN CreateWindowExA
import CreateWindowExA user32.dll
extern GetModuleHandleA
import GetModuleHandleA kernel32.dll
extern GetCommandLineA
import GetCommandLineA kernel32.dll
EXTERN RegisterClassExA
import RegisterClassExA user32.dll
EXTERN ShowWindow
import ShowWindow user32.dll
EXTERN LoadIconA
import LoadIconA user32.dll
EXTERN LoadCursorA
import LoadCursorA user32.dll
EXTERN DefWindowProcA
import DefWindowProcA user32.dll
EXTERN PostQuitMessage
import PostQuitMessage user32.dll
EXTERN TranslateMessage
import TranslateMessage user32.dll
EXTERN DispatchMessageA
import DispatchMessageA user32.dll
EXTERN GetMessageA
import GetMessageA user32.dll
EXTERN PostMessageA
import PostMessageA user32.dll
EXTERN BeginPaint
import BeginPaint user32.dll
EXTERN CreateFontIndirectA
import CreateFontIndirectA gdi32.dll
EXTERN DeleteObject
import DeleteObject gdi32.dll
EXTERN Rectangle
import Rectangle gdi32.dll
EXTERN SetPixel
import SetPixel gdi32.dll
EXTERN CreateSolidBrush
import CreateSolidBrush gdi32.dll
EXTERN CreatePen
import CreatePen gdi32.dll
EXTERN SelectObject
import SelectObject gdi32.dll
EXTERN DeleteObject
import DeleteObject gdi32.dll
EXTERN MoveToEx
import MoveToEx gdi32.dll
EXTERN LineTo
import LineTo gdi32.dll
EXTERN SetTextColor
import SetTextColor gdi32.dll
EXTERN TextOutA
import TextOutA gdi32.dll
;définition des constantes utilisées
%define NULL 0
%define SW_SHOW 5
%define CS_HREDRAW 2
%define CS_VREDRAW 1
%define IDC_ARROW 0x00007F00
%define COLOR_BTNFACE 0x0000000F
%define WS_TILEDWINDOW 0x00CF0000
%define WS_EX_LEFT 0
%define WM_CREATE 0x00000001
%define WM_DESTROY 0x00000002
%define TRUE 0x00000001
%define WM_SETFONT 0x00000030
%define WM_QUIT 0x00000012
%define WM_SETFONT 0x00000030
%define WM_SETFONT 0x00000030
%define BS_SOLID 0
%define PS_SOLID 0
%define WM_PAINT 0x0000000F
%define IDI_WINLOGO 0x00007F05
%define IDC_HAND 0x00007F89
%define COLOR_ACTIVECAPTION 0x00000002
;définition des structures
struc WNDCLASSEX
.cbSize resd 1
.style resd 1
.lpfnWndProc resd 1
.cbClsExtra resd 1
.cbWndExtra resd 1
.hInstance resd 1
.hIcon resd 1
.hCursor resd 1
.hbrBackground resd 1
.lpszMenuName resd 1
.lpszClassName resd 1
.hIconSm resd 1
ENDSTRUC
struc MSG
.hwnd resd 1
.message resd 1
.wParam resd 1
.lParam resd 1
.time resd 1
.pt resd 1
ENDSTRUC
struc PAINTSTRUCT
.hdc resd 1
.fErase resd 1
.rcPaint.left resd 1
.rcPaint.top resd 1
.rcPaint.right resd 1
.rcPaint.bottom resd 1
.fRestore resd 1
.fIncUpdate resd 1
.rgbReserved resb 32
ENDSTRUC
struc POINT
.x resd 1
.y resd 1
ENDSTRUC
;il est possible de s'affranchir de ces déclarations en incluant les librairies ad-hoc
SECTION CODE USE32 CLASS=CODE
..start:
push dword NULL
call [GetModuleHandleA]
mov dword [Instance], eax
Call [GetCommandLineA]
mov dword [CommandLine], eax
push dword SW_SHOW
push dword eax
push dword NULL
push dword [Instance]
call WinMain
push dword eax
call [ExitProcess]
;************************************************
;* winMain *
;************************************************
%define hInstance ebp+8
%define hPrevInstance ebp+12
%define lpCmdLine ebp+16
%define nCmdShow ebp+20
WinMain:
enter 48,0 ;reserve 48 octets pour la structure WNDCLASSEX
mov [ebp-48],byte 48 ;cbsize
mov [ebp-44],dword CS_HREDRAW | CS_VREDRAW ;style
mov [ebp-40],dword WinProc ;Winproc
mov [ebp-36],byte 0 ;cbClsExtra
mov [ebp-32],byte 0 ;cbWndExtra
mov eax,dword [Instance] ;hInstance
mov [ebp-28],eax
push dword IDI_WINLOGO
push dword NULL
call [LoadIconA]
mov [ebp-24],eax ;hIcon
mov [ebp-4],eax ;hIconSm
push dword IDC_HAND
push dword NULL
call [LoadCursorA]
mov [ebp-20],eax ;hCursor
mov [ebp-16],dword COLOR_ACTIVECAPTION ;hbrBackground
mov [ebp-12],dword NULL ;lpszMenuName
mov [ebp-8],dword ClassName ;lpszClassName
push esp ;pointeur sur la structure WNDCLASSEX (dans la pile)
call [RegisterClassExA]
cmp eax,0
jne .RegisterOk
mov eax, 1
jmp Fin
.RegisterOk
mov dword [Atom], eax
push dword NULL
mov eax, dword [hInstance]
push dword eax
push dword NULL
push dword NULL
push dword 768 ; Hauteur fenêtre
push dword 1024 ; Largeur fenêtre
push dword 0 ; Haut
push dword 0 ; Gauche
push dword WS_TILEDWINDOW
push dword WindowName
push dword ClassName
push dword WS_EX_LEFT
call [CreateWindowExA]
cmp eax , 0
jne .CreateWindowOk
mov eax, 2
jmp Fin
.CreateWindowOk
mov dword [WindowHandle], eax
push dword SW_SHOW
push dword [WindowHandle]
call [ShowWindow]
.BoucleMessages
push dword 0
push dword 0
push dword [WindowHandle]
push dword Msg
call [GetMessageA]
cmp eax, WM_QUIT
je .FinBoucle
cmp eax, -1
jne .GetMEssageOk
mov eax, 3
jmp Fin
.GetMEssageOk
push dword Msg
call [TranslateMessage]
push dword Msg
call [DispatchMessageA]
jmp .BoucleMessages
.FinBoucle
mov eax, dword [Msg+MSG.wParam]
Fin:
leave
ret 16
;*********************************************
;* WindowProc *
;*********************************************
%define hwnd ebp+8
%define uMsg ebp+12
%define wParam ebp+16
%define lParam ebp+20
WinProc:
enter 0,0
mov eax,[uMsg]
cmp eax,WM_CREATE
je near .Create
cmp eax,WM_DESTROY
je near .Destroy
cmp eax,WM_PAINT
je .Paint
.Defaut
push dword [lParam]
push dword [wParam]
push dword [uMsg]]
push dword [hwnd]
call [DefWindowProcA]
.Fin
leave
ret 16
.Create ;**************************************
push dword FontStandard
call [CreateFontIndirectA]
mov dword [hFontStandard], eax
jmp .Fin
.Destroy ;*************************************
push dword [hFontStandard]
call [DeleteObject]
jmp .Fin
.Paint ;début de la partie graphique______________________________________________________________________________________
push dword mystruc
push dword [WindowHandle]
call [BeginPaint] ;créé un handle de contexte (hdc)
mov [mystruc+PAINTSTRUCT.hdc],eax
push dword [couleurbrosse] ;définit la nouvelle couleur de la brosse
call [CreateSolidBrush]
mov [hbrosse],eax ;sauvegarde le handle correspondant
push eax
push dword [mystruc+PAINTSTRUCT.hdc]
call [SelectObject] ;selectionne la nouvelle brosse, retourne le handle de l'ancienne
mov [hbrosseanc],eax
push dword 684
push dword 812
push dword 84
push dword 100
push dword [mystruc+PAINTSTRUCT.hdc]
call [Rectangle] ;dessine un rectangle avec la couleur de remplissage de la brosse (rouge)
push dword[hbrosseanc]
push dword[mystruc+PAINTSTRUCT.hdc]
call [SelectObject] ;revient à l'ancienne brosse
push dword[hbrosse]
call [DeleteObject] ;suprime la brosse devenue inutile
push dword 128
push dword 150
push dword 640
push dword 756
push dword [mystruc+PAINTSTRUCT.hdc]
call [Rectangle] ;dessine un autre rectangle (couleur par défaut - blanc)
push dword 0
push dword 3
push dword PS_SOLID
call [CreatePen] ;définit un nouveau trait (pour les axes)
mov [hpen],eax
push eax
push dword [mystruc+PAINTSTRUCT.hdc]
call [SelectObject] ;sélectionne ce dernier, retourne le handle de l'ancien
mov [hpenanc],eax
; axe des abscisses
push dword NULL
push dword 384
push dword 150
push dword[mystruc+PAINTSTRUCT.hdc]
call [MoveToEx] ;définit le point de départ de la ligne à tracer
push dword 384
push dword 756
push dword[mystruc+PAINTSTRUCT.hdc] ;définit le point d'arrivée de la ligne
call [LineTo]
; axe des ordonnées
push dword NULL
push dword 640
push dword 200
push dword[mystruc+PAINTSTRUCT.hdc]
call [MoveToEx] ;définit le point de départ de la ligne à tracer
push dword 128
push dword 200
push dword[mystruc+PAINTSTRUCT.hdc] ;définit le point d'arrivée de la ligne
call [LineTo]
push dword [couleurpen]
push dword [largeurpen]
push dword PS_SOLID
call [CreatePen] ;définit un nouveau trait (bleu)
mov [hpen],eax
push eax
push dword [mystruc+PAINTSTRUCT.hdc]
call [SelectObject] ;sélectionne ce dernier, retourne le handle de l'ancien
mov [hpenanc],eax
; tracé de la courbe
push dword NULL
mov eax,384
mov [y],eax
push eax
mov eax,200
mov [x],eax
push eax
push dword[mystruc+PAINTSTRUCT.hdc]
call [MoveToEx] ;définit le point de départ de la ligne à tracer
mov ecx,512
boucle push ecx ;à sauvegarder car utilisé par windows
inc dword [x]
fild dword[x] ;convertit la valeur entière en flottant
fsub dword[xo] ;calcule à partir de l'origine (soustraction flottante)
fmul dword [pi]
fdiv dword[f]
fsin
fmul dword[g] ;fonction=g*sin(pi*(x-xo)/f)
fchs
fadd dword [yo] ;inverse le sens et décale (origine écran en haut)
fistp dword[y] ;reconvertit en entier (et vide la pile)
push dword [y]
push dword [x]
push dword[mystruc+PAINTSTRUCT.hdc]
call [LineTo] ;définit le point d'arrivée de la ligne
pop ecx
loop boucle
; légende
push dword 0x00808000
push dword[mystruc+PAINTSTRUCT.hdc]
call [SetTextColor] ;définit la couleur du texte
push dword 8 ;nombre de caractères du texte
push dword texte
push dword 200
push dword 600
push dword[mystruc+PAINTSTRUCT.hdc]
call [TextOutA] ;affiche le texte en x=600 y=200
leave
ret 16
;fin de la partie graphique_____________________________________________________
; Procedures et fonctions secondaires
;_______________________________________________
;Procedure qui assigne une font standard à un contrôle
; Param : Handle du contrôle dans eax
SetFontStandard:
push dword TRUE
push dword [hFontStandard]
push dword WM_SETFONT
push dword eax
call [PostMessageA]
ret
;_______________________________________________
SECTION DATA USE32 CLASS=DATA
Atom resd 1
WindowHandle resd 1
Msg resd 6
Instance resd 1
CommandLine resd 1
FontStandard dd 10
resd 6
db "MS sans Serif",0
hFontStandard resd 1
ClassName db "WindowClass01",0
WindowName db "Exemple de graphisme", 0
mystruc resd 16
couleurbrosse dd 0x000000ff ;rouge
hbrosse resd 1
hbrosseanc resd 1
couleurpen dd 0x00ff0000 ;bleu
largeurpen dd 1
hpen resd 1
hpenanc resd 1
pi dd 3.1415926535 ;nota il est possible d'utiliser l'instruction fldpi qui charge cette constante
f dd 256. ;le point signifie virgule flottante
g dd 200.
x resd 1
y resd 1
texte db "y=sin(x)"
var resd 1
xo dd 200.
yo dd 384.
Conclusion
Ce type de code pourra être étoffé pour intégrer les possibilités de la DialogBox (saisies au clavier etc).
Historique
- 09 novembre 2005 12:09:05 :
- Merci à BRUNEWS qui m'a mis sur la voie pour que le graphique soit redessiné quand nécessaire.
Nota: J'ai supprimé la WNDCLASSEX dans les data, les paramètres sont mis sur la pile (la déclaration de la structure a été laissée à titre d'information).
Des optimisations sont très probablement nécessaires concernant le fonctionnement de la fenêtre. Si vous voyez des choses qui vous chagrinent, je suis preneur
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
curseur personalisé masm [ par Cendra ]
je cherche a mettre un curseur personalisé ( curseur.cur ) dans un de mes programmes mais j'ai du mal a utiliser l'api LoadCursorA ....on m'a parler d
Fenetre non rectangle ... [ par Cendra ]
je me demande comment faire une fenetre avec la forme que je veux ... j'ai fait ma petite recherche mais j'arrive pas faire mon programme :(voila les
comment se servir du copross graphique!?!? [ par prunkdump ]
Voilà, je voudrais savoir si quelq'un sait se servir du coprocesseur graphique ou aurait des liens sur ce sujet, car c'est complètement defferent de
api [ par knetus ]
Recherche doc api en francais.style W32ASM programmer's reference.si quelqu'un peut m'indiquer le chemin !!!!!!!!merci.
La fonction API SendMessageA [ par douja ]
Bonjour les amis J'utilise la fonction SendMessageA pour la justification à droite des mes zones de saisie avec les paramètres suivants: SendMessag
API Windows [ par cowboy ]
CowboyJ'aimerais savoir s'il existe un descriptif des commandes API pour windows en asm ( en francais si possible ) . J'aimerais trouv
interface graphique? [ par rominou ]
Debutant, j'ignore comment et avec quels outils developper une interface graphique pour du C et C++.Pourriez vous m'indiquer une solution pour apprend
Console sans API [ par vecchio56 ]
Est-il possible de coder une application en mode protégé sous Windows à un niveau suffisament bas pour pouvoir écrire du texte dans la console sans êt
nasm Vs masm [ par TRAX44 ]
Salut,je débute en asm et ai décidé d'utiliser nasm (question de principe pour une foi que l'on peut se dispenser de macrobug et de plus nasm colle pl
call API Windows [ par vecchio56 ]
Pourquoi il faut mettre absolument dword ptr avant le nom d'une fonction pour appeler une API de Windows?
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|