Visual Studio C #: изменение фонового изображения формы при перемещении курсора к определенной координате, вызывающей нехватку памяти. Как это исправить? - PullRequest
1 голос
/ 10 июня 2019

Я хотел бы написать приложение, которое меняет свое фоновое изображение при перемещении курсора в определенное место (координату).Пример:

  • Переместите курсор вправо от экрана, затем измените фон на A.png, переместите курсор влево от экрана, затем измените фон на B.png.

Я написал код, он работал, но у меня есть некоторые проблемы:

  • Фоновое изображение продолжает мигать (как будто оно постоянно загружает это изображение)
  • Через некоторое время оновылетает, и я получаю сообщение об ошибке «недостаточно памяти» в режиме отладки Visual Studio.

Как это исправить?

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread ChangeBackgroundThread = new Thread(ChangeBackground);
            ChangeBackgroundThread.Start();

        }

        private void ChangeBackground()
        {
            while (true)
            {
                if (MousePosition.X <= 960)
                {
                    this.BackgroundImage = Image.FromFile(Path.Combine("F:/test", "A.png"));
                }
                else
                {
                    this.BackgroundImage = Image.FromFile(Path.Combine("F:/test", "B.png"));
                }
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Попробуйте попробовать что-то вроде этого:

private Image ImgA;
private Image ImgB;
private Boolean? BackgroundA = true;

private void Form1_Load(object sender, EventArgs e)
{
    ImgA = Image.FromFile(Path.Combine("F:/test", "A.png"));
    ImgB = Image.FromFile(Path.Combine("F:/test", "B.png"));
    this.MouseMove += Form1_MouseMove;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    SetBackground();
}

private void SetBackground()
{
    Boolean curA = (MousePosition.X <= 960);
    if (!BackgroundA.HasValue || BackgroundA.Value != curA)
    {
        BackgroundA = curA;
        this.BackgroundImage = BackgroundA.Value ? ImgA : ImgB;
    }
}
1 голос
/ 10 июня 2019

Меняйте фон только тогда, когда его действительно-ДЕЙСТВИТЕЛЬНО нужно изменить. Когда это? Когда предыдущая координата была для старого фона, а новая координата для нового. Итак, вы должны сохранить старую координату, чтобы иметь возможность сравнить ее с новой.

Кроме того, не загружайте изображение каждый раз, когда вы хотите изменить его. Загружайте оба изображения только один раз при запуске программы и выбирайте одно из памяти, когда хотите изменить фон.

Кроме того, вместо цикла while(true) вы должны подписаться на событие MouseMove, чтобы вы не запускали одно ядро ​​процессора до 100% использования. Кричит @ Idle_Mind

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...