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

MFC Discussion :

Position d'une fenêtre sur l'écran (left, top)


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 79
    Points : 60
    Points
    60
    Par défaut Position d'une fenêtre sur l'écran (left, top)
    Bonjour,

    Je souhaiterais récupérer les coordonnées (du point haut gauche par exemple) de la fenêtre de mon projet VC++.

    Je peux m'en sortir en faisant en sorte que la fenêtre soit centrée avec la méthode GetSystemMetrics(SM_C*SCREEN) et les dimensions de ma fenêtre mais ce n'est hélas plus le cas lors d'un déplacement de celle-ci.

    Merci à ceux qui voudront bien m'aider.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    voir GetWindowRect qui renvoie les coordonnées en rapport a l'ecran.


  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 79
    Points : 60
    Points
    60
    Par défaut
    Merci cela marche.

    Pour que cela soit utile, j'aimerais retrouver la hauteur occupée par le titre de la fenêtre.

    C'est ce que j'ai tenté de faire avec le bout de code suivant mais je n'arrive pas à comprendre pourquoi j'ai une erreur de compilation (le type TITLEBARINFO n'est pas accepté alors que j'ai bien défini le header windows.h) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       TITLEBARINFO pti;
    	GetTitleBarInfo(hWin, &pti);
     
    	int hauteur_barre_titre = pti.rcTitleBar.bottom - pti.rcTitleBar.top;

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Essaie de faire un click droit sur ce type et va à "Go to definition" pour voir dans quel fichier il est définit.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 79
    Points : 60
    Points
    60
    Par défaut
    Normalement, le type TITLEBARINFO est défini dans winuser.h, que j'ai inclus, mais le 'Go to definition' ne donne rien justement.

    http://msdn.microsoft.com/library/de...tlebarinfo.asp

    Comment m'en sortir ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    AdjustWindowRect() pour retrouver quelle taille doit avoir la fenêtre pour une taille de zone client donnée

    GetClientRect() + MapWindowPoints() pour retrouver la position de la zone client d'une fenêtre sur l'écran
    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.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    si j'ai bien compris ce que tu demandes il faut travailler avec GetSystemMetrics
    Code : 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
     
    // -------------------------------------------------------------------
    void GetCaptionRect(CWnd *pWnd,CRect& rect)
    {		
    	DWORD dwStyle=pWnd->GetStyle();
     
    	CSize szFrame=(dwStyle & WS_THICKFRAME) ?	
    		CSize(GetSystemMetrics(SM_CXSIZEFRAME), GetSystemMetrics(SM_CYSIZEFRAME)) :
    		CSize(GetSystemMetrics(SM_CXFIXEDFRAME), GetSystemMetrics(SM_CYFIXEDFRAME));
     
    	// coordonnée fenetre	
    	pWnd->GetWindowRect(rect);		
    	// mise a l'origine 0,0
    	rect-=CPoint(rect.left,rect.top);	
    	// frame
    	rect.left+=szFrame.cx;				
    	// frame
    	rect.right-=szFrame.cx;				
    	// top 
    	rect.top+=szFrame.cy;				
    	// height:tient compte si TOOLWINDOW 
    	rect.bottom=rect.top+
    		(((pWnd->GetExStyle() & WS_EX_TOOLWINDOW)==WS_EX_TOOLWINDOW) ? 
    		GetSystemMetrics(SM_CYSMCAPTION) : GetSystemMetrics(SM_CYCAPTION))-
    		GetSystemMetrics(SM_CYBORDER);
     
    	if(pWnd->IsIconic())
    	{
    		rect.InflateRect(1,1,1,-1);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int n=GetSystemMetrics(SM_CYCAPTION);
    	CRect r;
    	GetCaptionRect(this,r);	
    	CString str;
    	str.Format("SystemMetrics:%d GetCaptionRect:%d",n,r.Height());
    	AfxMessageBox(str);

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 79
    Points : 60
    Points
    60
    Par défaut
    Merci pour vos réponses je vais essayer ça.

    farscape j'aimerais bien utiliser ton morceau de code mais je ne peux me servir des MFC par contre... J'ai tenté de remplacer par cela :
    Code : 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
     
    void GetCaptionRect(HWND *pWnd, RECT & rect)
    {      
       DWORD dwStyle = pWnd->GetStyle();
     
       SIZE szFrame;
       if (dwStyle & WS_THICKFRAME)
       {
          szFrame.cx = GetSystemMetrics(SM_CXSIZEFRAME);
    	  szFrame.cy = GetSystemMetrics(SM_CYSIZEFRAME);
       }
       else
       {
          szFrame.cx = GetSystemMetrics(SM_CXFIXEDFRAME);
    	  szFrame.cy = GetSystemMetrics(SM_CYFIXEDFRAME);
       }
     
       // coordonnée fenetre   
       pWnd->GetWindowRect(rect);      
       // mise a l'origine 0,0
       rect.left = 0;
       rect.top = 0;
       // frame
       rect.left+=szFrame.cx;            
       // frame
       rect.right-=szFrame.cx;            
       // top
       rect.top+=szFrame.cy;            
       // height:tient compte si TOOLWINDOW
       rect.bottom=rect.top+
          (((pWnd->GetExStyle() & WS_EX_TOOLWINDOW)==WS_EX_TOOLWINDOW) ?
          GetSystemMetrics(SM_CYSMCAPTION) : GetSystemMetrics(SM_CYCAPTION))-
          GetSystemMetrics(SM_CYBORDER);
     
       if(pWnd->IsIconic())
       {
          rect.InflateRect(1,1,1,-1);
       }
    }
    Il reste des erreurs : les fonctions GetStyle(), GetWindowRect(), GetExStyle(), IsIconic(), InflateRect() ...

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais que cherches-tu à faire exactement?
    Retrouver les coordonnées de la client area par rapport à l'écran?
    Si oui, cf mon post.
    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 éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Tu as aussi les api SetWindowPlacement() and GetWindowPlacement()

Discussions similaires

  1. Agrandir une fenêtre sur deux écrans
    Par SheikYerbouti dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/04/2013, 09h24
  2. Lancer une fenêtre sur un écran/bureau particulier
    Par lovecpp dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 01/10/2012, 16h17
  3. une fenêtre sur un écran particulier avec héritage
    Par _Agrid dans le forum Débuter
    Réponses: 0
    Dernier message: 04/04/2009, 14h07
  4. [c++] Obtenir la position d'une fenêtre sur l'écran
    Par Silverstone dans le forum Windows
    Réponses: 2
    Dernier message: 05/09/2006, 16h11
  5. Comment centrer une fenêtre sur l'écran?
    Par bygui dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 07/04/2006, 10h25

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