关于winform中图片拖动的问题

Main- 2016-01-05 02:49:02
具体需求是 在窗体中有一张图片(可以放在picturebox中)鼠标点击并拖动图片 原先的位置图片不动将拖动的图片放在制定的位置时可以固定 可以重复拖动原先图片的过程
...全文
188 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_QQ:2335298917 2016-01-06
  • 打赏
  • 举报
回复
引用 7 楼 crystal_lz 的回复:
这样的吗?

public partial class Form2 : Form
{
    public Form2() {
        InitializeComponent();
        pic_model.Size = new Size(100, 100);//模版pic
        pic_model.BorderStyle = BorderStyle.FixedSingle;
    }

    private PictureBox m_picBox;    //当前操作的pic
    private Point m_pt_pic;         //pic没有移动前的位置
    private Point m_pt_mouseDown;   //鼠标点下的位置

    private void Form2_Load(object sender, EventArgs e) {
        pic_model.Image = this.GetScreenImage(100, 100);
        pic_model.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
        pic_model.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
        pic_model.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
    }

    private Image GetScreenImage(int nWidth, int nHeight) {
        Bitmap bmp = new Bitmap(nWidth, nHeight);
        using (Graphics g = Graphics.FromImage(bmp)) {
            g.CopyFromScreen(0, 0, 0, 0, new Size(nWidth, nHeight));
        }
        return bmp;//就拿桌面截图测试效果
    }

    void pictureBox_MouseUp(object sender, MouseEventArgs e) {
        if (pic_model.RectangleToScreen(pic_model.DisplayRectangle).Contains(MousePosition)) {
            m_picBox.Dispose();//当移动回去的时候删除
            this.Controls.Remove(m_picBox);
        }
    }

    void pictureBox_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {//改变pic位置
            m_picBox.Left = m_pt_pic.X + (MousePosition.X - m_pt_mouseDown.X);
            m_picBox.Top = m_pt_pic.Y + (MousePosition.Y - m_pt_mouseDown.Y);
        }
    }

    void pictureBox_MouseDown(object sender, MouseEventArgs e) {
        PictureBox picBox = sender as PictureBox;
        m_pt_mouseDown = MousePosition;//记录鼠标位置
        if (picBox == pic_model) {//如果点击的是模版pic 复制一个新的出来
            m_picBox = new PictureBox();
            m_picBox.Location = pic_model.Location;
            m_picBox.Size = pic_model.Size;
            m_picBox.Image = (Image)pic_model.Image.Clone();
            this.Controls.Add(m_picBox);
            m_picBox.BorderStyle = BorderStyle.FixedSingle;
            m_picBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
            m_picBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
            m_picBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
        } else m_picBox = picBox;
        m_picBox.BringToFront();//前置
        m_pt_pic = m_picBox.Location;//记录初始位置
    }
}
Main- 2016-01-05
  • 打赏
  • 举报
回复
引用 7 楼 crystal_lz 的回复:
这样的吗?

public partial class Form2 : Form
{
    public Form2() {
        InitializeComponent();
        pic_model.Size = new Size(100, 100);//模版pic
        pic_model.BorderStyle = BorderStyle.FixedSingle;
    }

    private PictureBox m_picBox;    //当前操作的pic
    private Point m_pt_pic;         //pic没有移动前的位置
    private Point m_pt_mouseDown;   //鼠标点下的位置

    private void Form2_Load(object sender, EventArgs e) {
        pic_model.Image = this.GetScreenImage(100, 100);
        pic_model.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
        pic_model.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
        pic_model.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
    }

    private Image GetScreenImage(int nWidth, int nHeight) {
        Bitmap bmp = new Bitmap(nWidth, nHeight);
        using (Graphics g = Graphics.FromImage(bmp)) {
            g.CopyFromScreen(0, 0, 0, 0, new Size(nWidth, nHeight));
        }
        return bmp;//就拿桌面截图测试效果
    }

    void pictureBox_MouseUp(object sender, MouseEventArgs e) {
        if (pic_model.RectangleToScreen(pic_model.DisplayRectangle).Contains(MousePosition)) {
            m_picBox.Dispose();//当移动回去的时候删除
            this.Controls.Remove(m_picBox);
        }
    }

    void pictureBox_MouseMove(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {//改变pic位置
            m_picBox.Left = m_pt_pic.X + (MousePosition.X - m_pt_mouseDown.X);
            m_picBox.Top = m_pt_pic.Y + (MousePosition.Y - m_pt_mouseDown.Y);
        }
    }

    void pictureBox_MouseDown(object sender, MouseEventArgs e) {
        PictureBox picBox = sender as PictureBox;
        m_pt_mouseDown = MousePosition;//记录鼠标位置
        if (picBox == pic_model) {//如果点击的是模版pic 复制一个新的出来
            m_picBox = new PictureBox();
            m_picBox.Location = pic_model.Location;
            m_picBox.Size = pic_model.Size;
            m_picBox.Image = (Image)pic_model.Image.Clone();
            this.Controls.Add(m_picBox);
            m_picBox.BorderStyle = BorderStyle.FixedSingle;
            m_picBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
            m_picBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
            m_picBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
        } else m_picBox = picBox;
        m_picBox.BringToFront();//前置
        m_pt_pic = m_picBox.Location;//记录初始位置
    }
}
谢谢
xuzuning 2016-01-05
  • 打赏
  • 举报
回复
给你一个完整的例子
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;
using System.Threading;

namespace 拖动
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
var pict = new PictureBox(); //创建一个 PictureBox
pict.Name = "bmp1";
pict.Location = new Point(10, 10);
pict.Size = new Size(150, 150);
pict.Load("1.jpg");
Controls.Add(pict);
pict.MouseDown += new MouseEventHandler(mouseDown);
pict.MouseMove += new MouseEventHandler(mouseMove);
pict.DoubleClick += new EventHandler(doubleClick); //指定双击图片原路返回

