2011-09-29 67 views
0
SCROLLBARINFO Struct 
    cbSize DWORD 
    rcScrollBar RECT 
    dxyLineButton DWORD 
    xyThumbTop DWORD 
    xyThumbBottom DWORD 
    reserved DWORD 
    rgstate DWORD 6 DUP 
SCROLLBARINFO ends 

当GetScrollBarInfo()返回该结构,rcScrollBar是滚动条或滚动滑块的尺寸?SROLLBARINFO.rcScrollbar被称为滚动条本身或滚动滑块的dimesion

更新:

从GetScrollInfo另一结构:

typedef struct tagSCROLLINFO { 
    UINT cbSize; 
    UINT fMask; 
    int nMin; 
    int nMax; 
    UINT nPage; 
    int nPos; 
    int nTrackPos; 
} SCROLLINFO, **LPCSCROLLINFO; 

为了检测是否在底部,为什么这个公式工作滚动滑块:

IsAtBottom =(si.nMax - si.nPos)<(sbi.rcScrollBar.bottom - sbi.rcScrollBar.top)

nMax,nPos和滚动条矩形之间的关系是什么?

在此先感谢。

回答

0

这是滚动条本身的坐标(如RECT,所以顶部,左侧,右侧,底部)(请参阅msdn)。为了获得尺寸则需要进行相减(代码片段是在C++中,但你可以转换成C#):

RECT coords = info.rcScollBar; 
LONG width = coords.right - coords.left; 
LONG height = coords.bottom - coords.top; 

你也想确保你正确的坐标系中工作(屏幕或客户端)。我试图找到你从GetScrollBarInfo找回的坐标系,但还没有找到它。我的猜测是它在客户端坐标,但我无法证实这一点。

+0

好的,谢谢!我不明白的是:为什么 此代码: IsAtBottom =(scrlINF.nMax - scrlINF.nPos)<(scrlBarINF.rcScrollBar.Bottom - scrlBarINF.rcScrollBar.Top) 凡ScrlINF是SCROLLINFO,ScrlBarINF是ScrollBarInfo 据我所知,在ScrlBarINF.rcScrollBar将永远是相同的,但n最大和非营利组织将随时改变。 –

+0

我相信nMax不应该改变(除非数据被添加到可滚动控件),但nPos会。 nPos指示滚动框的位置。你不需要检查滚动条的大小。如果nPos在nMax,那么你应该在底部。如果nPos在nMin你应该在最上面。如果你用C#工作,我认为你不需要P/Invoke windows API调用。控件上应该有滚动条的属性。 – pstrjds

+0

pstrjds:事实上,即使滚动拇指在底部,nPos也不等于nMax。但有了上面的公式,它的工作原理。但我不知道为什么。 –

0

它的滚动条的尺寸,而不是大拇指。