Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'image dans des PicturesBox

Sujet résolu
    1 mai 2021 à 4:42:51

    Bonjour/Bonsoir à tous, si j'écris ici, c'est que je suis vraiment désespéré, j'ai essayé différentes méthodes mais aucune n'a eu l'effet escompter (A savoir de corriger mon bug d'affichage) J'utilise les WinForms et non le WPF

    Alors voilà, je vous explique j'ai une classe qui contient une PictureBox, jusque là rien de bien méchant :

    public bool _eventPossessesLinked = false;
    		public bool _eventMissingLinked = false;
    
    		private PictureBox _Display = new PictureBox();
    		public AccountDeck(CardDeck cardDeck, List<AccountCard> Cards, bool Possesses = false)
    		{
    			_NormalDeck = cardDeck;
    			_Cards = Cards;
    			_Possesses = Possesses;
    
    			_Cards.FindAll(Card => Card != null).ForEach(Card => Card.SetDeck(this));
    
    			UpdateImage();
    		}
    
    		public void UpdateImage()
    		{
    			_Display.Image = _NormalDeck.GetDisplay().Image;
    			_Display.SizeMode = PictureBoxSizeMode.Zoom;
    			_Display.Size = new Size(355, 199);
    			_Display.Cursor = Cursors.Hand;
    			_Display.MouseUp += _Display_MouseUp;
    			_Display.MouseHover += _Display_MouseHover;
    			_Display.Name = _NormalDeck.GetName();
    		}
    		public void Show(Control Parent)
    		{
    			int Index = Parent.Controls.Count;
    			MessageBox.Show("Nom : " + _Display.Name + "\nPosition : " + _Display.Location.X + ";" + _Display.Location.Y + "\nNom du parent : " + _Display.Parent.Name); ;
    			Parent.Controls.Add(_Display);
    			_Display.Location = new Point(0, Index != 0 ? (Index * 199) + (6 * Index) : 0);
    		}
    		private void _Display_MouseHover(object sender, EventArgs e)
    		{
    			if(_Possesses)
    				new InformationForm(_Display, "Clic gauche : Retirer le set\nClic droit : Ouvrir le set");
    		}
    		private void _Display_MouseUp(object sender, MouseEventArgs e)
    		{
    			if(_Possesses)
    			{
    				if (e.Button == MouseButtons.Left)
    				{
    					PossessesDeckPicked(e);
    					
    				}
    				else if (e.Button == MouseButtons.Right)
    				{
    					if (_Cards.Count > 0)
    					{
    						Control parent = _Display.Parent;
    						_Display.Parent.Controls.Clear();
    						_Cards.FindAll(AccountCard => AccountCard != null).ForEach(AccountCard => AccountCard.Show(parent));
    						MessageBox.Show(parent.Controls.Count + "/" + _Cards.Count);
    					}
    					else
    						new CustomMessageBox("Ce set ne contient aucune carte", CustomMessageBox.MessageBoxType.Neutral);
    				}
    			}
    			else
    			{
    				if(e.Button == MouseButtons.Left)
    				{
    					MissingDeckPicked(e);
    				}
    			}
    		}
    
    		#region Setters
    		public void SetState(bool newValue) {
    			_Possesses = newValue;
    		}
    		#endregion
    		#region Getters
    		public string GetName() {
    			return _NormalDeck.GetName();
    		}
    		public CardDeck GetNormalDeck() {
    			return _NormalDeck;
    		}
    		public PictureBox GetDisplay() {
    			return _Display;
    		}
    		public List<AccountCard> GetCards() {
    			return _Cards;
    		}
    		public bool IsPossesses() {
    			return _Possesses;
    		}
    
    		#endregion
    
    		#region Events
    		public event EventHandler deleteEvent;
    		public event MouseEventHandler onPossessesDeckPicked;
    		public event MouseEventHandler onMissingDeckPicked;
    		protected virtual void onDelete(EventArgs e)
    		{
    			EventHandler handler = deleteEvent;
    			if (handler != null)
    			{
    				handler(this, e);
    			}
    		}
    		protected virtual void PossessesDeckPicked(MouseEventArgs e)
    		{
    			MouseEventHandler handler = onPossessesDeckPicked;
    			if (handler != null)
    			{
    				handler(this, e);
    			}
    		}
    		protected virtual void MissingDeckPicked(MouseEventArgs e)
    		{
    			MouseEventHandler handler = onMissingDeckPicked;
    			if (handler != null)
    			{
    				handler(this, e);
    			}
    		}
    		#endregion

    Ce qui nous intéressent réellement dans cette classe c'est ceci : 

    public bool _eventPossessesLinked = false;
    public bool _eventMissingLinked = false;
    
    private PictureBox _Display = new PictureBox();
    
    
    ...
    
    public void UpdateImage()
    {
        _Display.Image = _NormalDeck.GetDisplay().Image;
        _Display.SizeMode = PictureBoxSizeMode.Zoom;
        _Display.Size = new Size(355, 199);
        _Display.Cursor = Cursors.Hand;
        _Display.MouseUp += _Display_MouseUp;
        _Display.MouseHover += _Display_MouseHover;
        _Display.Name = _NormalDeck.GetName();
    }
    		public void Show(Control Parent)
    		{
    			int Index = Parent.Controls.Count;
    			MessageBox.Show("Nom : " + _Display.Name + "\nPosition : " + _Display.Location.X + ";" + _Display.Location.Y + "\nNom du parent : " + _Display.Parent.Name); ;
    			Parent.Controls.Add(_Display);
    			_Display.Location = new Point(0, Index != 0 ? (Index * 199) + (6 * Index) : 0);
    		}
    ...
    
    private void _Display_MouseUp(object sender, MouseEventArgs e)
    		{
    			if(_Possesses)
    			{
    				if (e.Button == MouseButtons.Left)
    				{
    					PossessesDeckPicked(e);
    					
    				}
    				else if (e.Button == MouseButtons.Right)
    				{
    					if (_Cards.Count > 0)
    					{
    						Control parent = _Display.Parent;
    						_Display.Parent.Controls.Clear();
    						_Cards.FindAll(AccountCard => AccountCard != null).ForEach(AccountCard => AccountCard.Show(parent));
    						MessageBox.Show(parent.Controls.Count + "/" + _Cards.Count);
    					}
    					else
    						new CustomMessageBox("Ce set ne contient aucune carte", CustomMessageBox.MessageBoxType.Neutral);
    				}
    			}
    			else
    			{
    				if(e.Button == MouseButtons.Left)
    				{
    					MissingDeckPicked(e);
    				}
    			}
    		}
    
    
    		public event MouseEventHandler onPossessesDeckPicked;
    		public event MouseEventHandler onMissingDeckPicked;
    
    protected virtual void PossessesDeckPicked(MouseEventArgs e)
    		{
    			MouseEventHandler handler = onPossessesDeckPicked;
    			if (handler != null)
    			{
    				handler(this, e);
    			}
    		}
    		protected virtual void MissingDeckPicked(MouseEventArgs e)
    		{
    			MouseEventHandler handler = onMissingDeckPicked;
    			if (handler != null)
    			{
    				handler(this, e);
    			}
    		}
    
    

    (UpdateImage est appelé dans le constructeur)

    J'explique mon code même si rien de bien compliqué en réalité

    Show(Control Parent) est une classe qui permet d'afficher la PictureBox '_Display' dans un parent avec une position adéquate.

    L'event _MouseUp de _Display lui sert à envoyer un événnement que j'ai créer pour ma classe.

    Ceci est le code du formulaire dans lequel la PictureBox de ma classe est affiché :

    public AccountCardManager(Account Account)
    		{
    			InitializeComponent();
    			new CustomBar(this);
    			CornerClass.Corner(this);
    			Controls.OfType<GroupBox>().ToList().ForEach(delegate (GroupBox GroupBox) { GroupBox.Controls.OfType<Panel>().ToList().ForEach(Panel => CornerClass.Corner(Panel)); });
    			Controls.OfType<GroupBox>().ToList().ForEach(delegate (GroupBox GroupBox) { GroupBox.Controls.OfType<Panel>().ToList().ForEach(Panel => Panel.Controls.Clear()); });
    			_Account = Account;
    			Text = Account.GetPseudo() + " - Gestionnaire de carte";
    
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardPossessesPanel); if (!accountDeck._eventPossessesLinked) { accountDeck.onPossessesDeckPicked += AccountDeck_onPossessesDeckPicked; accountDeck._eventPossessesLinked = true; } });
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => !accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardMissingPanel); if (!accountDeck._eventMissingLinked) { accountDeck.onMissingDeckPicked += AccountDeck_onMissingDeckPicked; accountDeck._eventMissingLinked = true; } });
    		}
    		private void AccountDeck_onMissingDeckPicked(object sender, MouseEventArgs e)
    		{
    			MessageBox.Show("Je recois l'event MissingDeckPicked");
    			Controls.OfType<GroupBox>().ToList().ForEach(delegate (GroupBox GroupBox) { GroupBox.Controls.OfType<Panel>().ToList().ForEach(Panel => Panel.Controls.Clear()); });
    			((AccountDeck)sender).SetState(true);
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardPossessesPanel); if (!accountDeck._eventPossessesLinked) { accountDeck.onPossessesDeckPicked += AccountDeck_onPossessesDeckPicked; accountDeck._eventPossessesLinked = true; } });
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => !accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardMissingPanel); if (!accountDeck._eventMissingLinked) { accountDeck.onMissingDeckPicked += AccountDeck_onMissingDeckPicked; accountDeck._eventMissingLinked = true; } });
    		}
    
    		private void AccountDeck_onPossessesDeckPicked(object sender, MouseEventArgs e)
    		{
    			MessageBox.Show("Je recois l'event PossessesDeckPicked");
    			Controls.OfType<GroupBox>().ToList().ForEach(delegate (GroupBox GroupBox) { GroupBox.Controls.OfType<Panel>().ToList().ForEach(Panel => Panel.Controls.Clear()); });
    			((AccountDeck)sender).SetState(false);
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardPossessesPanel); if (!accountDeck._eventPossessesLinked) { accountDeck.onPossessesDeckPicked += AccountDeck_onPossessesDeckPicked; accountDeck._eventPossessesLinked = true; }});
    			_Account.GetDecks().FindAll(accountDeck => accountDeck != null).FindAll(accountDeck => !accountDeck.IsPossesses()).ForEach(delegate (AccountDeck accountDeck) { accountDeck.Show(setsOrCardMissingPanel); if (!accountDeck._eventMissingLinked) { accountDeck.onMissingDeckPicked += AccountDeck_onMissingDeckPicked; accountDeck._eventMissingLinked = true; }});
    		}

    J'explique aussi un peu 

    Les longues lignes sont tout simplement le coeur de l'affichage des PictureBoxs de mes classes 'AccountDeck'

    _Account représente une liste de compte, dans chaque compte il y'a une liste de classe du type 'AccountDeck' on voit que je récupère une liste des classes dont la valeur IsPossesses est true ou false, ensuite j'appelle simplement la fonction Show de ma classe AccountDeck qui permet d'afficher ma pictureBox _Display dans son parent (en l'occurence 'setsOrCardPossessesPanel') a la fin il y'a une condition : Si l'objet itéré actuellement à pour valeur false à la variable _eventPossessesLinked alors on ajoute un MouseEveentHandler (voilà à quoi servent les events de la classe 'AccountDeck')

    Et voilà les différent résultats :

    J'ouvre pour la TOUTE première fois le formulaire :

    La fonction Show() de ma classe 'AccountDeck' qui m'envoie ce message

    Ma form s'ouvre :

    Au dessus l'interface de base (Oui je sais, j'suis pas graphiste !) 

    Je viens d'effectuer un clic gauche sur la PictureBox 'Test1'

    Voilà le résultat que j'obtiens, je ferme le formulaire

    Je ré-ouvre mon formulaire, voilà le résultat que j'obtiens

    J'ai de nouveau cliqué sur la PictureBox 'Test1' (Qui se trouvé alors à gauche)

    Toutes les classes 'AccountDeck' ont été traitées par la grosse ligne qui fait peur ^^ Et je n'ai plus aucun affichage de mes PictureBox, pourtant comme peut le signifier la MessageBox à l'écran, la position est correcte, et le parent aussi

    Je referme le formulaire..

    Et là toutes mes PicturesBoxs se réaffichent correctement.

    PS : Je tiens à dire que si je ne ferme jamais le formulaire, je peux m'amuser à cliquer sur toutes les PictureBox que je veux, ça fonctionne parfaitement, elles naviguent de gauche à droite sans aucun soucis

    Je ne parviens pas à comprendre d'où vient le problème..

    Merci d'avoir lu cet appel au secours, en espérant trouver quelqu'un qui à une idée par ici.

    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2021 à 22:04:40

      Sujet Résolu ? Quel était le problème en fin de compte ? Merci
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        2 mai 2021 à 1:47:56

        Bonjour bacelar, en fait c'était simplement un problème d'event (Comme je le pensais au tout début) en fait, le truc c'est que les PictureBoxs changeaient de parent lors d'un click donc les events qui leurs (les PicturesBox) étaient liés se supprimer automatiquement, sauf qu'à chaque clic (Ou appel d'event custom) je re-linkais pour toutes les PicturesBoxs un nouvel event au lieu de gérer l'event pour ET UNIQUEMENT pour la picturebox liée à l'event, j'avais surement une pile d'event qui se stackaient, et lors de la fermeture de la form, les events étaient toujours link (Je pense que tu as une bien plus grande expérience dans les events que moi) donc quand je réouvrais ma form et que je cliquais de nouveau sur un event, mon event se déclenchais effectivement mais le dernier event de la pile appelais la methode 'Show' de ma classe 'AccountDeck' et donc il affichait la PictureBox liée à l'event dans un container parent qui lui n'était plus affiché

        Je sais pas si j'ai était assez clair, mais pour faire le plus simple : 

        Je faisais se stackais des events, ces events lorsque déclenchait appelé une fonction qui devait les afficher dans le parent lié, parent qui avait été "Dispose" (Entre grosse guillemets) mais qui en tout cas n'était pas le parent rendu à l'écran, ma picturebox passait effectivement par le bon parent, mais les events qui passait après ajouté ma PictureBox sur un autre parent.

        • Partager sur Facebook
        • Partager sur Twitter

        Problème d'image dans des PicturesBox

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown