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++Builder Discussion :

redimensionnement d'une fiche et de ses controles


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 3
    Points : 3
    Points
    3
    Par défaut redimensionnement d'une fiche et de ses controles
    bonjour,

    bon la question a peut etre ete aborde ici mais après une recherche infructueuse dans le forum je la pose.
    j ai une forme avec une serie de controle (bouton, Tedit etc...).
    je voudrais que l ensemble soit redimensionner quand l utilisateur redimensionne la fiche.

    pour le moment j ai des valeur par defaut et mes control garde la meme taille et reste dans le coin en haut a gauche.

    j ai bien essayer de modifier les propriete des anchor et align mais je n obtiens jamais le bon resultat. (ie un zoom sur tout)
    j ai aussi implementer une boucle dans la fonction formresize de ma classe derive de form du style :
    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
     
    //width et Height propriete de la form
    wModif=Width/dWidthInit; //dWidthInit taille de la form a la creation
      hModif=Height/dHeightInit; //idem pour la hauteur
     
      TControl *pCtrl;
      for (int i=0;i<ComponentCount;++i)
      {
        if (pCtrl = dynamic_cast<TControl *>(Components[i]))
        {
          pCtrl->Width *= wModif;
          pCtrl->Height *= hModif;
          pCtrl->Left *= wModif;
          pCtrl->Top *= hModif;
        }
      }
    (d ailleur merci le forum )
    mais cela ne donne rien de bon.
    Si quelqu un a la solution : je suis sur qu avec les anchor et align c est jouable mais je seche...

    merci d avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !
    Le mieux serait peut-être de créer des objets dérivés des objets que tu
    utilises en leur ajoutant :
    - des propriétés pour mémoriser les valeurs initiales qui vont fluctuer avec
    le redimensionnement de la fiche
    - une méthode qui va les redimmensionner.
    En effet, si tu travailles directement sur les paramètres sans en avoir
    mémorisé la valeur initiale tu risques de dégrader ta présentation au fil
    des redimmensionnements.
    Ce n'est ni compliqué à faire et ni la mer à boire même si tu utilises beaucoup
    d'objets de classes différentes ! En tout cas, ce serait plus propre !
    Si un exemple intéresse quelqu'un... j'en ai un tout prêt ! Seul bémol, je ne
    sais pas appliquer le raisonnement sur des objets de la VCL qui sont construits
    avec de multiples objets et dont les propriétés ne sont pas accessibles comme
    par exemple la largeur ou la hauteur des scrollbars (selon que Vertical ou
    Horizontal) d'un TMemo etc...

    Exemple d'une class RPanel dérivée de TPanel :

    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
    class RPanel : public TPanel
    {
    public :
    int IniTop;
    int IniLeft;
    int IniHeight;
    int IniWidth;
                __fastcall RPanel(  TWinControl *O,
                 //le propriétaire de l'objet
                                    int T,  //Top initial
                                    int L,  //Left initial
                                    int W,  //Width initial
                                    int H,  //Height initial
                                    TWinControl *P,  //Le parent de l'objet
                                    );
                __fastcall ~RPanel();
                void __fastcall ReDim(double *W, double *H);
    };
     
    __fastcall RPanel::RPanel(TWinControl *C, int T, int L, int W,
                                                        int H, TWinControl *P)
        : TPanel(C)
    {
    //Initialisation des propriétés des objets de base
    Top = T; Left = L; W = Width; Height = H; Parent = P;
    //Report des valeurs dans les propriétés de mémorisation de la nouvelle classe
    IniTop = T; IniLeft = L; IniWidth = W; IniHeight = H;
    //Eventuellement modifier les propriétés qui doivent l'être...
    }
     
    void __fastcall RPanel::ReDim(double *W, double *H)
    {
    //Réactualisation des paramètres : nouvelle valeur = valeur intiale * facteur
    Left = (int)((double)IniLeft *  *W);
    Width = (int)((double)IniWidth *  *W);
    Top = (int)((double)IniTop *  *H);
    Height = (int)((double)IniHeight *  *H);
    }

    A plus !

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Tu peux intercepter le message WM_WINDOWPOSCHANGED et faire ton calcul à ce moment.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Tu peux aussi utiliser la méthode en réponse à OnResize de la form.
    A plus !

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [RESOLU]
    cool,

    merci a tous pour vos reponse : désolé du retard avec lequel je poste
    bon pour la solution j ai combiné plusieur truc
    d abord a l initialisation de ma class dérivé de TForm je stock les valeur initial pour chaque objet de la fenetre et leur positions. (hauteur et largeur de la fenetre comprise) stocker dans et ensuite sur chaque appel de OnResize je refait un calcul de largeur, hauteur et position pour chaque objet via une boucle :

    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
     
    void __fastcall TFenetreType::WinResize(void)
    {
       //ajustement de la taille
      double wModif,hModif;
      wModif=(double)ClientWidth/iWidthInit;
      hModif=(double)ClientHeight/iHeightInit;
      TControl *pCtrl;
      for (int i=0;i<ComponentCount;i++)
      {
        if (pCtrl = dynamic_cast<TControl *>(Components[i]))
        {
          pCtrl->Width  = (int) (pTabpCtrl[i][0]*wModif);
          pCtrl->Height = (int) (pTabpCtrl[i][1]*hModif);
          pCtrl->Left   = (int) (pTabpCtrl[i][2]*wModif);
          pCtrl->Top    = (int) (pTabpCtrl[i][3]*hModif);
        }
      }
    }
    ca marche. l affichage est de bonne qualité pas de dégradation au d=fur et a mesure des redimensionnement.
    Le seul probleme c est les text il faudrait que je redimensionne les polices. pas grand chose a rajouter quoi.

    encore merci

    a+

    ludo

  6. #6
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Pour les polices, j'ai ajouté un petit bout de code et ca semble marcher :
    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
     
            TControl *pCtrl;
            for (int i=0;i<ComponentCount;++i)
            {
              if (pCtrl = dynamic_cast<TControl *>(Components[i]))
              {
                pCtrl->Width *= wModif;
                pCtrl->Height *= hModif;
                pCtrl->Left *= wModif;
                pCtrl->Top *= hModif;
              }
              TLabel *pLb;
              if (pLb = dynamic_cast<TLabel *>(Components[i]))
              {
                pLb->Font->Size *= wModif;
              }
            }
    Merci pour l'idée
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2011, 15h58
  2. Réponses: 8
    Dernier message: 01/04/2010, 23h27
  3. Réponses: 5
    Dernier message: 18/08/2008, 09h49
  4. bloquer le redimensionnement d'une fiche
    Par nkd dans le forum Composants VCL
    Réponses: 3
    Dernier message: 24/04/2006, 12h48
  5. Comment lancer une appli sans afficher ses fiches
    Par raoulmania dans le forum Langage
    Réponses: 5
    Dernier message: 02/09/2005, 18h07

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