如题...
现在通过GetScrollPos获取了滚动条移动的相对位置...
也通过SystemInformation得到滚动条上下箭头的位图高度...
请问怎样才能知道滚动按钮已经到达了滚动区域最底部呢???

解决方案 »

  1.   

    listView1.Items[listView1.Items.Count-1].EnsureVisible();//对你有用吗?
      

  2.   

    listView1.Items[listView1.Items.Count - 1].EnsureVisible();//对你有用吗?
    //解释一下,这语句会把滚动条滚到最后,得到滚动条位置就得总高度啦.不过你得总高度干嘛,可能是显示最后一条吧?
      

  3.   

    获取水平滚动条的默认高度(以像素为单位)。
    SystemInformation.HorizontalScrollBarHeight
      

  4.   

    To: ok48 ...这个我早知道了.看来大家都误解了我的意思(是我的问题)...我的意思是:在ListView的滚动条滚动到最底部的时候,如何让程序知道???
    (注意: 我们的眼睛是可以看到它已经滚动到最后.可是程序不知道啊,因为它不触发任何事件.)To: hbxtlhx...看到您的到来我挻开心的.是真的...不过,我不是这个意思! 我是想在它滚动到后面时,做其他的操作....最后,感谢两位 ^o^ ...
      

  5.   

    我是想这个要处理Windows消息才能实现...不过, WM_HSCROLL 与 WM_VSCROLL 只是可以捕获它的滚动.但是不知道它什么时候滚动到最后...请大家与LS两位指点指点...^o^
      

  6.   

    或者换一种思路!比如说:
        我的ListView现在就有100条记录, 在这100条记录当中, 只有前50条才可以直接在ListView的可见区域(ClientRectangle)里面看得到, 而后50条须要拖动水平滚动条的.
        当用户拖动滚动条的时候, 怎样才能让[程序]知道第(80)条记录已经可以直接在[可见区域]里面看得到呢???而不是存在于虚拟区域(DisplayRectangle)当中...
    ^o^ 思路是有的, 不过我不知道.Net有没有现成的方法可以实现! 还请大家指点...
      

  7.   

    在滚动条的Scroll事件中,我们可以通过它的事件参数来得到更多的信息,这个参数的类型是:
    ScrollEventArgs在这个类型中有如下类型的属性:
    public ScrollEventType Type { get; }因此我们可以在Scroll事件里通过如下的代码得到滚动条是否滚动到了最大值:private void hScroll(object sender, ScrollEventArgs e)
    {
        if (e.Type == ScrollEventType.Last)
        {
            //到了最大的滚动值
        }
    }但是在ListView中不能直接的得到这个事件,不过楼主有足够的时间来研究的话,可以在Listview中找到要处理的滚动条句柄,由系统函数可以通过这个句柄得到我们需要的信息.我只是这个想法,并没有实现的实现过.
      

  8.   

    嗯. ListView的滚动条好像没有句柄的.因为它是自绘,并没有真正的创建窗口...请问hbxtlhx还有没有其他方法呢???就是因为没有足够的时间去研究.所以才发贴的...
      

  9.   

    那有没有办法得到ListView的总高度啦! 包括它的[可见区域]与[虚拟区域]....可以实现这个也足够了! 这样我就可以通过计算来换取它的滚动区域与ListView的相对坐标...
      

  10.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using Microsoft.Win32;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    namespace WindowsApplication13
    {
        delegate void DelegeteScrollBottom(int newvalue,int oldvalue);
        class MyListView : ListView
        {
            public MyListView()
            {        }        /// <summary>
            /// 水平滚动事件
            /// </summary>
            public event DelegeteScrollBottom Scroll;
            private const int WM_HSCROLL = 0x114;
            private const int WM_VSCROLL = 0x115;
            private int OldVscrollValue = 0;        [DllImport("user32")]
            public static extern int GetScrollPos(IntPtr hWnd, int nBar);
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case WM_VSCROLL:                    int NewVscrollValue = GetScrollPos(m.HWnd, 1);                    if (Scroll != null)
                        { Scroll(NewVscrollValue, OldVscrollValue); }                    OldVscrollValue = NewVscrollValue;
                        base.WndProc(ref m);
                        break;                default:
                        base.WndProc(ref m);
                        break;
                }
            }
        }
    }为ListView 写了个垂直滚事件,可以得到新值和旧值/////////////////////////////////////////
    自已已经解决的问题...<-----在事件中判断一下新值==你解决的高度就是到底啦.再等待其他人的方案.明天结贴了...请大家也发表一下吧...///////////////////
    LZ也发你怎么获取高度代码上来看看吧..交个朋友QQ5970356