| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5556 人关注过本帖
标题:请教各位在C#中vScrollBar的用法是怎样的呢???
只看楼主 加入收藏
一直不安静
Rank: 2
等 级:论坛游民
帖 子:19
专家分:10
注 册:2012-11-23
结帖率:100%
收藏
已结贴  问题点数:4 回复次数:2 
请教各位在C#中vScrollBar的用法是怎样的呢???
具体的问题是想在picturebox中通过vScrollBar这个控件来拉动一张一张的显示图片,希望会的人能给出最理想的答案,谢谢!!!!!
搜索更多相关主题的帖子: 张一 
2012-12-27 11:41
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
收藏
得分:4 
我认为理想的方法是将所有功能包装进一个类里面去,具体如下:
0、在界面上放一个PictureBox控件,在主窗体代码中将保存图片路径的字符串集合保存到PictureBox控件的Tag属性中;
1、新建一个类叫做VScrollBarForPictureBox,并使之继承自VScrollBar控件,生成,在主界面上放一个VScrollBarForPictureBox控件;
2、既然要将所有功能都包装进去,那么这个类中就要有完成功能所需的所有东西才行,需要什么东西呢?根据你的描述“在picturebox中通过vScrollBar这个控件来拉动一张一张的显示图片”来看,显然需要的是PictureBox和“图片”,前面我们已经将保存图片路径的集合赋予了PictureBox的Tag属性,那么显然只要类获取了PictureBox就都有了,所以,写一个字段_pb用来保存PictureBox,写一个List<string>类型的字段_imagesPath来保存图片路径集合,再写一个只写公共属性PictureContainer供外部代码为类设置PictureBox,属性代码中,我们保存PictureBox并将图片路径集合从PictureBox的Tag属性中取出并保存到_imagesPath字段,然后根据_imagesPath集合中值的数量来设置自身的Maximum属性以使滚动时的值不超出图片的数量;
3、将VScrollBarForPictureBox控件的LargeChange属性的值设置为1,这样,配合Maximum属性的值,VScrollBar滚动时的值就与图片路径集合的索引对应起来了;
4、重写OnScroll方法以便在滚动时获取滚动到的地方对应的图片索引值,从路径集合取出路径然后从磁盘生成Image显示在PicutreBox中就可以了;
5、重写Refresh方法,当图片路径集合变动后,应调用此方法以便重新计算Maximum的值以反映变化;
6、代码如下:

程序代码:
//VScrollBarForPictureBox.cs

using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace VScrollForImage
{
    public class VScrollBarForPictureBox : VScrollBar
    {
        #region 全局字段

        private List<string>    _imagesPath;
        private PictureBox      _pb;

        #endregion
        
        #region 公共属性

        public PictureBox PictureContainer 
        { 
            set
            {
                _pb = value;
                if (_pb.Tag == null) 
                    return;
                _imagesPath = (List<string>) _pb.Tag;
                Maximum = _imagesPath.Count - 1;
            } 
        }

        #endregion

        #region 重写方法

        protected override void OnScroll(ScrollEventArgs se)
        {
            base.OnScroll(se);
            if (_imagesPath == null) return;
            _pb.Image = Image.FromFile(_imagesPath[se.NewValue]);
        }

        public override void Refresh()
        {
            base.Refresh();
            if (_imagesPath == null) return;
            Maximum = _imagesPath.Count - 1;
        }

        #endregion
    }
}

//FormMain.cs

using System.Collections.Generic;
using System.Windows.Forms;

namespace VScrollForImage
{
    public partial class FormMain : Form
    {
        #region 构造函数
        
        public FormMain()
        {
            InitializeComponent();

            Pb.Tag = new List<string> { "0.jpg", "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg" };
            Vsb.PictureContainer = Pb;
        }

        #endregion
    }
}


[ 本帖最后由 mmxo 于 2012-12-27 23:14 编辑 ]

为提高中华编程水平而奋斗
2012-12-27 23:12
一直不安静
Rank: 2
等 级:论坛游民
帖 子:19
专家分:10
注 册:2012-11-23
收藏
得分:0 
谢谢详尽的讲解,这个看起来很困难的样子,不过还是切努力的理解吧!!!!!总之谢谢你帮我解决了一个大问题!!!!
2012-12-28 10:52
快速回复:请教各位在C#中vScrollBar的用法是怎样的呢???
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026320 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved