【问题标题】:Detect that Horizontal Scroll is visible or not检测水平滚动是否可见
【发布时间】:2014-06-20 11:00:09
【问题描述】:

我有 wxWidget 应用程序并创建了一个滚动窗口

wxScrolledWindow *pScrollingBucket = new wxScrolledWindow(this, wxID_ANY);
wxPanel* pPanel1 = new wxPanel(pScrollingBucket , wxID_ANY);
wxPanel* pPanel2 = new wxPanel(pScrollingBucket , wxID_ANY);

wxBoxSizer* pSizerHorz = new wxBoxSizer(wxHORIZONTAL);
pSizerHorz->Add(pPanel1 , 1, wxGROW|wxALL, 0);
pSizerHorz->Add(pPanel2 , 1, wxGROW|wxALL, 0);
pScrollingBucket->SetSizer(pSizerHorz);
pScrollingBucket->FitInside();
pScrollingBucket->SetScrollRate(3, 0);

一切都按预期工作。在全屏上没有滚动,当我调整到小尺寸时,滚动正在到来,并获取主窗口的 OnSize() 事件处理程序。在 Onsize() 我想检测滚动条是否可见。 也接受任何有关普通 Win32 API 的帮助。

不建议使用 HasScrollbar(),它只告诉窗口是否有 wxHSCROLL 创建标志。

【问题讨论】:

  • 是否可以从wxScrolledWindow派生并覆盖wxWindow::SetScrollbar()?您可以检测到滚动条何时打开和关闭。

标签: c++ winapi wxwidgets


【解决方案1】:

试试这个简单的 Win32 代码:

function IsScrollBarVisible(AWindow: HWND; AVert: Boolean): Boolean;
var
  Code: Integer;
  Info: TScrollInfo;
begin
  if AVert then Code := SB_VERT
           else Code := SB_HORZ;
  Code := SB_VERT;
  Info.cbSize := SizeOf(Info);
  Info.fMask := SIF_RANGE or SIF_PAGE;
  GetScrollInfo(AWindow, Code, Info);
  Result := (Info.nMin <> Info.nMax) and (Info.nPage <= Info.nMax);
end;

【讨论】:

    【解决方案2】:

    您可以为此使用wxScrolled::IsScrollbarShown(wxHORIZONTAL),但您确定您真的需要它吗?根据滚动条是否显示而必须做不同的事情是很不寻常的,您还应该考虑到某些平台不会一直显示滚动条,而是在鼠标悬停在窗口边缘附近时将它们显示出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2011-02-10
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2017-05-21
      相关资源
      最近更新 更多