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.
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);
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.
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.