检测水平滚动是否可见

时间:2014-06-20 11:00:09

标签: c++ winapi wxwidgets

我有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);

每件事都按预期工作。在全屏幕上没有滚动,当我正在调整大小时,Scroll正在进行,并获得主窗口的OnSize()事件处理程序。在Onsize()中,我想检测滚动条是否可见。 任何有关普通Win32 API的帮助也被接受。

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

2 个答案:

答案 0 :(得分:0)

试试这个简单的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;

答案 1 :(得分:0)

您可以使用wxScrolled::IsScrollbarShown(wxHORIZONTAL),但是您确定确实需要它吗?根据滚动条是否显示而不得不采取不同的做法是非常不寻常的,您还应该考虑到某些平台不会一直显示滚动条,而只是在鼠标悬停在窗口边缘时将它们抬起来。