Assembleur 64 avec le compilateur nasm
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Nike : Jusqu’à 50% sur les articles de fin de saison
Voir le deal

La boite selection de polices

Aller en bas

La boite selection de polices Empty La boite selection de polices

Message par Admin Jeu 8 Déc - 10:22

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.
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     

Admin
Admin
Admin

Messages : 38
Date d'inscription : 28/11/2016

https://assembleur64.kanak.fr

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum