Redimensionnement d'une dialogue et déplacement des boutons

Résolu
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 - 20 juin 2004 à 12:05
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 - 20 juin 2004 à 15:35
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 15:23
- forcer affichage une 1ere fois.
- GetWindowRect
- ScreenToClient
- Decalage avec le border size.

ciao...
BruNews, Admin CS, MVP Visual C++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 12:18
MoveWindow calcule dans WM_SIZE.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 13:45
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?
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 13:47
ha et j'ajoute que la largeur et hauteur du bouton ne sont pas (4,4)...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 13:50
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 13:57
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++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 14:02
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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 14:04
Regarde exemple mis plus haut.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 14:08
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 !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 14:22
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++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 14:44
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.
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 14:47
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...)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 15:03
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++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 15:05
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)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juin 2004 à 15:10
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++
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 15:16
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) ?
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2004 à 15:35
ok merci c'est exactement ce que je voulais !!! j'ai essayé la ca marche ;)
0
Rejoignez-nous