La boite selection de polices

Voir le sujet précédent Voir le sujet suivant Aller en bas

La boite selection de polices

Message par Admin le 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     

avatar
Admin
Admin

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

Voir le profil de l'utilisateur http://assembleur64.forumactif.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

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