Redimensionnement d'une dialogue et déplacement des boutons

Résolu
Signaler
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
j'ai une boite de dialogue avec un bouton en bas a droite, et quand le boite de dialogue est maximisée, j'aimerai que le bouton se trouve a nouveau en bas a droite au lieu de rester a la meme place.
ya til un moyen de faire ca automatiquement?
faut t'il sinon déplacer manuellement le bouton, et si oui comment faire?
merci ;)

17 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
- forcer affichage une 1ere fois.
- GetWindowRect
- ScreenToClient
- Decalage avec le border size.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
MoveWindow calcule dans WM_SIZE.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ok merci mais voila un (petit) probleme
voici un bout de mon code :

// variables globales
int posrelX = 0;
int posrelY = 0;

...
LRESULT CALLBACK MainDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch(message)
   {
      case WM_INITDIALOG:
      {
         RECT Window;
         RECT ButPos;
         GetWindowRect(GetDlgItem(hDlg,IDOK), &ButPos);
         GetWindowRect(hDlg, &Window);
         posrelX = Window.right - ButPos.left;
         posrelY = Window.bottom - ButPos.top;
         return 1;
      }

      case WM_SIZE:
      {
         switch(wParam)
         {
            case SIZE_MAXIMIZED:case SIZE_RESTORED:
            {
               RECT Window;
               RECT ButPos;
               GetWindowRect(GetDlgItem(hDlg,IDOK), &ButPos);
               int iLongueur = ButPos.right - ButPos.left;
               int iHauteur = ButPos.bottom - ButPos.top;
               GetClientRect(hDlg,&Window);
               MoveWindow(GetDlgItem(hDlg,IDOK), Window.right-posrelX+4, Window.bottom+4-posrelY, iLongueur, iHauteur, TRUE);

               break;
            }
         }
      }


le probleme est que si je fais un maximiser, puis restaurer, le boutton ne revient pas exactement au meme endroit sauf avec ce que j'ai fait, cad rajouter 4 en abscisse et 4 en ordonnee dans le movewindow (valeurs trouvées empiriquement).
pourquoi ya til un décalage?? les valeurs trouvées ds le WM_INITDIALOG sont elles non définitives?
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ha et j'ajoute que la largeur et hauteur du bouton ne sont pas (4,4)...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Sers toi de GetClientRect, calcul inutile dans WM_SIZE car contenu dans lParam.

Une dialogbox doit se prototyper en:
BOOL CALLBACK dlgProc
au lieu de LRESULT.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Je viens de me souvenir que j'avais deja mis ici:
http://www.cppfrance.com/code.aspx?ID=10617

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ok j'ai fait comme t'as dit dans WM_SIZE:

      case WM_SIZE:
      {
         switch(wParam)
         {
            case SIZE_MAXIMIZED:case SIZE_RESTORED:
            {
               RECT ButPos;
               GetClientRect(GetDlgItem(hDlg,IDOK), &ButPos);
               int iLongueur = ButPos.right - ButPos.left;
               int iHauteur = ButPos.bottom - ButPos.top;

               int cx = LOWORD(lParam);
               int cy = HIWORD(lParam);

               MoveWindow(GetDlgItem(hDlg,IDOK),cx-posrelX+4,cy-posrelY+4,iLongueur,iHauteur,TRUE);

               break;
            }


maintenant dans WM_INITDIALOG, si je remplace un des GetWindowRect par un GetClientRect, ca me mets le bouton n'importe ou.
et ya tjrs le probleme du décalage.
d'ou ca peut venir?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Regarde exemple mis plus haut.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
uais je l'ai vu, mais toi c'est pas tout a fait pareil, lors de l'initialisation, tu déplaces les boutons avec ta fonction qui calcule leur position.
moi a l'initialisation, je repere le placement relatif du bouton par rapport au bord droit et au bord inférieur du dialogue. et dans le size, je veut les mettre relativement a ces bords du dialogue, avec les valeurs relatives calculées a l'initialisation.

le prob est qu'il y a un petit décalage, et que je ne sais pas d'ou il sort !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
WM_INITDIALOG (ou WM_CREATE) sont des events ou la fenetre n'est pas entierement finie, la GDI attend la fin de ton code pour terminer la fenetre. Faut donc pas se fier a certaines valeurs qui par contre seront valables ulterieurement.
Fais comme dans mon exemple, sera toujours bon et ne necessite aucun code en plus, suffit d'isoler le code de WM_SIZE dans une func pour l'appeler depuis WM_INITDIALOG.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bé la en fait j'ai trouvé d'ou ca vient
dans le WM_SIZE, si je fais cx LOWORD(lParam), il me trouve cx 669, si je fais un GetWindowRect, et cx = Window.right - Window.left, il me trouve cx = 677. et si je fais un GetClientRect il me trouve bien 669.

Donc je suppose que c'est dans le GetWindowRect qui trouve la position relative du bouton par rapport au bord droit du dialogue, (dans le init) que c'est pas bien calculé, vu que visiblement GetWindowRect calcule la position d'une maniere différente ...

que fait exactement GetWindowRect alors? c'est ca que je me demande.
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ha et vu que moveWindow va considérer le déplacement par rapport a la boite de dialogue, ya til un moyen de connaitre le positionnement du bouton par rapport a la boite dialogue ? (autrement qu'en faisant un GetWIndowPos sur la dialogue et le bouton, vu que visiblement ca marche pas bien...)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
GetWindowRect calcule dimensions completes (positionnement y compris) alors que GetClientRect ne donne que hauteur largeur de zone 'client' de la fenetre, celle ou l'on dessine et la seule deja valide dans WM_INITDIALOG.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
et dans ce cas, comment calculer le positionnement relatif d'un bouton dans une boite de dialogue? (cad calculer les valeurs que movewindow prend comme parametres)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
comme j'ai fait dans mon exemple, relatif au bord client.
MoveWindow assigne les valeurs ainsi pour un hwnd 'fille'.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bon en fait ma question etait mal dite. la voila :

comment connaitre le positionnement relatif d'un bouton dans une boite de dialogue (ses coordonnées au sein de la client area de la dialogue) ?
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ok merci c'est exactement ce que je voulais !!! j'ai essayé la ca marche ;)