5#include "ScrollEnums.h"
11 template <
typename TBase,
typename =
void>
17 template <
typename TBase>
26 static constexpr int _LayerScrollBarLineInterval = 20;
32 bool _autoSize =
true;
42 bool _horizontalScrollDisabled =
true;
47 bool _verticalScrollDisabled =
true;
52 bool _mouseWheelScrollEnabled =
true;
61 return self->_customLayout;
64 if (
self->_customLayout != value) {
66 value->Associate(self);
67 self->_customLayout = value;
68 self->RaisePropertyChanged(&Layer::Layout);
69 self->InvalidateMeasure();
79 return self->_autoSize;
82 if (
self->_autoSize != value) {
83 self->_autoSize = value;
84 self->RaisePropertyChanged(&Layer::AutoSize);
85 self->InvalidateMeasure();
98 if (
self->HorizontalScrollBar == value) {
103 self->RaisePropertyChanged(&Layer::HorizontalScrollBar);
104 self->HorizontalScrollPos =
self->HorizontalScrollPos;
106 self->HorizontalScrollPos = 0;
108 self->RaisePropertyChanged(&Layer::HorizontalScrollBar);
121 if (
self->VerticalScrollBar == value) {
126 self->RaisePropertyChanged(&Layer::VerticalScrollBar);
127 self->VerticalScrollPos =
self->VerticalScrollPos;
129 self->VerticalScrollPos = 0;
131 self->RaisePropertyChanged(&Layer::VerticalScrollBar);
148 self->_SetHorizontalScrollPos(value);
165 self->_SetVerticalScrollPos(value);
174 if (
self->_horizontalScrollDisabled) {
190 if (
self->_verticalScrollDisabled) {
206 return self->_mouseWheelScrollEnabled;
209 if (
self->_mouseWheelScrollEnabled != value) {
210 self->_mouseWheelScrollEnabled = value;
211 self->RaisePropertyChanged(&Layer::MouseWheelScrollEnabled);
224 _MeasureAndArrangeWithoutLayout();
226 _MeasureAndArrangeWithoutResize(*
layout, this->ClientRect->GetSize());
249 this->RaiseRoutedEvent(
args);
259 HorizontalScrollPos = pos;
271 ScrollHorizontal(-GetHorizontalScrollPageSize());
275 ScrollHorizontal(GetHorizontalScrollPageSize());
279 ScrollHorizontal(-_LayerScrollBarLineInterval);
283 ScrollHorizontal(_LayerScrollBarLineInterval);
294 VerticalScrollPos = pos;
306 ScrollVertical(-GetVerticalScrollPageSize());
310 ScrollVertical(GetVerticalScrollPageSize());
314 ScrollVertical(-_LayerScrollBarLineInterval);
318 ScrollVertical(_LayerScrollBarLineInterval);
375 if (
layout ==
nullptr || !_autoSize) {
392 _MeasureAndArrangeWithoutLayout();
393 }
else if (!_autoSize) {
409 bool handled =
false;
416 if (VerticalScrollBar)
418 double curPos = VerticalScrollPos;
421 VerticalScrollPos =
rect.top;
424 VerticalScrollPos =
rect.top;
432 if (HorizontalScrollBar)
434 double curPos = HorizontalScrollPos;
437 HorizontalScrollPos =
rect.left;
440 HorizontalScrollPos =
rect.left;
465 double offset = -std::copysign(_LayerScrollBarLineInterval,
wheelArgs.wheelDelta);
467 if (HorizontalScrollBar) {
472 if (VerticalScrollBar) {
596 if (_GetLayout() ==
nullptr) {
599 _horizontalScrollDisabled =
false;
600 _verticalScrollDisabled =
false;
604 if (HorizontalScrollBar)
609 _horizontalScrollDisabled =
false;
614 double pos = HorizontalScrollPos;
615 if (-this->GetInternalArrangeOffsetX() > pos) {
616 HorizontalScrollPos = pos;
619 HorizontalScrollPos = 0;
621 _horizontalScrollDisabled =
true;
625 if (VerticalScrollBar)
630 _verticalScrollDisabled =
false;
635 double pos = VerticalScrollPos;
636 if (-this->GetInternalArrangeOffsetY() > pos) {
637 VerticalScrollPos = pos;
640 VerticalScrollPos = 0;
642 _verticalScrollDisabled =
true;
652 VerticalScrollPos = 0;
660 VerticalScrollPos = VerticalScrollLimit;
668 HorizontalScrollPos = 0;
676 HorizontalScrollPos = HorizontalScrollLimit;
685 HorizontalScrollPos +=
offset;
694 VerticalScrollPos +=
offset;
703 auto layout = (_customLayout !=
nullptr) ? _customLayout : GetDefaultLayout();
711 void _SetHorizontalScrollPos(
double value)
713 if (HorizontalScrollPos != value) {
715 info.cbSize =
sizeof(info);
716 info.fMask = SIF_POS;
718 SetScrollInfo(this->Handle, SB_HORZ, &info,
true);
719 this->RaisePropertyChanged(&Layer::HorizontalScrollPos);
722 LayoutHost *layout = this->_GetLayout();
724 if (layout !=
nullptr && !this->_horizontalScrollDisabled && this->HorizontalScrollBar) {
725 this->GetInternalArrangeOffsetX() = -this->HorizontalScrollPos;
726 this->_MeasureAndArrangeWithoutResize(*layout, this->ClientRect->GetSize());
734 void _SetVerticalScrollPos(
double value)
736 if (VerticalScrollPos != value) {
738 info.cbSize =
sizeof(info);
739 info.fMask = SIF_POS;
741 SetScrollInfo(this->Handle, SB_VERT, &info,
true);
742 this->RaisePropertyChanged(&Layer::VerticalScrollPos);
745 LayoutHost *layout = this->_GetLayout();
747 if (layout !=
nullptr && !this->_verticalScrollDisabled && this->VerticalScrollBar) {
748 this->GetInternalArrangeOffsetY() = -this->VerticalScrollPos;
749 this->_MeasureAndArrangeWithoutResize(*layout, this->ClientRect->GetSize());
756 void _MeasureAndArrangeWithoutLayout()
758 this->GetInternalArrangeOffsetX() = 0;
759 this->GetInternalArrangeOffsetY() = 0;
761 int childCount = this->GetChildLayoutCount();
763 for (
int i = 0; i < childCount; ++i) {
765 UIElement &item = this->GetChildLayoutAt(i);
766 item.Measure(Size{INFINITY, INFINITY});
768 Size desireSize = item.GetDesireSize();
770 Thickness itemMargin = item.Margin;
771 item.Arrange(
sw::Rect{itemRect.
left - itemMargin.left, itemRect.
top - itemMargin.top, desireSize.width, desireSize.height});
778 void _MeasureAndArrangeWithoutResize(LayoutHost &layout,
const Size &clientSize)
780 if (layout.IsAssociated(
this)) {
781 layout.MeasureOverride(clientSize);
782 layout.ArrangeOverride(clientSize);
789 extern template class Layer<UIElement>;
static int DipToPxY(double dip) noexcept
dip转像素(垂直方向)
static int DipToPxX(double dip) noexcept
dip转像素(水平方向)
static double PxToDipX(int px) noexcept
像素转dip(水平方向)
static double PxToDipY(int px) noexcept
像素转dip(垂直方向)
值转换器接口
Definition IValueConverter.h:14
virtual Size MeasureOverride(const Size &availableSize) override
测量元素所需尺寸,无需考虑边框和边距
Definition Layer.h:369
virtual void Arrange(const sw::Rect &finalPosition) override
安排元素位置
Definition Layer.h:358
void UpdateLayout()
更新布局
Definition Layer.h:219
virtual LayoutHost * GetDefaultLayout()
获取默认布局对象
Definition Layer.h:235
void SetVerticalScrollRange(double min, double max)
设置纵向滚动条的范围
Definition Layer.h:531
void ScrollToRight()
将水平滚动条移动到最右
Definition Layer.h:674
void UpdateScrollRange()
根据子元素更新滚动条范围,未设定布局方式时该函数无效
Definition Layer.h:594
virtual void ArrangeOverride(const Size &finalSize) override
安排子元素的位置,可重写该函数以实现自定义布局
Definition Layer.h:386
void SetHorizontalScrollPageSize(double pageSize)
设置水平滚动条滚动页面大小
Definition Layer.h:570
void ScrollHorizontal(double offset)
水平滚动
Definition Layer.h:683
void ScrollToLeft()
将水平滚动条移动到最左
Definition Layer.h:666
void SetHorizontalScrollRange(double min, double max)
设置横向滚动条的范围
Definition Layer.h:514
void ScrollToBottom()
将垂直滚动条移动到底部
Definition Layer.h:658
void GetVerticalScrollRange(double &refMin, double &refMax)
获取纵向滚动条的范围
Definition Layer.h:500
void ScrollVertical(double offset)
垂直滚动
Definition Layer.h:692
virtual bool OnVerticalScroll(int event, int pos) override
接收到WM_VSCROLL时调用目标控件的该函数
Definition Layer.h:334
void SetVerticalScrollPageSize(double pageSize)
设置垂直滚动条滚动页面大小
Definition Layer.h:582
virtual void OnRoutedEvent(RoutedEventArgs &eventArgs, const RoutedEventHandler &handler) override
路由事件经过当前元素时调用该函数
Definition Layer.h:456
virtual void OnScroll(ScrollOrientation scrollbar, ScrollEvent event, double pos)
触发滚动条相关事件时调用该函数
Definition Layer.h:246
virtual bool RequestBringIntoView(const sw::Rect &screenRect) override
尝试将指定的矩形区域移动到可视区域内
Definition Layer.h:407
void ScrollToTop()
将垂直滚动条移动到顶部
Definition Layer.h:650
void GetHorizontalScrollRange(double &refMin, double &refMax)
获取横向滚动条的范围
Definition Layer.h:486
double GetVerticalScrollPageSize()
获取垂直滚动条滚动页面大小
Definition Layer.h:558
double GetHorizontalScrollPageSize()
获取水平滚动条滚动页面大小
Definition Layer.h:546
virtual bool OnHorizontalScroll(int event, int pos) override
接收到WM_HSCROLL时调用目标控件的该函数
Definition Layer.h:347
用于托管元素的布局方式的对象类型,是所有布局方式类型的基类
Definition LayoutHost.h:11
鼠标滚轮滚动事件参数类型
Definition RoutedEventArgs.h:190
static auto Init() -> StaticPropertyInitializer< T >
获取静态属性初始化器
Definition Property.h:1554
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
ScrollOrientation
滚动条方向
Definition ScrollEnums.h:10
@ AutoSize
调整BmpBox大小,使其等于所包含位图的大小
ScrollEvent
滚动条事件
Definition ScrollEnums.h:18
@ Bottom
Scrolls to the lower right.
@ ThubmTrack
The user is dragging the scroll box. This message is sent repeatedly until the user releases the mous...
@ LineLeft
Scrolls left by one unit.
@ LineRight
Scrolls right by one unit.
@ LineDown
Scrolls one line down.
@ Right
Scrolls to the lower right.
@ Left
Scrolls to the upper left.
@ PageUp
Scrolls one page up.
@ LineUp
Scrolls one line up.
@ Top
Scrolls to the upper left.
@ PageRight
Scrolls right by the width of the window.
@ PageLeft
Scrolls left by the width of the window.
@ PageDown
Scrolls one page down.
@ UIElement_MouseWheel
鼠标滚轮滚动,参数类型为sw::MouseWheelEventArgs
Definition RoutedEvent.h:53
表示相对于左上角的点坐标
Definition Point.h:15
double y
纵坐标
Definition Point.h:24
double x
横坐标
Definition Point.h:19
表示一个矩形区域
Definition Rect.h:17
double top
顶边
Definition Rect.h:26
double left
左边
Definition Rect.h:21
路由事件的参数
Definition RoutedEvent.h:157