IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fen�tre qui s'adapte � toute forme d'�cran


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2015
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 37
    Billets dans le blog
    1
    Par d�faut Fen�tre qui s'adapte � toute forme d'�cran
    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!

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    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.

  3. #3
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Utiliser une librairie graphique qui g�re ce genre de chose.

  4. #4
    Membre averti

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2015
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 37
    Billets dans le blog
    1
    Par d�faut
    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.

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    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.

  6. #6
    Membre averti

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2015
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 37
    Billets dans le blog
    1
    Par d�faut
    Oui, j'utilise la WINAPI.

  7. #7
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par d�faut
    Citation Envoy� par pal1996 Voir le message
    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!
    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..

    Citation Envoy� par pal1996 Voir le message
    -WM_CREATE: Je fais un getWindowRect(), et je cr�e mes contr�les en fonction du RECT d�finit.
    -WM_SIZE: Je fais encore un getWindowRect() dans le m�me RECT, et je fais un MoveWindow() pour un contr�le d�finit.
    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

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    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.

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    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.

  10. #10
    Membre averti

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2015
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 37
    Billets dans le blog
    1
    Par d�faut
    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...
    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.
    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?

  11. #11
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Citation Envoy� par pal1996 Voir le message
    - 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.
    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).
    - ne serait-il pas mieux d�clarer un 'static RECT r' et de l'utiliser dans les diff�rents messages?
    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)
    - Je n'ai pas remarqu� la pr�sence de la fonction ShowWindow(). Qu'est-ce qui la remplace?
    Le style WS_VISIBLE dans l'appel � CreateWindow().
    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.

  12. #12
    Membre averti

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2015
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 37
    Billets dans le blog
    1
    Par d�faut
    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!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 1
    Dernier message: 20/09/2012, 10h14
  2. Site qui s'adapte � tout type d'�cran
    Par CE.KA dans le forum D�buter
    R�ponses: 1
    Dernier message: 07/12/2009, 13h58
  3. Un texte qui s'adapte � une forme ou une image
    Par fabiin dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 19/01/2009, 17h52
  4. Fen�tre qui se referme toute seule
    Par User Name dans le forum D�buter
    R�ponses: 2
    Dernier message: 03/12/2008, 14h06
  5. Des fen�tres qui s'ouvrent toutes seules
    Par larimoise dans le forum S�curit�
    R�ponses: 15
    Dernier message: 27/02/2007, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo