перемещение изображения на другое изображение - PullRequest
0 голосов
/ 27 августа 2011
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace d3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Image = Image.FromFile("C:\\Users\\ocean\\Desktop\\deneme.png");
            pictureBox1.Location = new Point(0, 0);
            pictureBox2.Image = Image.FromFile("C:\\Users\\ocean\\Desktop\\pul1.png");
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            Graphics theGraphics = Graphics.FromHwnd(this.Handle);

            for (int i = 0; i < 200; i += 5)
            {
                pictureBox2.Location = new Point(i, 100);
                theGraphics.Flush();

                System.Threading.Thread.Sleep(50);
                pictureBox2.Invalidate();
            }           
        }
    }
}

В этом коде картинка box2 движется нормально, но изображение предыдущих местоположений остается включенным, пока цикл не завершится. Когда цикл закончится, старые части будут удалены. Я не хочу, чтобы предыдущие рисунки были в цикле, я просто хочу перейти на pictureBox1. Я новичок в C #, поэтому, пожалуйста, помогите мне :) В J2Me я использовал flushgraphics, но здесь я попробовал, и это не сработало, и если вы можете привести пример, я буду счастлив.

1 Ответ

1 голос
/ 27 августа 2011

В C #, как и в Swing, если вы находитесь в пользовательском интерфейсе или в потоке событий, то ничего, что вы измените, не будет замечено пользователем, пока вы не закончите.

Итак, если вы хотите переместить их, лучше всего начать с выхода из потока пользовательского интерфейса, создания нового потока, а затем пройти через цикл.

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

Вот почему ваш сон не работает, вы просто кладете поток событий в сон, кстати.

Какую версию C # вы используете? Существует множество вариантов создания потока и работы с потоком пользовательского интерфейса.

Вот ссылка на создание темы: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx

Вот способ разобраться с тем, как вернуться в поток пользовательского интерфейса:

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/17/91685.aspx.

Например, чтобы создать поток, вы можете сделать это из http://www.rvenables.com/2009/01/threading-tips-and-tricks/

Я делаю свои темы таким образом, чтобы мне было проще видеть, что происходит.

 (new Thread(() => {
        DoLongRunningWork();
        MessageBox.Show("Long Running Work Finished!");
    }) { Name = "Long Running Work Thread",
        Priority = ThreadPriority.BelowNormal }).Start();

Наиболее полным ответом о том, как выполнить обновление в потоке пользовательского интерфейса, был бы этот вопрос:

Как обновить графический интерфейс из другого потока в C #?

UPDATE:

Для части, в которой указано выполнение длительной работы, вы можете добавить это перед блоком потока:

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Тогда вы можете сделать это в своей теме:

(new Task(() =>
    {
        //copy pixel
        pictureBox2.Invalidate();  // You may want to just invalidate a small block                 around the pixel being changed, or every some number of changes.
    }))
.Start(uiScheduler);

Делая эти изменения, вы можете упростить внесение необходимых изменений, но некоторые из них могут быть более сложными, чем вы хотите, поэтому я дал несколько других ссылок, чтобы дать больше информации. Но, для более подробной информации об использовании Task, вы можете посмотреть этот отличный блог:

http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/

...