C# 在另一个图像上移动图像 使用系统; 使用System.Collections.Generic; 使用系统组件模型; 使用系统数据; 使用系统图; 使用System.Linq; 使用系统文本; 使用System.Windows.Forms; 命名空间d3 { 公共部分类Form1:Form { 公共表格1() { 初始化组件(); pictureBox1.Image=Image.FromFile(“C:\\Users\\ocean\\Desktop\\deneme.png”); pictureBox1.位置=新点(0,0); pictureBox2.Image=Image.FromFile(“C:\\Users\\ocean\\Desktop\\pul1.png”); } 鼠标单击时受保护的覆盖无效(鼠标目标e) { Graphics theGraphics=Graphics.FromHwnd(this.Handle); 对于(int i=0;i

C# 在另一个图像上移动图像 使用系统; 使用System.Collections.Generic; 使用系统组件模型; 使用系统数据; 使用系统图; 使用System.Linq; 使用系统文本; 使用System.Windows.Forms; 命名空间d3 { 公共部分类Form1:Form { 公共表格1() { 初始化组件(); pictureBox1.Image=Image.FromFile(“C:\\Users\\ocean\\Desktop\\deneme.png”); pictureBox1.位置=新点(0,0); pictureBox2.Image=Image.FromFile(“C:\\Users\\ocean\\Desktop\\pul1.png”); } 鼠标单击时受保护的覆盖无效(鼠标目标e) { Graphics theGraphics=Graphics.FromHwnd(this.Handle); 对于(int i=0;i,c#,winforms,image,move,C#,Winforms,Image,Move,在此代码中,picturebox2正在正常移动,但在循环结束之前,先前位置的图像将保持在上一位置。循环完成后,旧零件将被擦除。我不想以前的画在循环中,我只想继续画下去。我是C#的新手,所以请帮助我:)在J2Me中,我使用了flushgraphics,但在这里我尝试了,但没有成功,如果你能给出一个例子,我会很高兴。在C#中,就像在Swing中一样,如果你在UI或事件线程中,在完成之前,用户不会注意到你所做的任何更改 因此,如果您想移动这些线程,最好的办法是从离开UI线程开始,启动一个新线程,然后完

在此代码中,picturebox2正在正常移动,但在循环结束之前,先前位置的图像将保持在上一位置。循环完成后,旧零件将被擦除。我不想以前的画在循环中,我只想继续画下去。我是C#的新手,所以请帮助我:)在J2Me中,我使用了flushgraphics,但在这里我尝试了,但没有成功,如果你能给出一个例子,我会很高兴。

在C#中,就像在Swing中一样,如果你在UI或事件线程中,在完成之前,用户不会注意到你所做的任何更改

因此,如果您想移动这些线程,最好的办法是从离开UI线程开始,启动一个新线程,然后完成循环

但是,问题是您需要在UI线程上进行更改

这就是为什么你的睡眠不起作用,顺便说一句,你只是将事件线程置于睡眠状态

您使用的是哪个版本的C#?在创建线程和使用UI线程方面有很多选项

以下是创建线程的链接:

下面是一种处理如何返回UI线程的方法:

例如,要创建一个线程,您可以这样做,它来自

我这样做我的线程,因为我发现它更容易看到发生了什么

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();
            }           
        }
    }
}
关于如何在UI线程上进行更新,最完整的答案是以下问题:

更新:

对于声明要执行长时间运行工作的部件,可以在线程块之前添加以下内容:

 (new Thread(() => {
        DoLongRunningWork();
        MessageBox.Show("Long Running Work Finished!");
    }) { Name = "Long Running Work Thread",
        Priority = ThreadPriority.BelowNormal }).Start();
然后您可以在线程内执行此操作:

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
通过进行这些更改,您可以简化所需的更改,但其中一些更改可能比您所需的更复杂,这就是为什么我提供了一些其他链接以提供更多信息的原因。但是,要了解有关使用
任务的更多信息,您可以查看这个优秀的博客:


不要使用thread.sleep在for循环中执行此操作,而是使用计时器执行此操作,计时器每50毫秒移动图像5个像素,然后停止。这将允许正确绘制屏幕的更改此代码不允许运行窗体的PaintBackground方法,这是替换像素所必需的。像这样的循环从来都不是问题,如果消息循环不运行,东西就会停止正常工作。使用一个定时器代替,这个.UpDead()是BAND-AID.VisualC 2010版Express版,你可以编写一个示例代码,因为在J2ME中我写了一个可运行的方法,它是一个接口。里面有一个循环while(true),最后有一个线程,每个动作我都写了flushGraphics,效果很好,但是在c中,我尝试了flushGraphics,它不起作用,我是c的新手,所以如果你能写一个示例代码,我将不胜感激。顺便说一下
(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);