.NET 4.x Не могу динамически измененить картинку на Windows Forms - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, как начинающий и совсем зелёный программист столкнулся с проблемой динамического изменения картинки в Windows Forms объект типа PictureBox: Суть такова: пишу игрушку Life используя в качестве клеток жизни рисунок в PictureBox + параллельный массив объектов для самой логики игры. Для начала вот код, который работает для размещения живых клеток:
Листинг программы
  1. private void UnitClick(int x, int y)
  2. {
  3. bool Check_Life = GameLogic.UnitClick(x, y);
  4. if (Check_Life)
  5. {
  6. DrawRedRect(x*10, y*10);
  7. }
  8. else
  9. {
  10. DrawWhiteRect(x*10, y*10);
  11. }
  12. }
и сами методы отображения:
Листинг программы
  1. public void DrawRedRect(int x, int y)
  2. {
  3. graphics.FillRectangle(new System.Drawing.SolidBrush(Color.Red), new Rectangle(x+1, y+1, 9, 9));
  4. pictureBox1.Refresh();
  5. }
  6.  
  7. public void DrawWhiteRect(int x, int y)
  8. {
  9. graphics.FillRectangle(new System.Drawing.SolidBrush(Color.White), new Rectangle(x + 1, y + 1, 9, 9));
  10. pictureBox1.Refresh();
  11. }
Код абсолютно рабочий до начала самого процесса игры. Вот метод который создаёт поток:
Листинг программы
  1. private void StartGame()
  2. {
  3. speedOfLifeChange = 1000;
  4. Generation = 0;
  5. gameWork = true;
  6. System.Threading.Thread t = new System.Threading.Thread(GameWork);
  7. t.Start();
  8. }
И метод самого потока:
Листинг программы
  1. private void GameWork()
  2. {
  3. do
  4. {
  5. GameLogic.CheckCells();
  6. for (int i = 0; i < GameLogic.Cells.GetLength(0); i++)
  7. {
  8. for (int c = 0; c < GameLogic.Cells.GetLength(1); c++)
  9. {
  10. if (GameLogic.Cells[i, c].NextAlive)
  11. {
  12. RefreshFieldUnitFromThread(true, i * 10, c * 10);
  13. }
  14. else
  15. {
  16. RefreshFieldUnitFromThread(false, i * 10, c * 10);
  17. }
  18. }
  19. }
  20. GameLogic.UpdateCellsStatus();
  21. Generation++;
  22. System.Threading.Thread.Sleep(speedOfLifeChange);
  23. } while (gameWork);
  24. }
А так же метод RefreshFieldUnitFromThread(bool, int int):
Листинг программы
  1. /// <summary>
  2. /// Method for GameWork thread
  3. /// </summary>
  4. /// <param name="unitStatus">If true - then red rectangle, if false - then white.</param>
  5. private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y)
  6. {
  7. switch (unitStatus)
  8. {
  9. case true:
  10. {
  11. if (pictureBox1.InvokeRequired)
  12. {
  13. pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y);
  14. }
  15. else
  16. {
  17. DrawRedRect(x*10, y*10);
  18. this.Refresh();
  19. }
  20. }break;
  21. case false:
  22. {
  23. if (pictureBox1.InvokeRequired)
  24. {
  25. pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y);
  26. }
  27. else
  28. {
  29. DrawWhiteRect(x*10, y*10);
  30. this.Refresh();
  31. }
  32. }break;
  33. }
  34. }
этот метод вызывает всё те - же DrawWhiteRect и DrawRedRect, но изменений на картинке нет, я в качестве теста ставил мигалку, но ничего не помогало: как палка была - так и оставалась в одном положении. Помогите решить проблему, я с трудом понимаю что означает метод Invoke() у формы или pictureBox. (если быть честным - я вообще толком не понял что оно делает, понял что создаёт отдельный поток с делегатом, который сам должен пристроится к UI потоку). Как эту штуку заставить работать?

Решение задачи: «.NET 4.x Не могу динамически измененить картинку на Windows Forms»

textual
Листинг программы
  1. private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y)
  2.         {
  3.             switch (unitStatus)
  4.             {
  5.                 case true:
  6.                     {
  7.                         this.Invoke(new Action<int, int>(DrawRedRect), x, y);
  8.                     }break;
  9.                 case false:
  10.                     {
  11.                         this.Invoke(new Action<int, int>(DrawWhiteRect), x, y);
  12.                     }break;
  13.  
  14.             }
  15.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы