Salut.
C'est super : ACTION .... REACTION. Merci pour la rapidité de tes réponses qui confirme ce que je pense sur ce forum : EXCELLENT !
Eu .... comment je fais pour créer une FONT en GLOBAL afin de l'utiliser partout dans mon projet.
Version imprimable
Salut.
C'est super : ACTION .... REACTION. Merci pour la rapidité de tes réponses qui confirme ce que je pense sur ce forum : EXCELLENT !
Eu .... comment je fais pour créer une FONT en GLOBAL afin de l'utiliser partout dans mon projet.
:DCode:
1
2
3
4
5
6
7
8
9 LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); strcpy(lf.lfFaceName, "Arial"); int PointSize=12;// 12 points de hauteur HDC hDC=::CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);// dc d'ecran lf.lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);// hauteur en point ::DeleteDC(hDC); HFONT hFont=::CreateFontIndirect(&lf);
J'ai trouvé. Pour ceux que ca interesse :
Dans un fichier de type H écrire :
Et dans le fichier principale telle que Main.cpp tu déclare une variable identique à MaFont en extern et tu initialise ta font :Code:HFONT MaFont
Es-ce que je me trompe?Code:
1
2
3
4 extern HFONT MaFont .... MaFont = CreateFont(Taille,0,0,0,GRAS,ITALIC,SOULIGNE,BARRE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial")
createfont ou createfondindirect sont deux méthodes pour créer une fonte, createfont reprend individuellement les éléments d'une LOGFONT.
pour ta vairiable globale:
dans un .h ex :MyInc.h
dans un seul .cppCode:
1
2
3
4
5
6 #ifdef GLOBAL_DEC HFONT hGlobalFont; #else extern HFONT hGlobalFont; #endif
pour les autres .cpp il suffit de faire un include "MyInc.h"Code:
1
2
3 #define GLOBAL_DEC 1 include "MyInc.h"
:D
OK.
Mais les fonctions GetTextExtentPoint32 et SetWindowPos utilisent-elles la même unités de mesure.
Car si je prend un exemple, je créer un static avec une FONT dont les caractéristiques sont : TAILLE = 20, Gras, Italique, Arial.
Et je souhaite connaitre la taille réelle de mon texte avec GetTextExtentPoint32 et ensuite redimensionner le static avec SetWindowPos.
Es-ce ca va marché car la taille du texte est lié à la résolution de l'écran et l'autre pas.
J'espère que tu auras réussit à me comprendre.
non pas vraiment ,Citation:
Envoyé par Mirsa
c'est quoi l'autre ?
on travaille en pixels c'est tout, on a récuperé la taille du texte en pixels et on adapte la taille du controle en consequence .:D
L'exemple sera bien mieux que les mots.
Alors je créer un STATIC avec une font puis je la redimensionne :
Ensuite je créer un autre STATIC avec une autre FONT puis je la redimensionne :Code:
1
2
3
4
5
6
7
8
9 MaFont1 = CreateFont(50,0,0,0,FALSE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial"); hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL); SendMessage(Hwnd_Static,WM_SETFONT,(UINT)MaFont1,TRUE); hGdiOld = SelectObject(GetDC(Hwnd_Static),MaFont1); GetTextExtentPoint32(GetDC(Hwnd_Static),pName,strlen,pName),&size); SetWindowPos(Hwnd_Static,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER); SelectObject(GetDC(GetDlgItem(hDlg,Id)),hGdiOld); ReleaseDC(GetDlgItem(hDlg,Id),GetDC(GetDlgItem(hDlg,Id)));
Dans les deux cas, on s'apercoit à l'écran que le "rectangle" de chaque STATIC n'est pas bien redimensionner (surtout pour MaFont1) donc je ne peux pas placer le second STATIC pile poils après le premier.Code:
1
2
3
4
5
6
7
8
9 MaFont 2= CreateFont(15,0,0,0,TRUE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial"); hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL); SendMessage(Hwnd_Static,WM_SETFONT,(UINT)MaFont2,TRUE); hGdiOld = SelectObject(GetDC(Hwnd_Static),MaFont2); GetTextExtentPoint32(GetDC(Hwnd_Static),pName,strlen,pName),&size); SetWindowPos(Hwnd_Static,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER); SelectObject(GetDC(GetDlgItem(hDlg,Id)),hGdiOld); ReleaseDC(GetDlgItem(hDlg,Id),GetDC(GetDlgItem(hDlg,Id)));
Il se peut .... voir même quasi sur ... que je me suis planter dans mon code.
J'ai fais des tests avec deux static dont chacun utilise une FONT différentes (MaFont1 => TAILLE=20 et MaFont2 => TAILLE=15).
Ca me donne ca :
Pièce jointe 6911
On voit que le texte est tronquer et que le rectangle de mon STATIC n'est pas redimensionner.
re,
ce n'est pas tout a fais ce que je t'avais dis ...
le premier static tu le redimensionne en fonction de son contenu.
le deuxieme il faudra le deplacer en fonction du premier static
pour calculer les coordonnées il faut recuperer l'emplacement windows du premier et coler le second a coté ...
ps: tu m'as fait un gros massacre à la hache dans ton code avec GetDC :aie:....
a tester j'ai ecris sans pouvoir tester, il y avait pleins d'erreurs dans ton code ...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 void SetStatic(HWND hWin,HFONT hFont) { SendMessage(hWin,WM_SETFONT,(UINT)hFont,TRUE); HDC hDC=GetDC(hWin); hGdiOld = SelectObject(hDC,hFont); SIZE size; char szName[255]; GetWindowText(hWnd, szName,sizeof(szName)); GetTextExtentPoint32(hDC,szName,strlen(szName),&size); SetWindowPos(hWin,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER); SelectObject(hDC,hGdiOld); ReleaseDC(hWin,hDC); } HFONT MaFont1 = CreateFont(50,0,0,0,FALSE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial"); HWND hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL); SetStatic(hWin,MaFont1); HFONT MaFont2= CreateFont(15,0,0,0,TRUE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial"); HWND hWin1 = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL); SetStatic(hWin1,MaFont2); RECT Rect; ::GetClientRect(hWin,&Rect); // 1 static coord screen POINT pt; pt.x=Rect.left; pt.y=Rect.top; ::ScreenToClient(hDlg,&pt); // conversion en coord cliente pt.x+=(Rect.right-Rect.left); // x= fin du premier static. position x += largeur du static. ::GetClientRect(hWin1,&Rect); //2 static coord screen POINT pt2; pt2.x=Rect.left; pt2.y=Rect.top; // y = hauteur actuelle du static. ::ScreenToClient(hDlg,&pt2); // conversion en coord cliente SetWindowPos(hWin1,NULL,pt.x,pt2.y,0,0,SWP_NOSIZE|SWP_NOZORDER); // deplacement uniquement pas la taille.
:D
Bonjour,
Euh à propos de ce code :
Il n'y a pas un binzzz ? Car si je lit l'aide MSDN, la fonction GetClientRect permet de réccupérer les dimension du rectangle client et non la poisition de cet élément à l'écran.Code:::GetClientRect(hWin,&Rect);
Je pense que c'est GetWindowRect qu'il faut utilisé.
Tu crois pas ?
P.S. : merci pour ton aide
oui effectivement je me suis planté ,c'est bien GetWindowRect qu'il faut utiliser.
Ou bien, si on cherche la position du rectangle client à l'écran et non celle du rectangle complet, on peut utiliser GetClientRect() et MapWindowPoints()...