Charger une police depuis un fichier ou une ressource (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 12 564 fois - Téléchargée 762 fois

Description

Ce code montre comment utiliser la fonction AddFontMemResourceEx dans le but de créer une police a partir d'un fichier qui n'est pas dans le dossier des polices de Windows, ou bien depuis une ressource de l'exécutable.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
alignement sur une adresse multiple de 4 puisqu'on adressera par 4 octets.
C'est visible ici:
r = ((DWORD) p) & 3;
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

J'ai regardé ta fonction bnzeromemAL de pret la, c'est du bon, par contre quand tu dit "Utiliser les 'AL' quand tu es certain de l'alignement sur 4 de destination" tu veux dire aligner sur 4 octets ? parce que la ça serais plutot 8 puisque tu efface 8 par passe :
*((DWORD*) p) = 0;
*((DWORD*) (p + 4)) = 0;
Messages postés
223
Date d'inscription
mercredi 13 juillet 2005
Statut
Membre
Dernière intervention
8 août 2011

Cool merci BruNews ! j'ai plus le vilain message CRT :-)

J'avais un autre message quand j'avais mis "Ignore All Default Libraries" à yes :
error LNK2001: unresolved external symbol __chkstk

Pour ceux qui l'ont eu c'est à cause d'un buffer trop gros, j'en avait un a 768 WCHAR je l'ai descendu a 256 et plus de message même avec cette option activée.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Marrant quand un sujet revient sur le devant de la scène...

Je viens d'ajouter ceci (entre autre) dans mon taf en cours:
JJ = pcurrArts->dateF - pPLAN[0];
if(JJ < 0) JJ = 0;
for(; JJ < NCOLS; JJ++) TPLANAR.jours[JJ] = 0;
ben il m'a remplacé la boucle par un: call memset
pénible...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
trop lent par octet.
Versions pour buffers alignés ou non. Utiliser les 'AL' quand tu es certain de l'alignement sur 4 de destination (souvent le cas dans code propre).

void __fastcall bnzeromemAL(void *pmem, DWORD len)
{
BYTE *p = (BYTE*) pmem;
DWORD r = len;
if(!(len >>= 3)) goto prepm1SET;
mem8SET:
*((DWORD*) p) = 0;
*((DWORD*) (p + 4)) = 0;
p += 8;
if(--len) goto mem8SET;
prepm1SET:
if(!(r &= 7)) goto zeromemEXIT;
mem1SET:
*p++ = 0;
if(--r) goto mem1SET;
zeromemEXIT: return;
}

void __fastcall bnzeromemUNAL(void *pmem, DWORD len)
{
BYTE *p = (BYTE*) pmem;
DWORD r;
if(!len) goto zeromemEXIT;
r = ((DWORD) p) & 3;
if(!r) goto okALIGN;
*p++ = 0;
if(--len == 0) goto zeromemEXIT;
if(--r == 0) goto okALIGN;
*p++ = 0;
if(--len == 0) goto zeromemEXIT;
if(--r == 0) goto okALIGN;
*p++ = 0;
if(--len == 0) goto zeromemEXIT;
okALIGN:
r = len;
if(!(len >>= 3)) goto prepm1SET;
mem8SET:
*((DWORD*) p) = 0;
*((DWORD*) (p + 4)) = 0;
p += 8;
if(--len) goto mem8SET;
prepm1SET:
if(!(r &= 7)) goto zeromemEXIT;
mem1SET:
*p++ = 0;
if(--r) goto mem1SET;
zeromemEXIT: return;
}

__declspec(naked) void __fastcall bnfillmemAL(void *pmem, BYTE v, DWORD len)
{ // ECX pmem, EDX v, [esp+4] = len
__asm {
mov eax, ecx ; EAX = pmem
and edx, 0FFh ; octet seul
mov ecx, [esp+4] ; ECX = len
mov [esp-8], esi
mov [esp-4], ebx
mov dh, dl
test ecx, ecx
je short fillEXIT
mov esi, ecx
mov ebx, edx
shr ecx, 3
je short prepf1SET
shl edx, 16
mov dx, bx
f8SET:
mov [eax], edx
mov [eax+4], edx
add eax, 8
sub ecx, 1
jnz short f8SET
prepf1SET:
and esi, 7
je short fillCLEAN
f1SET:
mov [eax], dl
add eax, 1
sub esi, 1
jnz short f1SET
fillCLEAN:
mov ebx, [esp-4]
mov esi, [esp-8]
fillEXIT:
ret 4
}
}

__declspec(naked) void __fastcall bnfillmemUNAL(void *pmem, BYTE v, DWORD len)
{ // ECX pmem, EDX v, [esp+4] = len
__asm {
mov eax, ecx ; EAX = pmem
and edx, 0FFh ; octet seul
mov ecx, [esp+4] ; ECX = len
mov [esp-8], esi
mov [esp-4], ebx
mov dh, dl
test ecx, ecx
je short fillEXIT
mov ebx, eax
and ebx, 3
je short okALIGN
mov [eax], dl
add eax, 1
sub ecx, 1
jz short fillCLEAN
sub ebx, 1
jz short okALIGN
mov [eax], dl
add eax, 1
sub ecx, 1
jz short fillCLEAN
sub ebx, 1
jz short okALIGN
mov [eax], dl
add eax, 1
sub ecx, 1
jz short fillCLEAN
okALIGN:
mov esi, ecx
mov ebx, edx
shr ecx, 3
je short prepf1SET
shl edx, 16
mov dx, bx
f8SET:
mov [eax], edx
mov [eax+4], edx
add eax, 8
sub ecx, 1
jnz short f8SET
prepf1SET:
and esi, 7
je short fillCLEAN
f1SET:
mov [eax], dl
add eax, 1
sub esi, 1
jnz short f1SET
fillCLEAN:
mov ebx, [esp-4]
mov esi, [esp-8]
fillEXIT:
ret 4
}
}
Afficher les 63 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.