Dessin de police .bmp

BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006 - 16 sept. 2006 à 20:06
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008 - 17 sept. 2006 à 14:48
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 sept. 2006 à 20:13
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<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 sept. 2006 à 20:26
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<!--
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
16 sept. 2006 à 20:27
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 ??
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 sept. 2006 à 20:33
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<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
16 sept. 2006 à 20:35
Ah ! Putain tu ma appris queque chose la !
Jte REMERCI !
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
16 sept. 2006 à 20:57
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 ....
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
16 sept. 2006 à 21:37
Chui un bouler c'est sa ?................
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 sept. 2006 à 23:21
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<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
16 sept. 2006 à 23:34
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<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
17 sept. 2006 à 00:07
É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<!--
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
17 sept. 2006 à 02:11
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
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
17 sept. 2006 à 13:37
SAKingdom Ta technique marche a merveille merci merci !^^

bbear je vais essayer ta technique ...

merci a vous deux !
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
17 sept. 2006 à 14:48
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
0
Rejoignez-nous