C#窗体中图片移动:怎么让图片从上到下,从左到右(从左上角到右下角)循环移动

「已注销」 2019-06-20 01:10:41
C#中怎么让界面中的三张图片分别从左到右,从上到下,从左上到右下循环移动
...全文
934 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2019-06-20
  • 打赏
  • 举报
回复
左上角到右下角不准确,自己改改,可以交作业了

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Demo_1
{
public partial class Form1 : Form
{
public class PanelEx : Panel
{
public PanelEx()
{
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.SupportsTransparentBackColor |
ControlStyles.UserPaint,
true
);
UpdateStyles();
}
}

public abstract class DraggableObject
{
public abstract Rectangle Region { get; set; }
public abstract Bitmap Setimage { get; set; }
public abstract void OnPaint(PaintEventArgs e);
}

public class Draggable : DraggableObject
{
private Rectangle m_Region;
private Bitmap m_SetImage;

public Draggable(string id, Rectangle regin, Bitmap image)
{
m_Region = regin;
m_SetImage = image;
}
public override Rectangle Region { get => m_Region; set => m_Region = value; }
public override Bitmap Setimage { get => m_SetImage; set => m_SetImage = value; }
public override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(m_SetImage, m_Region);
}
}
public List<DraggableObject> DesignObjects = new List<DraggableObject>();

public PanelEx panelContent;

public Form1()
{
InitializeComponent();

panelContent = new PanelEx()
{
Dock = DockStyle.Fill,
BackgroundImageLayout = ImageLayout.Stretch,
BackgroundImage = Image.FromFile("back.jpg")
};
panelContent.Paint += PanelContent_Paint;
this.Controls.Add(panelContent);

string[] files = new string[] { "01.png", "02.png", "03.png" };
for (int i = 0; i < 3; i++)
{
Bitmap bmp = Image.FromFile(files[i]) as Bitmap;
Draggable draggableBlock = new Draggable(DateTime.Now.ToString(), new Rectangle(0, 0, bmp.Width, bmp.Height), bmp);
DesignObjects.Add(draggableBlock);
}
Task.Run(async () =>
{
int set_x = 0;
while (true)
{
DesignObjects[0].Region = new Rectangle(set_x, 100, DesignObjects[0].Region.Width, DesignObjects[0].Region.Height);
panelContent.Invalidate();
await Task.Delay(5);
if (set_x < this.Width) set_x += 1;
else set_x = 0;
}
});
Task.Run(async () =>
{
int set_y = 0;
while (true)
{
DesignObjects[1].Region = new Rectangle(100, set_y, DesignObjects[1].Region.Width, DesignObjects[1].Region.Height);
panelContent.Invalidate();
await Task.Delay(5);
if (set_y < this.Height) set_y += 1;
else set_y = 0;
}
});
Task.Run(async () =>
{
int set_x = 0, set_y = 0;
while (true)
{
DesignObjects[2].Region = new Rectangle(set_x, set_y, DesignObjects[2].Region.Width, DesignObjects[2].Region.Height);
panelContent.Invalidate();
await Task.Delay(5);
if ((set_y + 1 + DesignObjects[2].Region.Height) < this.Height)
{
set_x += 1;
set_y += 1;
}
else
{
set_x = 0;
set_y = 0;
}
}
});
}

private void PanelContent_Paint(object sender, PaintEventArgs e)
{
foreach (DraggableObject item in DesignObjects)
{
item.OnPaint(e);
}
}

}
}

无情时尚 2019-06-20
  • 打赏
  • 举报
回复
有点类似https://bbs.csdn.net/topics/392259302
只是里面是label,你换成picture
「已注销」 2019-06-20
  • 打赏
  • 举报
回复
引用 2 楼 娃都会打酱油了的回复:
https://bbs.csdn.net/topics/391833810 类似这种问题?
要求是界面中的三张图片能够分别按从左到右,从上到下,从左上到右下循环移动,然后可以设置图片初始位置,以及它们能向相反方向移动,并且可以更换图片。能救救急吗
「已注销」 2019-06-20
  • 打赏
  • 举报
回复
太菜了,期末了又要交作业
desperaso 2019-06-20
  • 打赏
  • 举报
