今天拿c#写了一个支持滚动的图片显示程序(winform程序),主要运用form的autoscroll,代码很简单,关键代码如下:
/// <summary>
/// form的load事件
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
private void form1_load(object sender, system.eventargs e)
{
//这个很关键,只有该属性为true时,窗口才会在控件超出窗口范围时
//自动添加滚动条,并在我们操作滚动条时,自动滚动控件
this.autoscroll = true;
}
/// <summary>
/// 设置一个图片文件到picturebox1上
/// </summary>
/// <param name=”filename”>图片文件名</param>
private void setimage(string filename)
{
bitmap bm = new bitmap(filename);
picturebox1.backgroundimage = bm;
graphicsunit bmgu = graphicsunit.pixel;
rectanglef rectf = bm.getbounds(ref bmgu);
//设置picturebox1的大小和位置。如果该控件超出form的范围,form会自动
//添加滚动条
picturebox1.setbounds(0, 0, (int)rectf.width, (int)rectf.height);
}
/// <summary>
/// picturebox1的dobuleclick事件
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
private void picturebox1_doubleclick(object sender, system.eventargs e)
{
//打开一个文件对话框选择图片文件
openfiledialog openfiledialog = new openfiledialog();
openfiledialog.filter = “image files|*.bmp;*.jpg;.jpeg;*.gif”;
if(openfiledialog.showdialog() == dialogresult.ok)
{
//设置要显示的图片
setimage(openfiledialog.filename);
}
}
运行一下,似乎很正常,双击picturebox1,打开一个图片文件,如果图片尺寸过大,会自动出现滚动条。只是有一种情况,先打开一个大图片,然后拖动滚动条到最后,然后再打开一图片,图片显示的位置就出错了(不是显示在左上角)。奇怪了,我明明设置了picturebox1的x y为0了啊:picturebox1.setbounds(0, 0, ……)真是很费解!!
经过艰苦地攻读framework帮助文件,终于找出原因,现在和大家分享:原来当我们改变了窗口的滚动条的位置后,窗口客户区的坐标原点就发生了变化,和原来的坐标原点的偏移量可以用form.autoscrollposition表示。
既然问题找到了,解决就很简单,修改setimage函数的最后一句代码为:
picturebox1.setbounds(autoscrollposition.x, autoscrollposition.y, (int)rectf.width, (int)rectf.height);
就一切ok了!!