【问题标题】:Is there a way to conditionally check if a window is using a scroll bar?有没有办法有条件地检查窗口是否正在使用滚动条?
【发布时间】:2019-10-31 11:15:39
【问题描述】:

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

根据从myListBox.GetClientRect() 检索到的值放置按钮。但是,当myListBox 中存在滚动条时,这些按钮的位置会不正确,因为GetClientRect 没有考虑滚动条等内容。

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

我试过GetWindowRect,但我认为封装列表框的窗口比列表框本身大得多(事后看来这很明显)。

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

【问题讨论】:

  • GetWindowRect + MapWindowPoints 是你的答案

标签: c++ windows visual-studio mfc


【解决方案1】:

您可以使用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.
}

【讨论】:

  • 我用我的条件代码的一点 sn-p 更新了帖子。我在这里必须对检查 rgstate 有一个很大的误解,因为 visible 永远不会评估为 false。有什么帮助吗?
  • @JimmyBlundell 我更新了我的帖子,工作被剪断了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多