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

Is there a way to conditionally check if a window is using a scroll bar?

本文关键字:滚动条 是否 窗口 有条件 检查 有没有      更新时间:2023-10-16

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

按钮根据从myListBox.GetClientRect()检索的值放置。但是,当滚动条出现在myListBox中时,这些按钮的位置不正确,因为GetClientRect没有考虑滚动条之类的东西。

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

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

if (scrollbarinfo.rgstate[0] == (STATE_SYSTEM_INVISIBLE || 
STATE_SYSTEM_UNAVAILABLE))
{
    visible = false;
}
您可以使用

CWnd::GetScrollBarInfo函数并检查其SCROLLBARINFO检索的结构rgstate成员。

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.
}

对于可能看到这篇文章的其他任何人的参考,考虑到@Jovibor所说的,这是我的原始代码对我有用的:

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