Texte personnalisé

Résolu
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007 - 28 mai 2007 à 20:02
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007 - 5 juin 2007 à 16:15
Voila, j'ai un problème avec le code ci dessous, qui permet d'afficher un texte personnalisé (taille, couleur, etc.).

On me signale une erreur sur la ligne "structFonte.lfHeight" :

<table align="center" bgcolor="#C9F4FF" width="500px" border="1" title="Code">
----,

void dessineTexte (HWND hWnd, char *chaine, RECT dimensions, BOOL souligne, char *police, COLORREF couleur)

{

chaine = \"Test\";

souligne = true;

police = \"Verdana\";

couleur = 0;

//Déclarations préalables

LOGFONT structFonte;

PAINTSTRUCT ps;

HFONT fonte;

HDC dc;

//Remplissage de la LOGFONT

ZeroMemory(&structFonte, sizeof(LOGFONT));

strcpy(structFonte.lfFaceName, police);

structFonte.lfHeight = dimensions.top 32;

structFonte.lfWidth = 400;

structFonte.lfUnderline = souligne;

//Création de la fonte à partir de structFonte dans fonte

fonte = CreateFontIndirect(&structFonte);

//Récupération de la surface de dessin dans dc

dc = BeginPaint(hWnd, &ps);

//Permet au texte d'avoir un fond transparent

SetBkMode(dc, TRANSPARENT);

//Applique la fonte au dc de texte

SelectObject(dc, fonte);

//Applique la couleur de texte au dc

SetTextColor(dc, couleur);

//Affichage du texte

TextOut(dc, 100, 120, chaine, strlen(chaine));

//Libération de la surface et du dc

EndPaint(hWnd, &ps);

return;

}

</td>






AfficheTexte.cpp In function `void dessineTexte(HWND__*, char*, RECT, BOOL, char*)':

26 AfficheTexte.cpp expected `;' before numeric constant


Il y a pourtant bien un ';' derrière la valeur numérique. =/

Ah oui, un autre détail : je ne sais pas comment déterminer la couleur (COLORREF). =o
</td>
</tr>
</table>

10 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 mai 2007 à 00:51
Voici ta fonction corrigée:
void dessineTexte (HWND hWnd, char *chaine, unsigned int dimensions, BOOL souligne, char *police, COLORREF couleur)
{
    //Déclarations préalables
    LOGFONT structFonte;
    HFONT fonte;
    HDC dc=GetDC(hWnd);
    //Remplissage de la LOGFONT
    ZeroMemory(&structFonte, sizeof(LOGFONT));
    strcpy(structFonte.lfFaceName, police);
    structFonte.lfHeight = -MulDiv(dimensions, GetDeviceCaps(dc,LOGPIXELSY),72);
    structFonte.lfUnderline = souligne;
    //Création de la fonte à partir de structFonte dans fonte
    fonte = CreateFontIndirect(&structFonte);

    //Permet au texte d'avoir un fond transparent
    SetBkMode(dc, TRANSPARENT);
    //Applique la fonte au dc de texte
    HFONT oldfont=(HFONT)SelectObject(dc, fonte);
    //Applique la couleur de texte au dc
    SetTextColor(dc, couleur);

    //Affichage du texte
    TextOut(dc, 100, 120, chaine, strlen(chaine));

    //Libération de la surface et du dc
    SelectObject(dc, oldfont);
    ReleaseDC(hWnd,dc);
    DeleteObject(fonte);
    return;
}

Lors de l'appel tu fais par exemple:
dessineTexte(hWnd,"bonjour",40,1,"arial",RGB(255,0,0));
Je viens de tester. Ca affiche bien "bonjour" en rouge, souligné et avec la police arial de taille 40.
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
28 mai 2007 à 20:30
structFonte.lfHeight = dimensions.top 32;

T'as deux valeurs là.



C++ (@++)<!--
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 mai 2007 à 22:37
Salut,
Oui tu dois revoir la ligne:




structFonte.lfHeight = dimensions.top 32;

En plus de l'erreur de syntaxe, il parait que la hauteur de ta police n'est pas correctement calculée.
J'aimerais aussi ajouter quelques remarques:
- Le couple BeginPaint () et EndPaint() ne doit être utilisé qu'en réponse au message WM_PAINT. C'est précisé dans  la MSDN. Tu peux obtenir le HDC de la fenêtre directement avec GetDC() et le libérer avec ReleaseDC().
- A la fin d'utilisation de la police dans ta fonction, il faut la détruire avec DeleteObject(). Sinon une nouvelle police est créée à chaque appel de ta fonction sans être libérée.

Pour déterminer la couleur d'un COLORREF, tu peux utiliser la macro RGB en lui donnant la quantité de rouge, de vert et de bleu contenu dans la couleur désirée:
COLORREF jaune =RGB(255,255,0);
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
28 mai 2007 à 22:41
Y'a aussi ce truc que je trouve bizarre (au début de la fonction):
chaine = "Test";
souligne = true;
police = "Verdana";
couleur = 0;