回复
引用 7 楼 weixin_44718540 的回复:
要求是界面中的三张图片能够分别按从左到右,从上到下,从左上到右下循环移动,然后可以设置图片初始位置,以及它们能向相反方向移动,图片还能进行更换,救救急吧!!!一点头绪都没有


button 可以打开3张图片

循环设置值set_x1, set_y1等等

DesignObjects[0].Region = new Rectangle(set_x1, set_y1, DesignObjects[index].Region.Width, DesignObjects[index].Region.Height);

DesignObjects[1].Region = new Rectangle(set_x2, set_y2, DesignObjects[index].Region.Width, DesignObjects[index].Region.Height);

DesignObjects[2].Region = new Rectangle(set_x3, set_y3, DesignObjects[index].Region.Width, DesignObjects[index].Region.Height);
panelContent.Invalidate();

不会稍稍改改么
「已注销」 2019-06-20
  • 打赏
  • 举报
回复
要求是界面中的三张图片能够分别按从左到右,从上到下,从左上到右下循环移动,然后可以设置图片初始位置,以及它们能向相反方向移动,图片还能进行更换,救救急吧!!!一点头绪都没有
desperaso 2019-06-20
  • 打赏
  • 举报
回复
把鼠标移动,坐标换成你指定的坐标就可以了

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Demo_1
{
public partial class Form1 : Form
{
public class PanelEx : Panel
{
public PanelEx()
{
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.SupportsTransparentBackColor |
ControlStyles.UserPaint,
true
);
UpdateStyles();
}
}

public abstract class DraggableObject
{
public abstract string Id { get; set; }
public abstract int prim_X { get; set; }
public abstract int prim_Y { get; set; }
public abstract Rectangle Region { get; set; }
public abstract Bitmap Setimage { get; set; }
public abstract void OnPaint(PaintEventArgs e);
}

public class Draggable : DraggableObject
{
private string m_Id;
private int m_primX;
private int m_primY;
private Rectangle m_Region;
private Bitmap m_SetImage;

public Draggable(string id, Rectangle regin, Bitmap image)
{
m_Id = id;
m_Region = regin;
m_SetImage = image;
}
public override string Id { get => m_Id; set => m_Id = value; }
public override int prim_X { get => m_primX; set => m_primX = value; }
public override int prim_Y { get => m_primY; set => m_primY = value; }
public override Rectangle Region { get => m_Region; set => m_Region = value; }
public override Bitmap Setimage { get => m_SetImage; set => m_SetImage = value; }
public override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(m_SetImage, m_Region);
}
}
public List<DraggableObject> DesignObjects = new List<DraggableObject>();

public PanelEx panelContent;
public Label info;
private bool Is_Dragging = false;
private int index = -1,record = -1;

public Form1()
{
InitializeComponent();

panelContent = new PanelEx()
{
Dock = DockStyle.Fill,
BackgroundImageLayout = ImageLayout.Stretch,
BackgroundImage = Image.FromFile("back.jpg")
};
panelContent.Paint += PanelContent_Paint;
panelContent.MouseMove += PanelContent_MouseMove;
panelContent.MouseDown += PanelContent_MouseDown;
panelContent.MouseUp += PanelContent_MouseUp;
this.Controls.Add(panelContent);

PanelEx panelTop = new PanelEx()
{
Height = 30,
Dock = DockStyle.Top
};
this.Controls.Add(panelTop);

Button[] buttons = new Button[4];
string[] btnText = new string[] { "添加元素","删除元素","元素前移","元素后移"};
for (int i=0;i<4;i++)
{
buttons[i] = new Button()
{
Size = new Size(70, 25),
Location = new Point(10+i*80,5),
Font = new Font("微软雅黑",9,FontStyle.Regular),
Text = btnText[i],
Tag = i
};
buttons[i].Click +=Button_Click;
panelTop.Controls.Add(buttons[i]);
}

info = new Label()
{
AutoSize = true,
Location = new Point(350,5),
Font = new Font("微软雅黑", 9, FontStyle.Regular),
};
panelTop.Controls.Add(info);
}

private void PanelContent_Paint(object sender, PaintEventArgs e)
{
foreach (DraggableObject item in DesignObjects)
{
item.OnPaint(e);
}
}

