Ilmen_
Messages postés55Date d'inscriptiondimanche 13 mai 2007StatutMembreDernière intervention10 août 2007
-
28 mai 2007 à 20:02
Ilmen_
Messages postés55Date d'inscriptiondimanche 13 mai 2007StatutMembreDernière intervention10 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" :
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 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.
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 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);
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 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.
racpp
Messages postés1910Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201415 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.