C'est voulu ? C'est pour des tests ? Car tu écrases les valeurs entrées en paramètre de la fonction comme ça.

C++ (@++)<!--
0

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

Posez votre question
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007
28 mai 2007 à 23:20
Il faut bien donner des valeurs à ces variables. =p

Racpp => Merci, je prend note.


Pour ce qui est du "<tt>structFonte.lfHeight = dimensions.top 32;</tt>", comment dois-je lui assigner la hauteur ?

Pour l'erreur de syntaxe, je ne vois pas où est le problème. =o
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 mai 2007 à 00:18
Je rejoins la remarque de SAKingdom car normalement les valeurs doivent être passées lors de l'appel de ta fonction. Sinon tous les appels donneront les mêmes résultats. A part les tests je n'en vois aucune autre utilité.
Pour la ligne structFonte.lfHeight = dimensions.top 32; comme signalé par SAKingdom, tu donnes deux valeurs: dimensions.top   et  32 alors qu'une seule est attendue.
Pour calculer la hauteur d'une police utilisable dans la structure LOGFONT on utilise la formule suivante:
int hauteur = -MulDiv(20, GetDeviceCaps(hdc,LOGPIXELSY),72);
Dans cet exemple, on crée une police de taille 20;
Ensuite on fera:

structFonte.lfHeight = hauteur;
Tu pourras donc remplacer le type RECT du paramètre dimensions de ta fonction par un unsigned int. Ce paramètre contiendra la hauteur désirée pour la police.
0
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007
29 mai 2007 à 23:42
OK, merci à tous.


Par contre, comment fait-on pour personnaliser la police du texte que l'on écrit dans un EDIT, par exemple ? =o
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
30 mai 2007 à 00:38
Après avoir créé la police tu envoies son HANDLE à l'EDIT avec le message WM_SETFONT:
HFONT mapolice=CreateFontIndirect(....);
SendMessage(hwndEdit,WM_SETFONT,(WPARAM)mapolice,1);

La police ne doit etre détruite qu'en fin d'utilisation ou pour la remplacer par une autre police.
0
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007
31 mai 2007 à 23:23
Merci beaucoup.

Cependant, comment fait-on concrètement ?

Par exemple, je vient de tester en intégrant une police dans un EDIT de mon programme, mais j'ai rencontré un problème :

<table align= "center" bgcolor="#C9F4FF" width="520px" border="1" title="Code">
----,

void CreateFont(HWND hWnd, char *chaine, unsigned int dimensions, BOOL souligne, char *police, COLORREF couleur)

{

// Déclarations préalables

LOGFONT structFonte;

HFONT Fonte_BASE_COUNT;

HDC dc=GetDC(hWnd);

// Remplissage de la LOGFONT

ZeroMemory(&structFonte, sizeof(LOGFONT));

strcpy(structFonte.lfFaceName, police);

structFonte.lfHeight = -MulDiv(dimensions, GetDeviceCaps(dc,LOGPIXELSY),72);

structFonte.lfUnderline = souligne;

// Création de la fonte à partir de structFonte dans fonte

Fonte_BASE_COUNT = CreateFontIndirect(&structFonte);

// Permet au texte d'avoir un fond transparent

SetBkMode(dc, TRANSPARENT);

// Applique la fonte au dc de texte

HFONT oldfont=(HFONT)SelectObject(dc, Fonte_BASE_COUNT);

// Applique la couleur de texte au dc

SetTextColor(dc, couleur);

// Affichage du texte

TextOut(dc, 100, 120, chaine, strlen(chaine));

// Libération de la surface et du dc

// SelectObject(dc, oldfont);

// ReleaseDC(hWnd,dc);

// DeleteObject(Fonte_BASE_COUNT);

return;

}

(...)

HWND BASE_COUNT;
// Le nom de mon EDIT (handle)

HWND affiche_BASE_COUNT (HWND hWnd)

{

HWND BASE_COUNT =CreateWindow(

\"EDIT\",

\"T : \r\nC : \r\nA : \r\nG : \r\nTotal : \",

WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_LEFT,

400, 185, 190, 120, hWnd, NULL, instance, NULL);

// Assigner la fonte à l'EDIT :

HFONT Fonte_BASE_COUNT=CreateFontIndirect(&structFonte);
// structFonte n'est pas déclaré... Comment faire ?

SendMessage (BASE_COUNT, WM_SETFONT, 0, (WPARAM)Fonte_BASE_COUNT, 1);

return BASE_COUNT;

}

</td>





Comment mettre la police déterminée dans <tt>void CreateFont()</tt> ici sans tout réécrire ? =/
</td>
</tr>
</table>
0
Ilmen_ Messages postés 55 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 10 août 2007
5 juin 2007 à 16:15
Bon, je vais plutôt créer un nouveau topic, car celui-ci à coulé...

Merci à tous.
0
Rejoignez-nous