类似ACDSee中浏览图片时用手形图标移动图片的功能如何实现?

时间:2022-08-31 16:03:51
我是在Panel控件上直接用GDI+绘的图片,要简单实现上述功能并不难,跟踪Panel的mouse move,设置mouse move时图片重绘的坐标范围即可。但是考虑到以下功能就觉得该方法实现起来很烦琐:
1、图片需要支持Actual size, stretch to fit, scale to fit 三种显示模式。stretch简单的将图片拉伸填充整个panel,scale根据图片大小自动调整窗体大小。
2、要实现缩放Zoom功能。
3、图片改变显示方式和zoom时有必要要调整窗口大小,图片需要居中显示

其实这些也就是一个好的图片浏览程序的基本功能。

我察看了一些C#的这类示例,都是简单的做成用滚动条,请问有好的范例或是算法(不限于C#)吗?

6 个解决方案

#1


<programming windows form with C#>

#2


我看过这本书,他没讲这个内容。

#3


我做的看图软件是通过在一个panel上放一个PictureBox实现的,给一些相关代码给你,希望对你有所帮助:

  private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
  {
   if(e.Button == MouseButtons.Left)
   {
    xBegin = e.X;
    yBegin = e.Y;
    bMoving = true;
   }
  }

  private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
  {
   if(bMoving)
   {
    int xOffset = e.X - xBegin;
    int yOffset = e.Y - yBegin;
   
    // 水平向左拖动
    if(pictureBox1.Right > panel1.ClientSize.Width && xOffset < 0)
    {
     if((pictureBox1.Right + xOffset) < panel1.ClientSize.Width)
      pictureBox1.Left = panel1.ClientSize.Width - pictureBox1.Width;
     else
      pictureBox1.Left += xOffset;
    }
     // 水平向右拖动
    else if(pictureBox1.Left < 0 && xOffset > 0)
    {
     if((pictureBox1.Left + xOffset) > 0)
      pictureBox1.Left = 0;
     else
      pictureBox1.Left += xOffset;
    }
    // 垂直向上拖动
    if(pictureBox1.Bottom > panel1.ClientSize.Height && yOffset < 0)
    {
     if((pictureBox1.Bottom + yOffset) < panel1.ClientSize.Height)
      pictureBox1.Top = panel1.ClientSize.Height - pictureBox1.Height;
     else
      pictureBox1.Top += yOffset;
    }
     // 垂直向下拖动
    else if(pictureBox1.Top < 0 && yOffset > 0)
    {
     if((pictureBox1.Top + yOffset) > 0)
      pictureBox1.Top = 0;
     else
      pictureBox1.Top += yOffset;
    }
   }
  }

  private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
  {
   if(e.Button == MouseButtons.Left)
    bMoving = false;
  }

#4


bMoving 是一个全局变量

#5


楼上的方法还就是我说得简单方法,要综合考虑各种显示模式和缩放就麻烦了。
这个问题确实复杂了些,再研究研究。
主要是想寻找一个好的算法。

#6


自己解决了一部分,算了,散分!

#1


<programming windows form with C#>

#2


我看过这本书,他没讲这个内容。

#3


我做的看图软件是通过在一个panel上放一个PictureBox实现的,给一些相关代码给你,希望对你有所帮助:

  private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
  {
   if(e.Button == MouseButtons.Left)
   {
    xBegin = e.X;
    yBegin = e.Y;
    bMoving = true;
   }
  }

  private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
  {
   if(bMoving)
   {
    int xOffset = e.X - xBegin;
    int yOffset = e.Y - yBegin;
   
    // 水平向左拖动
    if(pictureBox1.Right > panel1.ClientSize.Width && xOffset < 0)
    {
     if((pictureBox1.Right + xOffset) < panel1.ClientSize.Width)
      pictureBox1.Left = panel1.ClientSize.Width - pictureBox1.Width;
     else
      pictureBox1.Left += xOffset;
    }
     // 水平向右拖动
    else if(pictureBox1.Left < 0 && xOffset > 0)
    {
     if((pictureBox1.Left + xOffset) > 0)
      pictureBox1.Left = 0;
     else
      pictureBox1.Left += xOffset;
    }
    // 垂直向上拖动
    if(pictureBox1.Bottom > panel1.ClientSize.Height && yOffset < 0)
    {
     if((pictureBox1.Bottom + yOffset) < panel1.ClientSize.Height)
      pictureBox1.Top = panel1.ClientSize.Height - pictureBox1.Height;
     else
      pictureBox1.Top += yOffset;
    }
     // 垂直向下拖动
    else if(pictureBox1.Top < 0 && yOffset > 0)
    {
     if((pictureBox1.Top + yOffset) > 0)
      pictureBox1.Top = 0;
     else
      pictureBox1.Top += yOffset;
    }
   }
  }

  private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
  {
   if(e.Button == MouseButtons.Left)
    bMoving = false;
  }

#4


bMoving 是一个全局变量

#5


楼上的方法还就是我说得简单方法,要综合考虑各种显示模式和缩放就麻烦了。
这个问题确实复杂了些,再研究研究。
主要是想寻找一个好的算法。

#6


自己解决了一部分,算了,散分!