private void Button_Click(object sender, EventArgs e)
{
Control pL = (Control)sender;

if ((int)pL.Tag == 0)
{
OpenFileDialog openImgDialog = new OpenFileDialog();
openImgDialog.Filter = "图像文件(*.png;*.jpg;*.gif;*.bmp)|*.png;*.jpg;*.gif;*.bmp";
openImgDialog.RestoreDirectory = true;
openImgDialog.FilterIndex = 1;
if (openImgDialog.ShowDialog() == DialogResult.OK)
{
Bitmap bmp = Image.FromFile(openImgDialog.FileName) as Bitmap;
Draggable draggableBlock = new Draggable(DateTime.Now.ToString(), new Rectangle(50, 50, bmp.Width, bmp.Height), bmp);
DesignObjects.Add(draggableBlock);
record = DesignObjects.Count - 1;
info.Text = "当前元素:" + (record + 1) + " ID: " + DesignObjects[record].Id;
}
}
else
if ((int)pL.Tag == 1)
{
if (record != -1)
{
DesignObjects.RemoveAt(record);
record = DesignObjects.Count == 0 ? -1 : DesignObjects.Count - 1;
}
}
else
if ((int)pL.Tag == 2)
{
if (record != -1)
{
var swap = DesignObjects[record];
DesignObjects.RemoveAt(record);
DesignObjects.Insert(0, swap);
record = 0;
}
}
if ((int)pL.Tag == 3)
{
if (record != -1)
{
var swap = DesignObjects[record];
DesignObjects.RemoveAt(record);
DesignObjects.Add(swap);
record = DesignObjects.Count - 1;
}
}
if (record != -1) info.Text = "当前元素:" + (record + 1) + " ID: "+ DesignObjects[record].Id;
panelContent.Invalidate();
}

private void PanelContent_MouseUp(object sender, MouseEventArgs e)
{
Is_Dragging = false;
}

private void PanelContent_MouseDown(object sender, MouseEventArgs e)
{
index = DesignObjects.FindIndex(d => d.Region.Contains(e.Location));
if (index != -1)
{
record = index;
Is_Dragging = true;
DesignObjects[index].prim_X = e.Location.X - DesignObjects[index].Region.Left;
DesignObjects[index].prim_Y = e.Location.Y - DesignObjects[index].Region.Top;
info.Text = "当前元素:" + (record + 1) + " ID: " + DesignObjects[record].Id;
}
else
{
record = -1;
Is_Dragging = false;
}
}

private void PanelContent_MouseMove(object sender, MouseEventArgs e)
{
Control pL = (Control)sender;

if (Is_Dragging && index != -1)
{
int set_x = e.Location.X - DesignObjects[index].prim_X;
int set_y = e.Location.Y - DesignObjects[index].prim_Y;
set_x = set_x < 0 ? 0 : set_x = set_x > panelContent.Width - DesignObjects[index].Region.Width ? panelContent.Width - DesignObjects[index].Region.Width : set_x;
set_y = set_y < 0 ? 0 : set_y = set_y > panelContent.Height - DesignObjects[index].Region.Height ? panelContent.Height - DesignObjects[index].Region.Height : set_y;
DesignObjects[index].Region = new Rectangle(set_x, set_y, DesignObjects[index].Region.Width, DesignObjects[index].Region.Height);
panelContent.Invalidate();
}
else
{
index = DesignObjects.FindIndex(d => d.Region.Contains(e.Location));
if (index != -1) pL.Cursor = Cursors.SizeAll;
else pL.Cursor = Cursors.Default;
}
}
}
}

「已注销」 2019-06-20
  • 打赏
  • 举报
回复
引用 3 楼 正怒月神的回复:
修改left 和top坐标
能具体说说吗,要交了,大佬救命
「已注销」 2019-06-20
  • 打赏
  • 举报
回复
引用 1 楼 hanghangz的回复:
不停修改图片的的坐标?
就是winform,三张图片可以先固定在一个初试位置,要交了,救命
正怒月神 2019-06-20
  • 打赏
  • 举报
回复
修改left 和top坐标
  • 打赏
  • 举报
回复
hanghangz 2019-06-20
  • 打赏
  • 举报
回复
不停修改图片的的坐标?

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