Bonjour.

visual 2008
xp pack 2

J'ai une application MFC et j'aimerais que cette application ai plusieurs résolution. La résolution standard que j'ai choisi est 1280 par 1024. J'aimerais pouvoir la passer en 1024 par 768.
Pour cela j'ai fait une fonction qui me calcul le ratio entre les deux résolution et après j'utilise des moveWindow pour redimensionner et déplacer mes objets. Mais le problème c'est que mes objets (des fenêtres fille) sont tous décalés. Je ne sais pas quelle référence est prise pour la position (coin haut gauche de l'écran, coin haut gauche de la fenêtre parent...) quand je suis sur une fenêtre fille.

J'appelle ma fonction à la fin de chaque OnInitDialog des fenêtres

Voici ma fonction :

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
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
void AdapterTailleSuivantResolution()
{
  float f_CoeffXMultiplicateur;
  float f_CoeffYMultiplicateur;
  float cx;
  float cy;
 
  //récupération de la résolution (x et y) en cours
  cx = (float)m_p_ConfigurationManager->getCxCible();
  cy = (float)m_p_ConfigurationManager->getCyCible();
 
  //Calcul des coefficients multiplicateur
  f_CoeffXMultiplicateur = cx/m_p_ConfigurationManager->getCxStandard();
  f_CoeffYMultiplicateur = cy/m_p_ConfigurationManager->getCyStandard();
 
  //Si la résolution en cours est inférieur à la résolution 
  //standard (1280*1024) on applique les coefficients à la  
  //taille et à la position de tous les éléments de la fenêtre
  if ((cx < m_p_ConfigurationManager->getCxStandard() || cy < m_p_ConfigurationManager->getCyStandard()))
  {
    POINT coinHGArriveeFenetre;
    CRect rectFenetre;
 
    this->GetWindowRect(&rectFenetre);
 
    //traitement pour la fenetre
    int i_hauteurFenetreDepart = rectFenetre.Height();
    int i_largeurFenetreDepart = rectFenetre.Width();
    int i_hauteurFenetreArrivee = (int)(i_hauteurFenetreDepart*f_CoeffYMultiplicateur);
    int i_largeurFenetreArrivee = (int)(i_largeurFenetreDepart*f_CoeffXMultiplicateur);
 
    coinHGArriveeFenetre.x = (LONG)(rectFenetre.left*f_CoeffXMultiplicateur);
    coinHGArriveeFenetre.y = (LONG)(rectFenetre.top*f_CoeffYMultiplicateur);
 
    this->MoveWindow(coinHGArriveeFenetre.x,coinHGArriveeFenetre.y,i_largeurFenetreArrivee,i_hauteurFenetreArrivee,TRUE);
 
    //Récupération de tous les éléments de la fenêtre
    CWnd *pCtrl=this->GetWindow(GW_CHILD);   
    while(pCtrl)   
    {    
      CRect rect;
      //pCtrl->GetClientRect(&rect);
      pCtrl->GetWindowRect(&rect);
      POINT coinHGDepart;
      POINT coinHGArrivee;
      int i_hauteurDepart;
      int i_largeurDepart;
      int i_hauteurArrivee;
      int i_largeurArrivee;
 
      //traitement pour les éléments de la fenêtre
      i_hauteurDepart = rect.Height();
      i_largeurDepart = rect.Width();
      coinHGDepart.x = rect.left;
      coinHGDepart.y = rect.top;
 
      i_largeurArrivee = (int)(i_largeurDepart*f_CoeffXMultiplicateur);
      i_hauteurArrivee = (int)(i_hauteurDepart*f_CoeffYMultiplicateur);
 
      coinHGArrivee.x = (LONG)((coinHGDepart.x)*f_CoeffXMultiplicateur);
      coinHGArrivee.y = (LONG)((coinHGDepart.y)*f_CoeffYMultiplicateur);
 
      pCtrl->MoveWindow(coinHGArrivee.x,coinHGArrivee.y,i_largeurArrivee,i_hauteurArrivee);
 
      //pCtrl->SetWindowPos(pCtrl,coinHGArrivee.x,coinHGArrivee.y,i_largeurArrivee,i_hauteurArrivee,SWP_SHOWWINDOW);
 
      //pCtrl->RedrawWindow();
 
      pCtrl = pCtrl->GetWindow(GW_HWNDNEXT);
    }//Fin while(pCtrl)  
 
    //this->SetWindowPos(this,coinHGArriveeFenetre.x,coinHGArriveeFenetre.y,i_largeurFenetreArrivee,i_hauteurFenetreArrivee,SWP_SHOWWINDOW);
 
    this->RedrawWindow();
  }
  else
  {
    //Ne rien faire
  }//Fin if 
}//Fin fonction AdapterTailleSuivantResolution()