Salut!
je voudrai savoir comment faire � ce que ma fen�tre s'adapte � tout �cran quelle que soit sa r�solution; et que lorsque je la r�duise les contr��les qu'elle contient se r�duisent aussi.
Merci!
Salut!
je voudrai savoir comment faire � ce que ma fen�tre s'adapte � tout �cran quelle que soit sa r�solution; et que lorsque je la r�duise les contr��les qu'elle contient se r�duisent aussi.
Merci!
Salut,
Y'a pas vraiment de magie. Faut juste tout prendre en compte et adapter les tailles et positions en fonction. Souvent travailler en % de fen�tre et non en pixels directement est un premier pas.
Edit : et une attention particuli�re aux �l�ments circulaires pour pas qu'ils se retrouvent ovales![]()
Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation r�seau ?
Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.
Utiliser une librairie graphique qui g�re ce genre de chose.
J'ai essay� de r�cup�rer les dimensions de la fen�tre cliente dans un ''RECT'' et de travailler en fonction. Mais lorsque je redimensionne la fen�tre ��a n'a aucun effet. Est ce qu'il faut alors utiliser les ''%'' pour r�soudre le probl�me ou alors il y'a autre chose � ajouter?
Merci.
Tu utilises directement l'API Win32?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Oui, j'utilise la WINAPI.
avant de g�rer WM_SIZE et les constantes de cr�ation comme CS_VREDRAW de fen�tre encore faudrait-il obtenir la r�solution de l'�cran courante et je ne comprends pas pourquoi cela n'a pas �t� mentionn�.
C'est possible avec GetSystemMetrics()notamment qui retourne la r�solution de l'�cran
Donc en fonction de cela on peut redimensionner la fen�tre.
Si l'utilisateur d�cide de changer de r�solution d'�cran ce qui est peu courant, le Program Manager contenu dans le noyau de l'OS et qui place les messages dans la boucle de messages(bref capt�s par GetMessage() TranslateMessage()...) va placer le message WM_SIZE ou WM_PAINT
Donc tout programme d�velopp� en C/C++ pour Windows avec l'API win32 devrait g�rer en principe GetSystemMetrics()
De m�me que le message WM_QUERYENDSESSION mais �a c'est une autre affaire..
attention aussi au probl�me des coordonn�es logiques et physiques..le cas �ch�ant on peut �tre amen� � faire une conversion des coordonn�es obtenues par le syst�me avec ClientToScreen notamment ou la fonction inverse
Voici un programme d'exemple: En C, compatible avec VS 2005 et des vieux OS comme Windows XP. En gros, �a devrait tourner pratiquement partout:
Code C : S�lectionner tout - Visualiser dans une fen�tre � part
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 #define _WIN32_WINNT 0x501 /*Windows XP ou supérieur (pour ICC_STANDARD_CLASSES)*/ #include <windows.h> #pragma warning(push) #pragma warning(disable: 4201) /*Supprime un warning inutile sous Visual 2005*/ #include <commctrl.h> #pragma warning(pop) #pragma comment(lib, "comctl32.lib") /*Identifiants de contrôles*/ #define IDC_MYEDITBOX 100 #define IDC_MYTEXT 101 #define IDC_MYBUTTON 102 #define HMENU_FROM_CONTROLID(x) ((HMENU)(INT_PTR)(x)) /*Pour avoir un affichage moderne, il faut compiler en UNICODE et utiliser Common Controls v6 ou supérieur*/ #ifdef UNICODE #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #endif /*Procédure de fenêtre*/ LRESULT CALLBACK resizing_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT ret = 0; switch(uMsg) { case WM_CREATE: { RECT r = {0}; GetClientRect(hWnd, &r); CreateWindowEx(0, TEXT("EDIT"), TEXT(""), WS_CHILD|WS_VISIBLE|ES_MULTILINE|WS_VSCROLL|WS_BORDER, 10, 40, r.right-10-10, r.bottom-10-40, hWnd, HMENU_FROM_CONTROLID(IDC_MYEDITBOX), NULL, NULL); CreateWindowEx(0, TEXT("STATIC"), TEXT("Exemple de texte et d'editbox"), WS_CHILD|WS_VISIBLE|SS_NOPREFIX|SS_WORDELLIPSIS, 10, 10, r.right-10-60-10-10, 20, hWnd, HMENU_FROM_CONTROLID(IDC_MYTEXT), NULL, NULL); CreateWindowEx(0, TEXT("BUTTON"), TEXT("Bouton"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, r.right-10-60, 10, 60, 20, hWnd, HMENU_FROM_CONTROLID(IDC_MYBUTTON), NULL, NULL); /*Donnons une meilleure police à ces contrôles*/ { NONCLIENTMETRICS ncm = {0}; HFONT theFont = NULL; ncm.cbSize = sizeof ncm; SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, ncm.cbSize); theFont = CreateFontIndirect(&ncm.lfMessageFont); SendDlgItemMessage(hWnd, IDC_MYEDITBOX, WM_SETFONT, (WPARAM)theFont, TRUE); SendDlgItemMessage(hWnd, IDC_MYTEXT, WM_SETFONT, (WPARAM)theFont, TRUE); SendDlgItemMessage(hWnd, IDC_MYBUTTON, WM_SETFONT, (WPARAM)theFont, TRUE); } } break; case WM_SIZE: { RECT r = {0}; GetClientRect(hWnd, &r); /*Note: Inutile de passer TRUE ici, grâce à CS_H/VREDRAW.*/ MoveWindow(GetDlgItem(hWnd, IDC_MYEDITBOX), 10, 40, r.right-10-10, r.bottom-10-40, FALSE); MoveWindow(GetDlgItem(hWnd, IDC_MYTEXT), 10, 10, r.right-10-60-10-10, 20, FALSE); MoveWindow(GetDlgItem(hWnd, IDC_MYBUTTON), r.right-10-60, 10, 60, 20, FALSE); } break; /*Finir la boucle de messages quand cette fenêtre est détruite*/ /*Note: Pour bien faire, je devrais aussi re-changer la police des contrôles et la détruire. Mais j'ai la flemme et le processus est sur le point de se terminer de toute façon.*/ case WM_DESTROY: PostQuitMessage(0); break; default: ret = DefWindowProc(hWnd, uMsg, wParam, lParam); break; } return ret; } int APIENTRY resizing_WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd = NULL; WNDCLASSEX wcx={0}; INITCOMMONCONTROLSEX icex = { sizeof icex, ICC_STANDARD_CLASSES }; (void)hPrevInstance; (void)lpCmdLine; (void)nShowCmd; /*Initialisation des Common Controls et des Visual Styles*/ InitCommonControlsEx(&icex); /*Définir la classe de fenêtre*/ wcx.cbSize = sizeof wcx; wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); wcx.hInstance = hInstance; wcx.lpfnWndProc = resizing_WindowProc; wcx.lpszClassName = TEXT("Resizing Window"); wcx.hCursor = LoadCursor(NULL, IDC_ARROW); wcx.style = CS_HREDRAW|CS_VREDRAW; /*Ils semblent être nécessaires en fait, sinon les contrôles se redessinent mal (j'ai l'impression qu'ils se redessinent trop tôt)...*/ if(RegisterClassEx(&wcx) == 0) return EXIT_FAILURE; hWnd = CreateWindowEx(0, wcx.lpszClassName, TEXT("Fenêtre Redimensionnant ses Contrôles"), WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(hWnd != NULL) { /*Boucle de messages*/ MSG msg = {0}; while(GetMessage(&msg, NULL, 0, 0)>0) /*Attente bloquante, dispatche tous les messages 'envoyés' et récupère le premier message 'posté' de la file du thread courant*/ { TranslateMessage(&msg); /*Génère les WM_CHAR à partir des WM_KEYDOWN (les insère en tête de file)*/ DispatchMessage(&msg); /*Dispatche message récupéré vers la bonne procédure de fenêtre*/ } } return 0; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pas vraiment besoin de r�cup�rer les dimensions de l'�cran, il suffit de cr�er la fen�tre maximis�e (avec le style WS_MAXIMIZE) et �a devrait marcher...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
J'imagine que le style WM_MAXIMISE sera appel� dans la fonction ShowWindow(). Si c'est le cas �a n'aura probablement pas d'influence sur les dimensions des contr�les juste apr�s leur cr�ation. En fait ils d�pendront des dimensions par d�faut attribu�es � la fen�tre (au cas o� ils sont cr��s en fonction de celle-ci). On pourra donc d�finir les dimensions par d�faut � l'aide de getDesktopWindow(); mais vu qu'on aura beaucoup plus de lignes de codes, il serait pr�f�rable d'utiliser getSystemMetrics() que mentionnait Mat.M.M�dinoc a �crit:
Pas vraiment besoin de r�cup�rer les dimensions de l'�cran, il suffit de cr�er la fen�tre maximis�e (avec le style WS_MAXIMIZE) et �a devrait marcher...
Au niveau du code:
- pourquoi utiliser directement des chiffres dans le demensionnement? Je pense que s'il faut faire une fen�tre plus flexible, toutes les coordonn�es et dimensions doivent se donner en fonction de la taille de la fen�tre.
- ne serait-il pas mieux d�clarer un 'static RECT r' et de l'utiliser dans les diff�rents messages?
- Je n'ai pas remarqu� la pr�sence de la fonction ShowWindow(). Qu'est-ce qui la remplace?
Franchement �a d�pend des circonstances. Pour les marges, elles sont le plus souvent fixes (ou du moins, elles ont une valeur minimum). Ici je les ai hard-cod�es parce que je n'allais pas me compliquer la vie en plus.
Pour les tailles, �a d�pend aussi: Un contr�le multi-lignes aura g�n�ralement une taille qui d�pend directement de celle de la fen�tre, mais un contr�le d'une seule ligne aura g�n�ralement une hauteur fixe (m�me si pour bien faire, il faudrait la faire d�pendre de la taille de police plut�t que la hard-coder).
Non, parce qu'il n'y a pas de raison que son contenu persiste d'un message � l'autre. Une variable ayant une trop longue dur�e de vie est source de confusion pour celui qui doit maintenir le code (cad, toi dans six mois)- ne serait-il pas mieux d�clarer un 'static RECT r' et de l'utiliser dans les diff�rents messages?
Le style WS_VISIBLE dans l'appel � CreateWindow().- Je n'ai pas remarqu� la pr�sence de la fonction ShowWindow(). Qu'est-ce qui la remplace?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
OK merci a vous tous! J'ai appris de nouvelles choses � travers vos r�actions. Mais j'ai encore pas mal soucis que je poserai dans d'autres sujets.
Pour ce probl�me je pense qu'il est r�solut!
Partager