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# Discussion :

Redimensionnement proportionnel d'une fenêtre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 8
    Par défaut Redimensionnement proportionnel d'une fenêtre
    Bonjour,

    j'éprouve quelques difficultés pour redimensionner ma fenêtre afin de garder la proportion hauteur/largeur. J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Size OldSize = new Size(212,156);
     
    private void Form1_Resize(object sender, EventArgs e)
    {
        float prop;
        prop = (float)this.Size.Width / (float)OldSize.Width;
        this.Size = new Size((int)(prop * (float)OldSize.Width), (int)(prop * (float)OldSize.Height));
    }
    Ça fonctionne bien, par contre lors du redimensionnement, l'affichage de la fenêtre "scintille", comme si la fenêtre était dabord redessiné selon la position de la souris (hauteur/largeur), puis ensuite redessiné selon la bonne proportion, ce qui donne l'effet de scintillement lorsqu'on bouge la souris lors du redimensionnement de la fenêtre.

    Comment éviter cet effet de "scintillement" ?

    Merci pour vos suggestions !

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Modifier la Size dans un Resize va réenclencher un nouveau resize.
    Pour éviter ce phénoméne, on aura intéret à ne pas modifiera pas this.Size si la nouvelle taille est est la même que l'actuelle.



    Par ailleurs, il y a peut-être un problème de retour systématique à la Size définie par la souris dès que le redimensionnement se poursuit. Pour résoudre ce problème, une solution consisterait :
    1. Définir une variable TimerCount à -1.
    2. Sur event Resize et si TimerCount=-1 : lancer un timer de 500 millisecondes et assigner la valeur 0 à TimerCount
    3. Sur event Resize et si TimerCount=-2 (voir étape 6) : ne rien faire
    4. Sur event Resize et si TimerCount>=0 : assigner la valeur 0 à TimerCount
    5. Sur un event Timer et et si TimerCount==0 : incrementer le TimerCount.
    6. Sur un event Timer et et si TimerCount==1 (donc 0.5 à 1 seconde après la fin du dernier Resize) : assigner la valeur -2 à TimerCount, arréter le timer, modifier this.Size pour garder la proportion hauteur/largeur, assigner la valeur -1 à TimerCount.

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Autre solution récupérée sur le web depis ce site : http://stoyanoff.info/blog/2010/06/2...-aspect-ratio/
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    public partial class frmTest : Form
    {
        #region Form code
        private void InitializeComponent()
        {
            ClientSize = new System.Drawing.Size(400, 225);
            StartPosition = FormStartPosition.CenterScreen;
            Label label = new Label();
            {
                label.Dock = DockStyle.Fill;
                label.Text = "Resize to begin.";
                label.TextAlign = ContentAlignment.MiddleCenter;
                label.Font = new Font(this.Font.Name, 20);
                Controls.Add(label);
            }
            SizeChanged += delegate
            {
                label.Text = string.Format("Content aspect ratio: {0:N2}:1", ClientSize.Width / (float)ClientSize.Height);
            };
        }
        public frmTest()
        {
            InitializeComponent();
            // Necessary to take the window frame width/height into account
            chromeWidth = Width - ClientSize.Width;
            chromeHeight = Height - ClientSize.Height;
        }
        #endregion
        #region Resizer
        private float constantWidth = 16;
        private float constantHeight = 9;
        private int chromeWidth;
        private int chromeHeight;
        // From Windows SDK
        private const int WM_SIZING = 0x214;
        private const int WMSZ_LEFT = 1;
        private const int WMSZ_RIGHT = 2;
        private const int WMSZ_TOP = 3;
        private const int WMSZ_BOTTOM = 6;
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_SIZING)
            {
                RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
                int w = rc.Right - rc.Left - chromeWidth;
                int h = rc.Bottom - rc.Top - chromeHeight;
                switch (m.WParam.ToInt32()) // Resize handle
                {
                    case WMSZ_LEFT:
                    case WMSZ_RIGHT:
                        // Left or right handles, adjust height
                        rc.Bottom = rc.Top + chromeHeight + (int)(constantHeight * w / constantWidth);
                        break;
                    case WMSZ_TOP:
                    case WMSZ_BOTTOM:
                        // Top or bottom handles, adjust width
                        rc.Right = rc.Left + chromeWidth + (int)(constantWidth * h / constantHeight);
                        break;
                    case WMSZ_LEFT + WMSZ_TOP:
                    case WMSZ_LEFT + WMSZ_BOTTOM:
                        // Top-left or bottom-left handles, adjust width
                        rc.Left = rc.Right - chromeWidth - (int)(constantWidth * h / constantHeight);
                        break;
                    case WMSZ_RIGHT + WMSZ_TOP:
                        // Top-right handle, adjust height
                        rc.Top = rc.Bottom - chromeHeight - (int)(constantHeight * w / constantWidth);
                        break;
                    case WMSZ_RIGHT + WMSZ_BOTTOM:
                        // Bottom-right handle, adjust height
                        rc.Bottom = rc.Top + chromeHeight + (int)(constantHeight * w / constantWidth);
                        break;
                }
                Marshal.StructureToPtr(rc, m.LParam, true);
            }
            base.WndProc(ref m);
        }
        #endregion
    }

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2010
    Messages : 8
    Par défaut
    Merci Graffito,

    J'ai essayé la solution trouvé sur le site http://stoyanoff.info/blog/2010/06/2...-aspect-ratio/.

    Quoique je n'y comprend pas grand chose (!!!), ça fonctionne très bien !!

    Merci encore !

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Quoique je n'y comprend pas grand chose (!!!),
    Le principe est de capturer l'event windows avant son traitement par l'appli.
    On identifie les event de Resizing, et dans ce cas on modifie les param height et width de l'event avant d'effectuer le traitement standard de l'event.

    Le code définit les variable "chrome", pour garder le ratio sur la zone client (hors bandeau) et non sur la forme totale.

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

Discussions similaires

  1. Redimensionnement automatique d'une fenêtre
    Par _fav_ dans le forum Débuter
    Réponses: 3
    Dernier message: 27/07/2010, 11h15
  2. Redimensionner taille d'une fenêtre vb net
    Par mp59100 dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/05/2010, 12h41
  3. redimensionnement proportionnel d'une fenêtre Tk
    Par regnier1 dans le forum Tkinter
    Réponses: 6
    Dernier message: 29/03/2008, 10h05
  4. [C#]Dimensionnement proportionnel d'une fenêtre
    Par Lucier dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/12/2006, 13h38
  5. Redimensionnement d'une fenêtre Directx
    Par Francky033 dans le forum DirectX
    Réponses: 2
    Dernier message: 28/09/2003, 17h53

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