有没有办法有条件地检查窗口是否在使用滚动条?

时间:2019-06-17 20:26:08

标签: c++ windows visual-studio mfc

在我正在处理的应用程序中,相对于直接位于其左侧的CListBox(我们称之为myListBox),在屏幕上绘制了2个按钮。

根据从myListBox.GetClientRect()获取的值放置按钮。但是,myListBox中有滚动条时,这些按钮的位置不正确,因为GetClientRect不能解决滚动条之类的问题。

我很好奇是否有条件的方式可以检查列表框当前是否使用滚动条。这样,我可以将差异应用到移动按钮的功能上,以便无论是否存在滚动条都可以实现正确的放置。

我尝试过GetWindowRect,但是我想封装列表框的窗口比列表框本身大得多(事后看来,这是显而易见的)。

if (scrollbarinfo.rgstate[0] == (STATE_SYSTEM_INVISIBLE || 
STATE_SYSTEM_UNAVAILABLE))
{
    visible = false;
}

2 个答案:

答案 0 :(得分:1)

您可以使用CWnd::GetScrollBarInfo函数并检查其rgstate检索到的结构中的SCROLLBARINFO成员。

SCROLLBARINFO sbi { };
LONG lScrollBar = OBJID_VSCROLL; //can also be OBJID_HSCROLL or OBJID_CLIENT
GetScrollBarInfo(lScrollBar, &sbi);

if (sbi.rgstate[0] & STATE_SYSTEM_INVISIBLE)
{
    //Scroll bar is not visible at the moment.
}
else if (sbi.rgstate[0] & STATE_SYSTEM_UNAVAILABLE)
{
    //Scrol bar is disabled, but might be visible.
}

答案 1 :(得分:0)

考虑到@Jovibor所说的话,对于可能会看到此帖子的其他人以参考,这对我来说是可行的,因为我的原始代码是:

int info = scrollbarinfo.rgstate[0];
if ((info & (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_UNAVAILABLE)) != 0)
{
visible = false;
}