YSTest: TextBox.cpp 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

TextBox.cpp
浏览该文件的文档.
1 /*
2 © 2014-2016 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #include "YSLib/UI/YModules.h"
29 #include YFM_YSLib_UI_TextBox
30 #include YFM_YSLib_UI_Border
31 #include YFM_YSLib_UI_YGUI
32 #include YFM_YSLib_Service_TextLayout
33 #include YFM_YSLib_UI_YUIContainer // for LocateForWidget;
34 #include <ystdex/cast.hpp> // for ystdex::polymorphic_downcast;
35 #include <ystdex/scope_guard.hpp> // for ystdex::swap_guard;
36
37 namespace YSLib
38 {
39
40 namespace UI
41 {
42
43 GAnimationSession<InvalidationUpdater> Caret::caret_animation;
44
45 Caret::Caret(IWidget& wgt, HBrush caret_brush,
46 InvalidationUpdater::Invalidator inv)
47 : CaretBrush(caret_brush), CursorInvalidator(inv)
48 {
49 yunseq(
50 FetchEvent<Paint>(wgt) += [this](PaintEventArgs&& e){
51 if(Check(e.GetSender()))
52 CaretBrush(std::move(e));
53 },
54 FetchEvent<GotFocus>(wgt) += [&, this]{
55 // NOTE: Necessary cleanup.
56 Stop();
57 FetchGUIState().ExternalTextInputFocusPtr = make_observer(&wgt);
58 Restart(caret_animation, wgt, CursorInvalidator);
59 },
60 FetchEvent<LostFocus>(wgt) += [this]{
61 Stop();
62 }
63 );
64 }
65 Caret::~Caret()
66 {
67 Stop();
68 }
69
70 bool
71 Caret::Check(IWidget& sender)
72 {
73 if(FetchGUIState().ExternalTextInputFocusPtr.get() == &sender
74 && caret_animation.GetConnectionPtr()
75 && caret_animation.GetConnectionRef().Ready)
76 {
77 if(IsEnabled(sender) && IsFocusedCascade(sender))
78 return CaretTimer.RefreshRemainder() < CaretTimer.Interval / 2;
79 else
80 Stop();
81 }
82 return {};
83 }
84
85 void
86 Caret::Stop() ynothrow
87 {
88 // TODO: Consider possible per-object optimization.
89 if(const auto p = caret_animation.GetConnectionPtr())
90 yunseq(p->Ready = {}, FetchGUIState().ExternalTextInputFocusPtr = {});
91 }
92
93
94 TextBox::TextBox(const Rect& r, const Drawing::Font& fnt,
95 const pair<Color, Color>& hilight_pair)
96 : Control(r, MakeBlankBrush()), MLabel(fnt), MHilightText(hilight_pair),
97 Selection(), CursorCaret(*this, std::bind(&TextBox::PaintDefaultCaret, this,
98 std::placeholders::_1), InvalidateDefaultCaret), h_offset()
99 {
100 yunseq(
101 UpdateClippedText = std::bind(&TextBox::UpdateTextBoxClippedText, this,
102 std::placeholders::_1, std::placeholders::_2),
103 FetchEvent<KeyDown>(*this) += [this](KeyEventArgs&& e){
104 if(e.Strategy == RoutedEventArgs::Direct)
105 {
106 using namespace KeyCategory;
107 using namespace KeyCodes;
108 auto& st(FetchGUIState());
109 auto& sender(e.GetSender());
110
111 if(st.SendInput(e.Keys))
112 {
113 Invalidate(sender);
114 return;
115 }
116
117 const auto& k(st.GetCheckedHeldKeys());
118 auto ek(FindFirstKeyInCategroy(k, Editing));
119
120 if(ek == KeyBitsetWidth)
121 ek = FindFirstKeyInCategroy(k, Navigation);
122 if(ek != KeyBitsetWidth)
123 {
124 const bool shifted(k[Shift]);
125 auto& range(Selection.Range);
126
127 switch(ek)
128 {
129 case Backspace:
130 case Delete:
131 if(Selection.IsEmpty())
132 {
133 if(ek == Backspace)
134 {
135 if(range.second.X == 0)
136 break;
137 --range.second.X;
138 }
139 else
140 {
141 if(range.second.X >= Text.length())
142 break;
143 ++range.second.X;
144 }
145 }
146 ReplaceSelection({});
147 break;
148 case Left:
149 case Right:
150 if(Selection.IsEmpty() || shifted)
151 {
152 if(ek == Left)
153 {
154 if(range.second.X == 0)
155 break;
156 --range.second.X;
157 }
158 else
159 {
160 if(range.second.X >= Text.length())
161 break;
162 ++range.second.X;
163 }
164 if(shifted)
165 break;
166 }
167 else if(range.first.X != range.second.X)
168 {
169 if((ek == Left) == (range.first.X < range.second.X))
170 range.second.X = range.first.X;
171 else
172 range.first.X = range.second.X;
173 break;
174 }
175 CollapseCaret();
176 case Tab:
177 break;
178 case Space:
179 if(!st.ExternalTextInputFocusPtr)
180 ReplaceSelection(u" ");
181 }
182 Invalidate(e.GetSender());
183 return;
184 }
185 }
186 },
187 FetchEvent<KeyHeld>(*this) += OnKeyHeld,
188 FetchEvent<TouchDown>(*this) += [this](CursorEventArgs&& e){
189 if(e.Strategy == RoutedEventArgs::Direct && e[KeyCodes::Primary])
190 switch(FetchGUIState().RefreshTap(e, 3))
191 {
192 case 3:
193 SelectAll();
194 break;
195 case 2:
196 if(!Text.empty())
197 {
198 // TODO: Implement for multiline.
199 auto x(GetCaretPosition(e.Position).X);
200
201 if(x == 0)
202 ++x;
203 Selection.Range = {{x - 1, 0}, {x, 0}};
204 }
205 break;
206 default:
207 Selection.Range.second = GetCaretPosition(e.Position);
208 CollapseCaret();
209 }
210 },
211 FetchEvent<TouchHeld>(*this) += [this](CursorEventArgs&& e){
212 if(e.Strategy == RoutedEventArgs::Direct && e[KeyCodes::Primary])
213 {
214 auto& st(FetchGUIState());
215
216 if(st.GetIndependentFocusPtr().get() == this
217 && st.CheckDraggingOffset(make_observer(this))
218 && st.DraggingOffset != GetLocationOf(*this)
219 - st.CursorLocation)
220 {
221 const auto& sender(e.GetSender());
222
223 Selection.Range.second = GetCaretPosition(&sender == this
224 ? e.Position : LocateForWidget(*this, sender) + e.Position);
225 // XXX: Optimization for block.
226 ExportCaretLocation();
227 Invalidate(*this);
228 }
229 }
230 },
231 FetchEvent<TextInput>(*this) += [this](TextInputEventArgs&& e){
232 ReplaceSelection(e.Text);
233 // XXX: Optimization for block.
234 Invalidate(*this);
235 },
236 FetchEvent<Paint>(*this).Add(BorderBrush(), BackgroundPriority),
237 FetchEvent<GotFocus>(*this) += [this]{
238 Invalidate(*this);
239 },
240 FetchEvent<LostFocus>(*this) += [this]{
241 Invalidate(*this);
242 }
243 );
244 }
245
246 Point
247 TextBox::GetCaretLocation() const
248 {
249 const auto& cur_pos(Selection.Range.second);
250 const auto lh(Font.GetHeight());
251 // TODO: Improve performance?
252 const auto& pen_offset(GetPenOffset());
253
254 // XXX: Conversion to 'SPos' might be implementation-defined.
255 return {pen_offset.X + SPos(MaskChar == char32_t()
256 ? FetchStringWidth(Font, Text, cur_pos.X) : FetchCharWidth(Font,
257 MaskChar) * cur_pos.X), SPos(cur_pos.Y * lh) + pen_offset.Y};
258 }
259 TextSelection::Position
260 TextBox::GetCaretPosition(const Point& pt)
261 {
262 // XXX: Conversion to 'SPos' might be implementation-defined.
263 const auto
264 max_w(size_t(max<SPos>(pt.X + SPos(h_offset) - Margin.Left, SPos())));
265
266 if(MaskChar == char32_t())
267 {
268 auto pr(FetchStringOffsets(max_w, Font, Text));
269
270 if(pr.first > 0 && FetchCharWidth(Font, Text[pr.first - 1]) / 2U + max_w
271 < pr.second)
272 --pr.first;
273 return {pr.first, 0};
274 }
275
276 const SDst w(FetchCharWidth(Font, MaskChar));
277 auto n(min<size_t>((max_w + w - 1U) / w, Text.length()));
278
279 if(n > 0 && w / 2U + max_w < w)
280 --n;
281 return {n, 0};
282 }
283 Point
284 TextBox::GetPenOffset() const
285 {
286 // NOTE: See also implementation of %MLabel::DrawText.
287 return Point(Margin.Left, Margin.Top)
288 + GetAlignedPenOffset(GetSizeOf(*this));
289 }
290
291 void
292 TextBox::CollapseCaret()
293 {
294 if(Selection.Range.first != Selection.Range.second)
295 {
296 Selection.Collapse();
297 RestoreCaretTimer();
298 ExportCaretLocation();
299 }
300 }
301
302 void
303 TextBox::ExportCaretLocation() const
304 {
305 auto& st(FetchGUIState());
306
307 if(st.ExternalTextInputFocusPtr.get() == this)
308 st.CaretLocation = GetCaretLocation();
309 }
310
311 bool
312 TextBox::InvalidateDefaultCaret(IWidget& wgt)
313 {
314 auto& tb(ystdex::polymorphic_downcast<TextBox&>(wgt));
315
316 InvalidateVisible(tb, Rect(tb.GetCaretLocation(), 1, tb.Font.GetHeight()));
317 return true;
318 }
319
320 void
321 TextBox::PaintDefaultCaret(PaintEventArgs&& e)
322 {
323 const auto& caret_loc(e.Location + GetCaretLocation());
324
325 DrawVLineSeg(e.Target, e.ClipArea, caret_loc.X, caret_loc.Y,
326 caret_loc.Y + Font.GetHeight(), ForeColor);
327 }
328
329 void
330 TextBox::Refresh(PaintEventArgs&& e)
331 {
332 ystdex::swap_guard<String> gd(MaskChar != char32_t(), Text, [this]{
333 return String(Text.length(), MaskChar);
334 }());
335
336 (*this)(std::move(e));
337 }
338
339 void
340 TextBox::ReplaceSelection(const String& text)
341 {
342 auto& r(Selection.Range);
343
344 // TODO: Support multiline input.
345 if(r.second.X < r.first.X)
346 std::swap(r.first, r.second);
347
348 const auto len(Text.length());
349 const auto subst_len(r.second.X - r.first.X
350 + (MaxLength > len ? MaxLength - len : 0));
351
352 Text = Text.substr(0, r.first.X) + text.substr(0, subst_len)
353 + Text.substr(min<size_t>(len, r.second.X));
354 r.second.X = r.first.X + min(subst_len, text.length()),
355 CollapseCaret();
356 }
357
358 void
359 TextBox::SelectAll()
360 {
361 // TODO: Implement for multiline.
362 Selection.Range = {{0, 0}, {Text.length(), 0}};
363 RestoreCaretTimer();
364 ExportCaretLocation();
365 }
366
367 void
368 TextBox::UpdateTextBoxClippedText(const PaintContext& pc, TextState& ts)
369 {
370 if(Text.empty())
371 return;
372
373 auto x1(Selection.Range.first.X), x2(Selection.Range.second.X);
374 const auto l(Text.length());
375
376 RestrictUnsignedStrict(x1, l),
377 RestrictUnsignedStrict(x2, l);
378 if(x1 == x2)
379 DefaultUpdateClippedText(pc, ts, Text, AutoWrapLine);
380 else
381 {
382 if(x2 < x1)
383 std::swap(x1, x2);
384
385 // TODO: Blocked. Use ISO C++14 lambda initializers to simplify
386 // implementation.
387 auto p(&Text[0]);
388 const auto q1(p + x1), q2(p + x2);
389 const auto& g(pc.Target);
390 CustomTextRenderer ctr([&, q1, q2](TextRenderer& tr, char32_t c){
391 if(IsInInterval(p, q1, q2))
392 {
393 // TODO: Use colors from %Styles::Palette.
394 FillRect(g, tr.ClipArea, ts.GetCharBounds(c), HilightBackColor);
395 ts.Color = HilightTextColor;
396 }
397 else
398 ts.Color = ForeColor;
399 tr(c);
400 ++p;
401 }, ts, g, pc.ClipArea);
402
403 PutText(AutoWrapLine, ctr, p);
404 }
405 }
406
407 } // namespace UI;
408
409 } // namespace YSLib;
410
platform::p
while p p
Definition: YCLib/FileSystem.h:225
YSLib::UI::InvalidationUpdater::Invalidator
std::function< bool(IWidget &)> Invalidator
Definition: Animation.h:130
YSLib::Drawing::w
The boundary is out of the const Rect SDst w
Definition: YDraw.h:127
YSLib::UI::TextBox::ExportCaretLocation
void ExportCaretLocation() const
导出插入符位置到公共 GUI 状态。
Definition: TextBox.cpp:303
YSLib::Drawing::Font
字体：字模，包含字型、样式和大小。
Definition: Font.h:583
YSLib::UI::TextSelection::Collapse
Collapse
Definition: TextBox.h:194
YSLib::UI::Caret::Check
bool Check(IWidget &)
检查是否需要对指定部件进行绘制。
Definition: TextBox.cpp:71
placeholders
YSLib::UI::TextBox::TextBox
TextBox(const Rect &={}, const Drawing::Font &={}, const pair< Drawing::Color, Drawing::Color > &=FetchGUIConfiguration().Colors.GetPair(Styles::Highlight, Styles::HighlightText))
构造：使用指定边界、字体和高亮背景色/文本色对。
Definition: TextBox.cpp:94
YSLib::IsInInterval
YB_STATELESS bool IsInInterval(_type i, _type b) ynothrow
判断 i 是否在左闭右开区间 [_type(0), b) 中。
Definition: YCoreUtilities.h:84
YSLib::UI::Control
控件。
Definition: YControl.h:275
ystdex::swap
void swap(container_adaptor< _tSeqCon > &x, container_adaptor< _tSeqCon > &y)
Definition: container.hpp:179
platform::KeyCodes::DS::Backspace
Definition: Keys.h:251
YSLib::UI::Caret::CaretTimer
Timers::Timer CaretTimer
决定是否显示插入符的计时器。
Definition: TextBox.h:134
YSLib::UI::TextBox::MaskChar
char32_t MaskChar
掩码字符。
Definition: TextBox.h:245
YSLib::UI::FetchGUIState
GUIState & FetchGUIState() ynothrow
Definition: YGUI.cpp:508
YSLib::UI::MLabel::Margin
Drawing::Padding Margin
文本和容器的间距。
Definition: Label.h:79
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
YSLib::UI::TextBox
文本框。
Definition: TextBox.h:205
YSLib::Drawing::GBinaryGroup::X
_type X
Definition: YGDIBase.h:63
YSLib::UI::MLabel::ForeColor
Color ForeColor
默认前景色。
Definition: Label.h:77
YSLib::UI::TextBox::Refresh
void Refresh(PaintEventArgs &&) override
刷新：按指定参数绘制界面并更新状态。
Definition: TextBox.cpp:330
YSLib::Drawing::CustomTextRenderer
定制文本渲染器：使用自定义的渲染函数替代的 TextRenderer 。
Definition: TextRenderer.h:456
YSLib::Drawing::TextRenderer
文本渲染器：简单实现。
Definition: TextRenderer.h:398
YSLib::UI::MHilightText::HilightBackColor
Color HilightBackColor
高亮背景色。
Definition: Label.h:217
YSLib::UI::TextBox::GetCaretPosition
TextSelection::Position GetCaretPosition(const Point &)
取指定点所在的插入符光标逻辑位置。
Definition: TextBox.cpp:260
YSLib::UI::TextSelection::Range
Span Range
选择的范围。
Definition: TextBox.h:182
YSLib::Drawing::char32_t
tr TextRegion &tr char32_t
Definition: TextLayout.h:92
YSLib::UI::MLabel::UpdateClippedText
Drawing::GBrushUpdater< Drawing::TextState &, const String &, bool > UpdateClippedText
当前使用的剪切文本更新器。
Definition: Label.h:71
YSLib::UI::MHilightText
高亮文本模块。
Definition: Label.h:213
YSLib::Drawing::FetchStringOffsets
pair< size_t, SDst > FetchStringOffsets(size_t max_width, const Font &fnt, _tIter s)
取迭代器指定的单行字符串在指定字体和宽度时的最多能显示的字符数和宽。
Definition: TextLayout.h:106
YSLib::UI::RoutedEventArgs::Direct
直接事件：仅当遍历至目标控件时触发。
Definition: YWidgetEvent.h:109
YSLib::UI::MHilightText::HilightTextColor
Color HilightTextColor
高亮文本色。
Definition: Label.h:219
ystdex::state_guard
使用临时状态暂存对象的作用域守护。
Definition: scope_guard.hpp:235
YSLib::Text::String
YSLib 标准字符串（使用 UCS-2 作为内部编码）。
Definition: YString.h:46
CHRLib::c
c
Definition: CharacterProcessing.h:81
platform::KeyCodes::DS::Space
Definition: Keys.h:259
platform::KeyCategory::Editing
表示编辑键（如回车、空格、退格、插入、删除和制表符）
Definition: Keys.h:123
YSLib::Timers::Timer::RefreshRemainder
Duration RefreshRemainder()
刷新：对非零时间间隔判断有效性并都更新时间基点。
Definition: YTimer.cpp:108
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
platform::KeyCodes::DS::Shift
Definition: Keys.h:253
YSLib::Drawing::PenStyle::Color
Drawing::Color Color
笔颜色。
Definition: TextBase.h:58
YSLib::UI::IsFocusedCascade
YF_API bool IsFocusedCascade(const IWidget &, observer_ptr< const IWidget >={})
判断部件相对指针指定的部件是否具有级联焦点。
Definition: YFocus.cpp:121
YSLib::ynothrow
YB_PURE const _type size_t n ynothrow
Definition: YCoreUtilities.h:168
YSLib::UI::HBrush
std::function< void(PaintEventArgs &&)> HBrush
画刷回调函数。
Definition: YComponent.h:81
YSLib::UI::TextBox::Selection
TextSelection Selection
选择区域：结束位置指示插入符光标逻辑位置。
Definition: TextBox.h:225
YSLib::UI::TextBox::CollapseCaret
void CollapseCaret()
折叠选择区域、重置插入符光标计时器并导出插入符位置。
Definition: TextBox.cpp:292
platform::KeyCodes::DS::Tab
Definition: Keys.h:252
YSLib::Drawing::Font::GetHeight
FontSize GetHeight() const ynothrow
取字体对应的字符高度。
Definition: Font.cpp:526
YSLib::Drawing::PutText
void PutText(bool multi, _tParams &&...args)
打印文本。
Definition: TextRenderer.h:312
cast.hpp
C++ 转换模板。
YSLib::UI::TextSelection::Position
GBinaryGroup< size_t > Position
位置：横坐标和纵坐标。
Definition: TextBox.h:174
std
Definition: memory.hpp:1100
YSLib::UI::BackgroundPriority
yconstexpr const EventPriority BackgroundPriority(0xC0)
用户界面绘制优先级。
platform::SPos
std::int16_t SPos
屏幕坐标度量。
Definition: Video.h:42
YSLib::UI::OnKeyHeld
YF_API void OnKeyHeld(KeyEventArgs &&)
处理键接触保持事件。
Definition: YControl.cpp:109
platform::KeyCodes::DS::Primary
static yconstexpr const NativeSet Primary
Definition: Keys.h:241
YSLib::UI::Caret::CursorInvalidator
InvalidationUpdater::Invalidator CursorInvalidator
供闪烁动画使用的指定无效化区域的光标位置刷新器。
Definition: TextBox.h:144
YSLib::UI::MLabel::GetAlignedPenOffset
Point GetAlignedPenOffset(const Size &) const
按参数指定的边界大小和当前状态计算笔的偏移位置。
Definition: Label.cpp:52
YSLib::RestrictUnsignedStrict
void RestrictUnsignedStrict(_type &u, _type b) ynothrow
约束无符号整数 u 在区间上界 b 内。
Definition: YCoreUtilities.h:236
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
YSLib::Drawing::FetchStringWidth
SDst FetchStringWidth(const Font &fnt, _tIter s)
取迭代器指定的单行字符串在字体指定、无边界限制时的显示宽度。
Definition: TextLayout.h:197
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:996
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:112
YSLib::UI::CursorEventArgs
指针设备输入事件参数类。
Definition: YWidgetEvent.h:210
YSLib::UI::InvalidateVisible
YF_API void InvalidateVisible(IWidget &, const Rect &)
无效化：使相对可见的部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:148
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
YSLib::Drawing::Padding::Top
SPos Top
Definition: YGDI.h:52
YSLib::UI::Restart
_fCallable void Restart(_tAnimation &ani, IWidget &wgt, _fCallable f)
Definition: Animation.h:184
YSLib::UI::TextBox::MaxLength
size_t MaxLength
用户界面输入文本的最大长度。
Definition: TextBox.h:236
YSLib::Drawing::x1
The boundary is out of the const Rect SDst SPos x1
Definition: YDraw.h:148
YSLib::Drawing::r
The boundary is out of the const Graphics const Rect const Point const Point Color c const Rect const Rect & r
Definition: YDraw.h:174
UI
YSLib::UI::BorderArea::Left
scope_guard.hpp
作用域守护。
YSLib::UI::Widget::SPos
Renderer AView SPos
Definition: YWidget.h:459
YSLib::UI::TextBox::h_offset
SDst h_offset
文字区域水平基准负偏移：文本内容在光标回退方向超出的未显示部分大小。
Definition: TextBox.h:252
YSLib::UI::e
void e
Definition: YWidget.h:352
YSLib::UI::TextBox::GetPenOffset
Point GetPenOffset() const
取按字体和边距计算的起始笔偏移。
Definition: TextBox.cpp:284
YModules.h
platform::KeyCategory::Navigation
表示导航键（如方向键和 PgUp ）、菜单键和 Esc 。
Definition: Keys.h:121
YSLib::UI::TextBox::PaintDefaultCaret
void PaintDefaultCaret(PaintEventArgs &&)
绘制默认插入符。
Definition: TextBox.cpp:321
Text
YSLib::Drawing::Point
GBinaryGroup< SPos > Point
屏幕二维点（直角坐标表示）。
Definition: YGDIBase.h:278
YSLib::UI::Caret::~Caret
~Caret()
Definition: TextBox.cpp:65
YSLib::UI::TextBox::InvalidateDefaultCaret
static bool InvalidateDefaultCaret(IWidget &)
无效化默认插入符。
Definition: TextBox.cpp:312
YSLib::Drawing::FillRect
c YF_API void FillRect(const Graphics &g, const Rect &r, Color c)
填充标准矩形。
Definition: YDraw.cpp:150
YSLib::UI::GetSizeOf
pt pt Y const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.h:161
YSLib::UI::Caret::CaretBrush
HBrush CaretBrush
插入符画刷。
Definition: TextBox.h:139
YSLib::Timers::Timer::Interval
Duration Interval
重复刷新有效的最小时间间隔。
Definition: YTimer.h:88
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: memory.hpp:1042
ystdex::min
const _type & min(const _type &a, const _type &b, _fComp comp=less< _type >())
取较小的元素。
Definition: algorithm.hpp:521
YSLib::UI::MLabel::AutoWrapLine
bool AutoWrapLine
启用自动换行。
Definition: Label.h:91
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
YSLib::Drawing::Padding::Left
SPos Left
空白距离：左、右、上、下。
Definition: YGDI.h:52
YSLib::Drawing::TextState
文本状态。
Definition: TextBase.h:86
YSLib::UI::GetLocationOf
pt pt Y const IWidget &wgt GetLocationOf
Definition: YWidget.h:153
YSLib::Drawing::g
The boundary is out of the const Graphics & g
Definition: YDraw.h:161
YSLib::UI::TextBox::UpdateTextBoxClippedText
void UpdateTextBoxClippedText(const PaintContext &, TextState &)
Definition: TextBox.cpp:368
YSLib::Drawing::TextRenderer::ClipArea
Rect ClipArea
Definition: TextRenderer.h:403
YSLib::UI::Caret::caret_animation
static GAnimationSession< InvalidationUpdater > caret_animation
插入符闪烁动画。
Definition: TextBox.h:130
YSLib::UI::KeyEventArgs
按键输入事件参数类。
Definition: YWidgetEvent.h:186
YSLib::UI::MLabel::Font
Drawing::Font Font
字体。
Definition: Label.h:78
YSLib::UI::Caret::Stop
static void Stop() ynothrow
停止插入符光标动画。
Definition: TextBox.cpp:86
YSLib::UI::MLabel
标签模块。
Definition: Label.h:61
YSLib::Drawing::x2
The boundary is out of the const Rect SDst SPos SPos SPos x2
Definition: YDraw.h:148
YSLib::UI::MLabel::DefaultUpdateClippedText
static void DefaultUpdateClippedText(const PaintContext &, Drawing::TextState &, const String &, bool)
绘制剪切文本：使用指定的绘制上下文和文本状态。
Definition: Label.cpp:116
YSLib::UI::TextBox::SelectAll
void SelectAll()
全选操作。
Definition: TextBox.cpp:359
YSLib::UI::Caret::Caret
Caret(IWidget &, HBrush, InvalidationUpdater::Invalidator)
构造：注册插入符光标动画的事件处理器和画刷。
Definition: TextBox.cpp:45
platform::KeyCategory::FindFirstKeyInCategroy
YF_API KeyIndex FindFirstKeyInCategroy(const KeyInput &, KeyIndex) ynothrow
找到第一个在指定类别的按键编码。
Definition: Keys.cpp:1115
platform::n
size_t n
Definition: YCLib/FileSystem.cpp:321
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:43
YSLib::UI::BorderArea::Right
YSLib::Drawing::GBinaryGroup< SPos >
YSLib::Drawing::FetchCharWidth
SDst FetchCharWidth(const Font &fnt, char32_t c)
Definition: TextLayout.cpp:72