#include "HListView.h" namespace ezui { void HListView::Init() { this->GetScrollBar()->SetWidth(Width());//滚动条宽度 this->GetScrollBar()->Parent = this; this->GetScrollBar()->OffsetCallback = [this](int offsetValue)->void { if (this->GetScrollBar()->ScrollPos() >= 1) { NextPage(); } this->Offset(offsetValue); }; } HListView::HListView(Object* parentObject) :PagedListView(parentObject) { Init(); } HListView::~HListView() { } void HListView::OnLayout() { this->Offset(0); if (IsAutoWidth()) { this->GetScrollBar()->SetVisible(false); } else if (this->GetScrollBar()->IsVisible() == true) { this->GetScrollBar()->SetVisible(true); } this->GetScrollBar()->RefreshScroll(); } ScrollBar* HListView::GetScrollBar() { return &m_hScrollBar; } void HListView::Offset(int offset) { int _contentHeight = 0; int _contentWidth = offset; for (auto& it : GetControls()) { if (it->IsVisible() == false) { it->SetX(0); continue; } //处理y坐标和margin { int height = it->GetFixedHeight(); if (height == 0) { height = this->Height() - it->Margin.GetVSpace(); } int y = it->Y(); if (y == 0) { y = it->Margin.Top; } if (y == 0 && height < this->Height()) { y = int((this->Height() * 1.0 - height) / 2 + 0.5); } _contentWidth += it->Margin.Left; it->SetRect(Rect(_contentWidth, y, it->Width(), height)); _contentWidth += it->Width(); _contentWidth += it->Margin.Right; } //计算最大高度 int _height = it->Y() + it->Height() + it->Margin.Bottom; if (_height > _contentHeight) { _contentHeight = _height; } } this->SetContentSize({ _contentWidth - offset,_contentHeight }); } void HListView::OnChildPaint(PaintEventArgs& args) { ViewControls.clear(); //绘制子控件 auto rect = Rect(0, 0, Width(), Height()); for (auto& it : GetControls()) { if (rect.IntersectsWith(it->GetRect())) { ViewControls.push_back(it); } if (it->X() >= Width()) { break; ////当控件超出容器底部将不再派发绘制事件 但是仍然要进行布局 //if (it->IsAutoWidth() && it->GetLayoutState() == LayoutState::Pend) { // it->RefreshLayout(); //} } else { it->SendEvent(args); } } } };