La boite selection de polices
Page 1 sur 1
La boite selection de polices
Pour cette boite, nous disposons de la fonction ChooseFontA qui utilise les structures CHOOSEFONT et LOGFONT.
Nous reprenons le programme de manipulation de la console pour y ajouter le choix de la police de caractères à afficher.
Il faut faire attention car des informations comme la taille se trouvent dans la structure CHOOSEFONT et d'autres comme le nom se trouverons dans la structure LOGFONT. Nous récupérons ces 2 informations dans des zones intermédiaires en mémoire puis nous les passerons à la fonction SetCurrentConsoleFontEx dans la structure CONSOLE_FONT_INFOEX.
Remarque : l'affichage dans la console n'autorise pas toutes les polices disponibles. Si la police n'est pas autorisée l'affichage se fait dans la police par défaut.
Nous reprenons le programme de manipulation de la console pour y ajouter le choix de la police de caractères à afficher.
Il faut faire attention car des informations comme la taille se trouvent dans la structure CHOOSEFONT et d'autres comme le nom se trouverons dans la structure LOGFONT. Nous récupérons ces 2 informations dans des zones intermédiaires en mémoire puis nous les passerons à la fonction SetCurrentConsoleFontEx dans la structure CONSOLE_FONT_INFOEX.
Remarque : l'affichage dans la console n'autorise pas toutes les polices disponibles. Si la police n'est pas autorisée l'affichage se fait dans la police par défaut.
- Code:
;************************************
;exemple choix de police 64 bits
;manipconsolePolice.asm
;************************************
%include "../windowsinc64.inc"
BUFFERSIZE equ 200 ; taille du buffer
;=============================================================================
section .data
;============================================================================
szTitre: db "Mon message",0
szTitreConsole: db 'Ma Console', 0
szMsgFin: db 'Fin programme!', 0
szMsg db "Très bien l'Assembleur Win64!",0
ILGMSG equ $ - szMsg ; donne la longueur du message ci dessus
;structures
coorda: align 8
coord: istruc COORD
at COORD.X, dw 180
at COORD.Y, dw 1000
iend
;instance position et taille de la console
rectconsa: align 8
rectcons:
istruc SMALL_RECT
at SMALL_RECT.Left, dw 0
at SMALL_RECT.Top, dw 0
at SMALL_RECT.Right, dw 100
at SMALL_RECT.Bottom, dw 30
iend
;
cFontExA: align 8 ; contient les information sur la police utilisée
CFontEx: istruc CONSOLE_FONT_INFOEX
iend
ILGCONSINFEX equ $ - CFontEx
cchFontA: align 8
cCHFont: istruc CHOOSEFONT
iend
ILGCCHFONT equ $ - cCHFont
logfont1A: align 8
logfont1: istruc LOGFONT
iend
;=============================================================================
section .bss
;=============================================================================
;ATTENTION respecter l'alignement des zones
hOut resq 1 ; handle de la console de sortie
iByteLus resq 1
iTaillePolice resq 1
rgbCurrent resq 1
sBuffer resb BUFFERSIZE
szNomPolice resb 40
;=============================================================================
section .text
;=============================================================================
global Main
extern afferreur
Main:
sub rsp,8h
sub rsp,20h
;préparation de la fenêtre de choix de police
mov qword[cCHFont+CHOOSEFONT.lStructSize],ILGCCHFONT ; taille de la structure
mov qword[cCHFont+CHOOSEFONT.lpLogFont],logfont1 ; zone de reception
mov qword[cCHFont+CHOOSEFONT.hwndOwner],NULL ; pas de fenetre maitre
mov rax,[rgbCurrent] ; contient une couleur par defaut
mov qword[cCHFont+CHOOSEFONT.rgbColors],rax
mov qword[cCHFont+CHOOSEFONT.Flags],CF_SCREENFONTS | CF_EFFECTS
mov rcx,cCHFont
call ChooseFontA
mov r9,__LINE__ - 1
cmp rax,NULL ; attention ici dans le cas où l'utilisateur ne choisi rien
je .erreur ; on affiche une erreur (et GetLastError retourne 0 dans ce cas)
;allocation des consoles output imput et erreur
call FreeConsole ; à mettre si vous avez mis l'option /console dans le linker
call AllocConsole
mov r9,__LINE__ - 1
cmp rax,NULL
je .erreur
;;
xor rdx,rdx
xor rax,rax
mov dword eax,[cCHFont+CHOOSEFONT.iPointSize] ; recupération taille de la police choisie
mov rbx,10
div rbx
mov [iTaillePolice],rax
mov rcx,szNomPolice ; zone receptrice
lea rdx,[logfont1+LOGFONT.lfFaceName]
call lstrcpy ; copie de la police choisie
mov r9,__LINE__ - 1
cmp rax,NULL
je .erreur
mov rcx,STD_OUTPUT_HANDLE
call GetStdHandle ; handle de la console de sortie
mov [hOut],rax
;agrandissement de la taille maxi de la console
mov rcx,rax ; handle de la console de sortie
mov rdx,[coord] ; en X la largeur de la console, en Y le nombre de lignes maxi de la console
call SetConsoleScreenBufferSize
mov r9,__LINE__ - 1
cmp rax,NULL
je .erreur
;agrandissement de la console
mov rcx,[hOut] ; handle de la console de sortie
mov rdx,TRUE
mov r8,rectcons ; indique la position et la taille de la fenêtre de la console
call SetConsoleWindowInfo
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
mov rcx,szTitreConsole
call SetConsoleTitleA ; Titre de la console
mov dword[CFontEx+CONSOLE_FONT_INFOEX.cbSize],ILGCONSINFEX ; longueur de la structure
mov rcx,[hOut] ; des infos sur la police utilisée
mov rdx,TRUE
mov r8,CFontEx ; passage de la structure en parametre
call GetCurrentConsoleFontEx ; lecture des informations sur la police
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
mov rax,[iTaillePolice]
mov word[CFontEx+CONSOLE_FONT_INFOEX.dwFontSizeY],ax ; forçage de la taille de la police
mov word[CFontEx+CONSOLE_FONT_INFOEX.dwFontSizeX],0 ; il faut mettre à zero cette information.
lea rcx,[CFontEx+CONSOLE_FONT_INFOEX.FaceName] ; changement du nom de la police
mov rdx,szNomPolice
call lstrcpy
mov r9,__LINE__ - 1
cmp rax,NULL
je .erreur
mov rcx,[hOut]
mov rdx,TRUE
mov r8,CFontEx
call SetCurrentConsoleFontEx ; changement de la police
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
add rsp,20h ; on rend la place des parametres précédent
sub rsp, 8h ; donc on enleve déjà 8 octets pour preparer la pile
push 0 ; avant le push du parametre qui enleve 8 octets sur la pile
sub rsp, 20h ; puis on enleve les 32 octets pour la place des 4 parametres
; mov qword[rsp+20h],0
lea r9,[sBuffer]
mov r8,ILGMSG
mov rdx,szMsg
mov rcx,[hOut]
call WriteConsoleA ; affichage dans la console
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
call saisieClavier
; et pour finir affichage de la saisie dans un message
mov rcx, 0 ; hWnd = HWND_DESKTOP
mov rdx,sBuffer ; texte a afficher
mov r8,szTitre ; titre de la fenetre
mov r9, MB_OK|MB_ICONINFORMATION ; uType = MB_OK et icone info
call MessageBoxA
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
call FreeConsole;close the console
mov r9,__LINE__ - 1
cmp eax,NULL
je .erreur
mov rax,1 ; pgm OK
jmp .fin
.erreur:
call afferreur
mov rax,0
.fin:
mov rcx,rax
call ExitProcess
;=========================================================
; saisie de données au clavier
;=========================================================
saisieClavier:
sub rsp,8h
sub rsp,20h
mov rcx,STD_INPUT_HANDLE
call GetStdHandle ; recup de handle ( STD_INPUT_HANDLE)
mov r9,__LINE__
cmp eax,NULL
je .erreur
add rsp,20h
sub rsp,8h ; car un seul push
push 0 ; parametre de fin de saisie (ici standard)
sub rsp,20h
mov rcx,rax ; handle fonction précedente
mov rdx,sBuffer ; buffer
mov r8,BUFFERSIZE
mov r9, iByteLus ; nb octets lus
call ReadConsoleA
add rsp,10h ; le push et l'alignement
mov r9,__LINE__ -2
cmp eax,NULL
je .erreur
mov rax,[iByteLus]
sub rax,2
mov byte [sBuffer+rax],0 ; forçage du 00 à la place du 0D final
jmp .fin
.erreur:
call afferreur
.fin:
add rsp,8h
add rsp,20h
mov rax,sBuffer ; retour adresse du buffer
ret
Sujets similaires
» La boite selection de fichier
» La boite selection de couleurs
» La boite message
» Une boite de dialogue personnalisée
» La boite selection de couleurs
» La boite message
» Une boite de dialogue personnalisée
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|