当 PictureBox内的图片太大,超过PictureBox边框时可以用下面的方法来实现,

 

通过重绘来实现 :

 

Code

bool wselected = false;

 Point p = new Point();

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

 {

 wselected = true;

 p.X = e.X;

 p.Y = e.Y;

 }

int driftX = 0, driftY = 0;

int mx = 0, my = 0;

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

 {

if (wselected)

 {

 driftX = p.X - e.X;

 driftY = p.Y - e.Y;

 mx = mx - driftX;

 my = my - driftY;

 Bitmap bm = new Bitmap(this.pictureBox1.Image);

 Graphics g = pictureBox1.CreateGraphics();

 g.Clear(pictureBox1.BackColor);

 g.DrawImage(bm, mx, my);

 p.X = e.X;

 p.Y = e.Y;

 bm.Dispose();

 g.Dispose();

 }

 }

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

 {

 wselected = false;

 }

 

 

 

方法二(上面的方法在拖动的时候闪烁比较严重):

 

原文:http://topic.csdn.net/u/20090121/21/fbdc1203-7f01-4c4b-86d7-0ae2960a76e4.html

 

Code

public Form1()

{

            InitializeComponent();

            //双缓存

            base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

            base.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.Selectable, true);

        }

 Bitmap M_map_bufferpic;//加快GDI读取用缓存图片

/**//// <summary>

        /// 传入内存缓存中

        /// </summary>

        /// <param name="P_str_path">图片地址 </param>

private void inPutBuffer(string P_str_path)

{

            M_map_bufferpic = new Bitmap(P_str_path);

            pictureBox1.Image = M_map_bufferpic;

        }

private void button1_Click(object sender, EventArgs e)

{

            if (openFileDialog1.ShowDialog() == DialogResult.OK)

{

                string path = openFileDialog1.FileName;

                openFileDialog1.Dispose();

                inPutBuffer(path);

            }

        }

 Point M_pot_p = new Point();//原始位置

int M_int_mx = 0, M_int_my = 0;//下次能继续

int M_int_maxX, M_int_maxY;//加快读取用

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

            M_pot_p = e.Location;

            M_int_maxX = pictureBox1.Width - M_map_bufferpic.Width;

            M_int_maxY = pictureBox1.Height - M_map_bufferpic.Height;

 Cursor = Cursors.SizeAll;

 }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left)//当按左键的时候

{

//算差值

M_int_mx=M_int_mx - M_pot_p.X + e.X;

 M_int_my=M_int_my - M_pot_p.Y + e.Y;

//锁定范围

M_int_mx = Math.Min(0, Math.Max(M_int_maxX, M_int_mx));

 M_int_my = Math.Min(0, Math.Max(M_int_maxY, M_int_my));

 Graphics g = pictureBox1.CreateGraphics();

 g.DrawImage(M_map_bufferpic, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height), new Rectangle(-M_int_mx, -M_int_my, pictureBox1.Width, pictureBox1.Height), GraphicsUnit.Pixel);

 M_pot_p = e.Location;

 }

else

{

 Cursor = Cursors.Default;

 }

 }

PictureBox内的图片拖动功能的更多相关文章

  1. 仿酷狗音乐播放器开发日志二十七 用ole为窗体增加文件拖动功能(附源码)

    转载请说明原出处,谢谢~~ 中秋到了,出去玩了几天.今天把仿酷狗程序做了收尾,已经开发完成了,下一篇博客把完结的情况说一下.在这篇博客里说一下使用OLE为窗体增加文件拖拽的功能.使用播放器,我更喜欢直 ...

  2. java发送内嵌图片邮件

    前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/huj ...

  3. C# 图片盖章功能实现,支持拖拽-旋转-放缩-保存

    实现图片盖章功能,在图片上点击,增加“图章”小图片,可以拖拽“图章”到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加“图章”2.选中移动图标3.点中右下角放缩旋 ...

  4. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  5. Android图片加载框架最全解析(五),Glide强大的图片变换功能

    大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...

  6. jqzoom插件图片放大功能的一些BUG

    建议使用cloud-zoom插件,jqzoom插件就不要使用了 点击查看——图片放大镜——jQuery插件Cloud Zoom 刚开始使用的是jqzoom插件,但问题太多了,就不说插入到页面中使用了, ...

  7. Excel催化剂开源第9波-VSTO开发图片插入功能,图片带事件

    图片插入功能,这个是Excel插件的一大刚需,但目前在VBA接口里开发,如果用Shapes.AddPicture方法插入的图片,没法对其添加事件,且图片插入后需等比例调整纵横比例特别麻烦,特别是对于插 ...

  8. PHP读取Excel内的图片

    今天接到了一个从Excel内读取图片的需求,在网上查找了一些资料,基本实现了自己的需求,不过由于查到的一些代码比较久远,不能直接移植到自己的项目里,需要稍加改动一下. 这里介绍一下分别使用phpspr ...

  9. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

随机推荐

  1. C++ 1

    1 new 建立一个堆对象 new 类名(初值列表) 返回一个指针 int * p=new int(3)动态分配 2 delete  释放指针 delete p; delete [] p ;释放动态申 ...

  2. 悟透Javascript之 原型prototype

    构造函数的Prototype上定义的方法确实可以通过对象直接调用,而且代码是共享的.我表示我不懂.太难理解了,艹.在Javascript中,prototype不但能让对象共享自己的财富,而且proto ...

  3. 网络流CodeForces. Original 589F:Gourmet and Banquet

    A gourmet came into the banquet hall, where the cooks suggested n dishes for guests. The gourmet kno ...

  4. 创建一个基本的Windows应用程序

    以下是包含的头文件 #define WIN32_LEAN_AND_MEAN // 指示编译器不要包含我们并不需要的MFC内容 #include <windows.h> // 包含所有的Wi ...

  5. [转载]JVM性能调优--JVM参数配置

    http://www.cnblogs.com/chen77716/archive/2010/06/26/2130807.html

  6. 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房) - agapple - ITeye技术网站

    阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房) - agapple - ITeye技术网站 阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)

  7. Centos 下安装MongoDB

    Centos 下安装MongoDB 一.安装方法 方法(一) 1  配置包管理系统 创建/etc/yum.repos.d/mongodb.repo 文件,当然我们使用的是64位系统,32位的情况不再考 ...

  8. 20169210《Linux内核原理与分析》第一周作业

    第一次接触Linux,还是有点不适应的,与Windows区别还是比较大的.在免费与收费.软件与支持.安全性.使用习惯.可定制性和应用范畴等方面都有区别. 通过实验楼的<Linux基础入门(新版) ...

  9. 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)

    问题: 当file_get_content()函数的参数  url中是localhost时不能抓取,是127.0.0.1时可以抓取到静态html代码.实现页面静态化技术提高访问效率. test.php ...

  10. wdlinux 编译pdo_mysql

    由于项目需要用到pdo 链接数据库 wdlinux在centos6.4下 没有pdomysql模块 ,所以重新编译 有的系统无法使用pdo_mysql 1 重新编译mysql http://www.w ...