Dessin de police .bmp

Signaler
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006
-
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008
-
Salut a tous !

Oui c'est encore moi ! Je sais que certain en a marre de moi mais bon .....
Le problème c'est que je suis en train de créé un police a partir d'images .bmp
j'ai 26 images de A à Z.

Mon code :

for (i=0;i<TextSize;i++)
    {
        Letter=ScrollText[i];
        hBitmap[i] = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP_+Letter));
        BlitBmp(hDC, hBitmap[i], i*32, 0, 0, 0); //<-C'est un fonction que j'ai crée pour simplifié BitBlt()

    }

Dans mes resources ya :
#define IDB_BITMAP_A                    2001
#define IDB_BITMAP_B                    2002
#define IDB_BITMAP_C                    2003
.....

Je pense que le problème vien de la :
Letter=ScrollText[i];
ou de la :
IDB_BITMAP_+Letter

car si je met IDB_BITMAP_A sa maffiche bien 3 A !
Si quelqu'un aurait une idéé pour mon problème ....

13 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
MAKEINTRESOURCE(IDB_BITMAP_+Letter)????


Je crois que ton problème vien plutot de là. Tu devrais faire:


MAKEINTRESOURCE(IDB_BITMAP_A+Letter)
Letter serais égal à 0 si il s'agit de A, 1 si il s'agit de B etc. Il y a plus de chance comme ça que ça fonctionne.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Menfin c'est un exemple. Je ne sais pas comment tu procède avec ton Letter (quelle valeur il a quand tu interprete un C par exemple) mais c'était pour que tu comprène le principe. À toi de faire les modifications nécessaire pour le bon fonctionnement du programme.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006

Je vien de tester un autre truc pour voir si le problème vener de:
IDB_BITMAP_+Letter

for(i=0;i<NUM;i++)
    {
        hBitmap[i] = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP+i));
    }

Sa me charge bien les image IDB_BITMAP1, IDB_BITMAP2, etc...

Enfaite si jai bien compris faut que Letter me retourne le nombre de la lettre ....
C'est sa ??
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Oui et non. En fait si tu fait:
IDB_BITMAP_A
Tu va avoir sa valeur qui équivaut à 2001 d'après tes sources. Donc si tu veux A, Letter devrait égaler 0:
MAKEINTRESOURCE(IDB_BITMAP_A+Letter)

Si tu veux B,Letter devrais égaler 1 donc tu auras 2001 qui est la valeur de IDB_BITMAP_A plus Letter donc 2001 + 1 qui égalera à 2002:MAKEINTRESOURCE(IDB_BITMAP_A+Letter) // Letter 1 donc résultat 2002
qui équivaut à IDB_BITMAP_B et ainsi de suite pour C, D, E.

Comprend tu le principe?

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006

Ah ! Putain tu ma appris queque chose la !
Jte REMERCI !
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006

AH ! J'ai compris...

on ma dit que pour récuperer une lettre dans une chaine de caractère
il fallait faire
exemple:

char c;
char txt[]="azerty";
c=txt[2];

c me renvoi "z".

Dans le prog que chui en train de faire

Letter=ScrollText[i]; // sa ne me renvoi pas les lettre de la chaine ScrollText
                               // sa renvoi ScrollText1, ScrollText2, ScrollText3, ...

Je crois bien que c'est sa le problème ...
ou bien chui un boulet ....
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006

Chui un bouler c'est sa ?................
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Bien en effet, le seul moyen que tu as pour écrire avec ta police c'est d'examiner lettre par lettre. Cependant, le code renvoyer dans Lettre sera le code hexadecimal de la lettre. Il faudrait comme moyen, soustraire tout simplement. Ce sont des majuscules? Alors essais ceci:
MAKEINTRESOURCE(IDB_BITMAP_A+(Letter-'A'))

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Tout en gardent ton procédé actuel. Sinon, voici un exemple:

void PolicePerso (char *chaine)
{
   int Lettre;

   while(*chaine)
   {
      Lettre = *chaine;
      // Ici, tu met ton procédé pour charger les images et tu remplace ton MAKEINTRESOURCE actuel par MAKEINTRESOURCE(IDB_BITMAP_A+(Letter-'A'))

      *chaine++;
   }
}

Voilà. Ceci devrais charger ta police via une chaine de caractère.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Évidament, la méthode actuelle ne peut fonctionner qu'avec des lettres
UNIQUEMENT. Si il y a des chiffres dans la chaine, le resultat pourrait
être bizare.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

pfiu! tu te compliques la vie si c'est pour faire un scrolltext avec une police bitmap !!
il faut faire comme au bon vieux temps des demos
toutes les lettres dans un bitmap en ressource (largeur fixe ou non, le plus simple etant fixe)
à l'init du prog, on charge une bonne fois pour toute la font hFont=(HBITMAP)LoadImage(...,MAKEINTRESOURCE(IDB_FONT),IMAGE_BITMAP,...)
et un hdc lié (hdcFont)
un tableau pour l'ordre des lettres dans la bitmap:
char tabchars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-!:.,'() ";
et le tableau de char du texte.

ensuite faire une fonction GetChar qui renvoie la position de la lettre voulue dans la bitmap :
int GetChar(char letter, char *tabchar)
{
    int pos=0;
    char* p=tabchar; // pointe sur le tableau des lettres de la font
    // cherche où se trouve la lettre
    while((*p++ != letter)&&(*p!=0)) pos++;
    if(*p==0) pos=-1;
    return pos;
}

ensuite pour afficher dans la boucle for le caractere voulue par exemple scrolltxt[i]
poschar=GetChar(scrolltxt[i],tabchars);
if(poschar>=0){
BitBlt(hdc,posx,posy,charwidth,charheight,hdcFont,poschar*charwidth,0,SRCCOPY)
}

c'est beaucoup plus simple que de gerer par 1 bitmap par lettre
comme dans les vrais demos quoi

enfin, je dis ça, si c'est bien là le but de la manoeuvre, sinon, désolé du derangement
Messages postés
46
Date d'inscription
dimanche 27 août 2006
Statut
Membre
Dernière intervention
26 octobre 2006

SAKingdom Ta technique marche a merveille merci merci !^^

bbear je vais essayer ta technique ...

merci a vous deux !
Messages postés
92
Date d'inscription
jeudi 24 novembre 2005
Statut
Membre
Dernière intervention
29 mai 2008

légère modif (un petit doublon qui sert à rien)

int GetChar(char letter, char *p)
{
    int pos=0;
    // cherche où se trouve la lettre (p pointe sur le tabchar de la font)
    while((*p++ != letter)&&(*p!=0)) pos++;
    if(*p==0) pos=-1;
    return pos;
}

pour une font proportionnelle, il faut rajouter un tableau avec les largeurs de chq lettre