.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;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д