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;
}
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;
}
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
自己解决了一部分,算了,散分!