var bup = new PictureBox(); //再创建一个 PictureBox 作为备份
bup.Image = pict.Image;
bup.Location = pict.Location;
bup.Size = pict.Size;
Controls.Add(bup);

}
int ox = 0;
int oy = 0;
List<Point> st = new List<Point>();
void mouseDown(object sender, MouseEventArgs e)
{
ox = e.X;
oy = e.Y;
var el = (PictureBox)sender;
st.Add(el.Location);
}
void mouseMove(object sender, MouseEventArgs e)
{
var el = (PictureBox)sender;
if (e.Button == MouseButtons.Left)
{
el.Top = el.Top + e.Y - oy;
el.Left = el.Left + e.X - ox;
st.Add(el.Location); //记录下位置
}
}

private void doubleClick(object sender, EventArgs e)
{
for (var i = st.Count - 1; i >= 0; i--)
{
Controls["bmp1"].Location = st[i];
Thread.Sleep(10);
}
st.Clear();
}
}
}
其他的应该不用解释了
  • 打赏
  • 举报
回复
当年说“拖动图片”又说“原位置的图片不动”时 --> 当你说“拖动图片”又说“原位置的图片不动”时 保证人脑中逻辑概念清晰无矛盾很重要。不然一旦编程逻辑复杂了,等于跟自己较劲,自己分不清设计思路了。
  • 打赏
  • 举报
回复
引用 2 楼 lyt022 的回复:
你好,看你的案例了,但是和我的有些不符,我要的是拖动过程中图片要显示,而且原位置的图片不变(也就是原位置还是原来的图片)
其实把大白话说通顺了,编程思路才初步清晰。 当年说“拖动图片”又说“原位置的图片不动”时,这就是自相矛盾的。连不懂编程的人都知道自相矛盾,所以先把这个大白话修改一下,然后你就能顺利地接受人家的建议了。
crystal_lz 2016-01-05
  • 打赏
  • 举报
回复
用控件感觉很方便 就是有点别扭 还是觉得用gdi绘制舒服一点 放一个列表记录拖动出来的图标位置 然后绘制
crystal_lz 2016-01-05
  • 打赏
  • 举报
回复

这样的吗?

public partial class Form2 : Form
{
public Form2() {
InitializeComponent();
pic_model.Size = new Size(100, 100);//模版pic
pic_model.BorderStyle = BorderStyle.FixedSingle;
}

private PictureBox m_picBox; //当前操作的pic
private Point m_pt_pic; //pic没有移动前的位置
private Point m_pt_mouseDown; //鼠标点下的位置

private void Form2_Load(object sender, EventArgs e) {
pic_model.Image = this.GetScreenImage(100, 100);
pic_model.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
pic_model.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
pic_model.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
}

private Image GetScreenImage(int nWidth, int nHeight) {
Bitmap bmp = new Bitmap(nWidth, nHeight);
using (Graphics g = Graphics.FromImage(bmp)) {
g.CopyFromScreen(0, 0, 0, 0, new Size(nWidth, nHeight));
}
return bmp;//就拿桌面截图测试效果
}

void pictureBox_MouseUp(object sender, MouseEventArgs e) {
if (pic_model.RectangleToScreen(pic_model.DisplayRectangle).Contains(MousePosition)) {
m_picBox.Dispose();//当移动回去的时候删除
this.Controls.Remove(m_picBox);
}
}

void pictureBox_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {//改变pic位置
m_picBox.Left = m_pt_pic.X + (MousePosition.X - m_pt_mouseDown.X);
m_picBox.Top = m_pt_pic.Y + (MousePosition.Y - m_pt_mouseDown.Y);
}
}

void pictureBox_MouseDown(object sender, MouseEventArgs e) {
PictureBox picBox = sender as PictureBox;
m_pt_mouseDown = MousePosition;//记录鼠标位置
if (picBox == pic_model) {//如果点击的是模版pic 复制一个新的出来
m_picBox = new PictureBox();
m_picBox.Location = pic_model.Location;
m_picBox.Size = pic_model.Size;
m_picBox.Image = (Image)pic_model.Image.Clone();
this.Controls.Add(m_picBox);
m_picBox.BorderStyle = BorderStyle.FixedSingle;
m_picBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
m_picBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
m_picBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
} else m_picBox = picBox;
m_picBox.BringToFront();//前置
m_pt_pic = m_picBox.Location;//记录初始位置
}
}
Main- 2016-01-05
  • 打赏
  • 举报
回复
引用 5 楼 shingoscar 的回复:
开始拖动的时候把原图复制一份出来,然后使用上面的例子拖动图片
复制出来后放哪?是移动复制出来的图片还是移动原来的图片? 如果移动原来的图片那么新复制出来的移动事件怎样加? 如果移动复制出来的图片那怎样移动?是通过绘图吗?绘图产生的重影效果怎样去除?如果调用Invalidate()方法那么新复制出来的放到指定位置的图片就会消失
Poopaye 2016-01-05
  • 打赏
  • 举报
回复
开始拖动的时候把原图复制一份出来,然后使用上面的例子拖动图片
Main- 2016-01-05
  • 打赏
  • 举报
回复
你这还是移动原图的位置,和我的需求有点不符
crystal_lz 2016-01-05
  • 打赏
  • 举报
回复
Main- 2016-01-05
  • 打赏
  • 举报
回复
你好,看你的案例了,但是和我的有些不符,我要的是拖动过程中图片要显示,而且原位置的图片不变(也就是原位置还是原来的图片)

110,534

社区成员

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

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

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