.NET 4.x Не могу динамически измененить картинку на Windows Forms - C#
Формулировка задачи:
Добрый вечер, как начинающий и совсем зелёный программист столкнулся с проблемой динамического изменения картинки в Windows Forms объект типа PictureBox:
Суть такова: пишу игрушку Life используя в качестве клеток жизни рисунок в PictureBox + параллельный массив объектов для самой логики игры.
Для начала вот код, который работает для размещения живых клеток:
и сами методы отображения:
Код абсолютно рабочий до начала самого процесса игры.
Вот метод который создаёт поток:
И метод самого потока:
А так же метод RefreshFieldUnitFromThread(bool, int int):
этот метод вызывает всё те - же DrawWhiteRect и DrawRedRect, но изменений на картинке нет, я в качестве теста ставил мигалку, но ничего не помогало: как палка была - так и оставалась в одном положении.
Помогите решить проблему, я с трудом понимаю что означает метод Invoke() у формы или pictureBox. (если быть честным - я вообще толком не понял что оно делает, понял что создаёт отдельный поток с делегатом, который сам должен пристроится к UI потоку).
Как эту штуку заставить работать?
private void UnitClick(int x, int y) { bool Check_Life = GameLogic.UnitClick(x, y); if (Check_Life) { DrawRedRect(x*10, y*10); } else { DrawWhiteRect(x*10, y*10); } }
public void DrawRedRect(int x, int y) { graphics.FillRectangle(new System.Drawing.SolidBrush(Color.Red), new Rectangle(x+1, y+1, 9, 9)); pictureBox1.Refresh(); } public void DrawWhiteRect(int x, int y) { graphics.FillRectangle(new System.Drawing.SolidBrush(Color.White), new Rectangle(x + 1, y + 1, 9, 9)); pictureBox1.Refresh(); }
private void StartGame() { speedOfLifeChange = 1000; Generation = 0; gameWork = true; System.Threading.Thread t = new System.Threading.Thread(GameWork); t.Start(); }
private void GameWork() { do { GameLogic.CheckCells(); for (int i = 0; i < GameLogic.Cells.GetLength(0); i++) { for (int c = 0; c < GameLogic.Cells.GetLength(1); c++) { if (GameLogic.Cells[i, c].NextAlive) { RefreshFieldUnitFromThread(true, i * 10, c * 10); } else { RefreshFieldUnitFromThread(false, i * 10, c * 10); } } } GameLogic.UpdateCellsStatus(); Generation++; System.Threading.Thread.Sleep(speedOfLifeChange); } while (gameWork); }
/// <summary> /// Method for GameWork thread /// </summary> /// <param name="unitStatus">If true - then red rectangle, if false - then white.</param> private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y) { switch (unitStatus) { case true: { if (pictureBox1.InvokeRequired) { pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y); } else { DrawRedRect(x*10, y*10); this.Refresh(); } }break; case false: { if (pictureBox1.InvokeRequired) { pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y); } else { DrawWhiteRect(x*10, y*10); this.Refresh(); } }break; } }
Решение задачи: «.NET 4.x Не могу динамически измененить картинку на Windows Forms»
textual
Листинг программы
private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y) { switch (unitStatus) { case true: { this.Invoke(new Action<int, int>(DrawRedRect), x, y); }break; case false: { this.Invoke(new Action<int, int>(DrawWhiteRect), x, y); }break; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д