Texte personnalisé [Résolu]

Signaler
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007
-
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
structFonte.lfHeight = dimensions.top 32;

T'as deux valeurs là.



C++ (@++)<!--
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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);
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

OK, merci à tous.


Par contre, comment fait-on pour personnaliser la police du texte que l'on écrit dans un EDIT, par exemple ? =o
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

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>
Messages postés
55
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
10 août 2007

Bon, je vais plutôt créer un nouveau topic, car celui-ci à coulé...

Merci à tous.