YSTest: TextBox.cpp 源文件

YSTest PreAlpha_b800_20170810 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,
333 String(Text.length(), MaskChar));
334
335 (*this)(std::move(e));
336 }
337
338 void
339 TextBox::ReplaceSelection(const String& text)
340 {
341 auto& r(Selection.Range);
342
343 // TODO: Support multiline input.
344 if(r.second.X < r.first.X)
345 std::swap(r.first, r.second);
346
347 const auto len(Text.length());
348 const auto subst_len(r.second.X - r.first.X
349 + (MaxLength > len ? MaxLength - len : 0));
350
351 Text = Text.substr(0, r.first.X) + text.substr(0, subst_len)
352 + Text.substr(min<size_t>(len, r.second.X));
353 r.second.X = r.first.X + min(subst_len, text.length()),
354 CollapseCaret();
355 }
356
357 void
358 TextBox::SelectAll()
359 {
360 // TODO: Implement for multiline.
361 Selection.Range = {{0, 0}, {Text.length(), 0}};
362 RestoreCaretTimer();
363 ExportCaretLocation();
364 }
365
366 void
367 TextBox::UpdateTextBoxClippedText(const PaintContext& pc, TextState& ts)
368 {
369 if(Text.empty())
370 return;
371
372 auto x1(Selection.Range.first.X), x2(Selection.Range.second.X);
373 const auto l(Text.length());
374
375 RestrictUnsignedStrict(x1, l),
376 RestrictUnsignedStrict(x2, l);
377 if(x1 == x2)
378 DefaultUpdateClippedText(pc, ts, Text, AutoWrapLine);
379 else
380 {
381 if(x2 < x1)
382 std::swap(x1, x2);
383
384 // TODO: Blocked. Use ISO C++14 lambda initializers to simplify
385 // implementation.
386 auto p(&Text[0]);
387 const auto q1(p + x1), q2(p + x2);
388 const auto& g(pc.Target);
389 CustomTextRenderer ctr([&, q1, q2](TextRenderer& tr, char32_t c){
390 if(IsInInterval(p, q1, q2))
391 {
392 // TODO: Use colors from %Styles::Palette.
393 FillRect(g, tr.ClipArea, ts.GetCharBounds(c), HilightBackColor);
394 ts.Color = HilightTextColor;
395 }
396 else
397 ts.Color = ForeColor;
398 tr(c);
399 ++p;
400 }, ts, g, pc.ClipArea);
401
402 PutText(AutoWrapLine, ctr, p);
403 }
404 }
405
406 } // namespace UI;
407
408 } // namespace YSLib;
409
platform::KeyCategory::FindFirstKeyInCategroy
YF_API KeyIndex FindFirstKeyInCategroy(const KeyInput &, KeyIndex) ynothrow
找到第一个在指定类别的按键编码。
Definition: Keys.cpp:1115
YSLib::UI::Caret::Caret
Caret(IWidget &, HBrush, InvalidationUpdater::Invalidator)
构造：注册插入符光标动画的事件处理器和画刷。
Definition: TextBox.cpp:45
YSLib::Timers::Timer::Interval
Duration Interval
重复刷新有效的最小时间间隔。
Definition: YTimer.h:88
YSLib::UI::TextBox::h_offset
SDst h_offset
文字区域水平基准负偏移：文本内容在光标回退方向超出的未显示部分大小。
Definition: TextBox.h:252
YSLib::UI::ynothrow
AView &y ynothrow
Definition: YWidgetView.cpp:47
YSLib::UI::Caret::~Caret
~Caret()
Definition: TextBox.cpp:65
YSLib::Drawing::CustomTextRenderer
定制文本渲染器：使用自定义的渲染函数替代的 TextRenderer 。
Definition: TextRenderer.h:456
YSLib::Drawing::Font
字体：字模，包含字型、样式和大小。
Definition: Font.h:583
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::UI::TextBox::InvalidateDefaultCaret
static bool InvalidateDefaultCaret(IWidget &)
无效化默认插入符。
Definition: TextBox.cpp:312
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
YSLib::UI::MHilightText::HilightTextColor
Color HilightTextColor
高亮文本色。
Definition: Label.h:219
YSLib::UI::Caret::CursorInvalidator
InvalidationUpdater::Invalidator CursorInvalidator
供闪烁动画使用的指定无效化区域的光标位置刷新器。
Definition: TextBox.h:144
cast.hpp
C++ 转换模板。
YSLib::UI::TextBox::CollapseCaret
void CollapseCaret()
折叠选择区域、重置插入符光标计时器并导出插入符位置。
Definition: TextBox.cpp:292
UI
YSLib::UI::CursorEventArgs
指针设备输入事件参数类。
Definition: YWidgetEvent.h:210
ystdex::make_observer
observer_ptr< _type > make_observer(_type *p)
Definition: pointer.hpp:326
YSLib::UI::InvalidateVisible
YF_API void InvalidateVisible(IWidget &, const Rect &)
无效化：使相对可见的部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:148
YSLib::Drawing::Font::GetHeight
FontSize GetHeight() const ynothrow
取字体对应的字符高度。
Definition: Font.cpp:526
YSLib::UI::Caret::caret_animation
static GAnimationSession< InvalidationUpdater > caret_animation
插入符闪烁动画。
Definition: TextBox.h:130
YSLib::Drawing::x1
The boundary is out of the const Rect SDst SPos x1
Definition: YDraw.h:148
YSLib::Drawing::PenStyle::Color
Drawing::Color Color
笔颜色。
Definition: TextBase.h:58
YSLib::UI::MHilightText::HilightBackColor
Color HilightBackColor
高亮背景色。
Definition: Label.h:217
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
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
YSLib::UI::TextBox::MaskChar
char32_t MaskChar
掩码字符。
Definition: TextBox.h:245
Text
platform::KeyCodes::DS::Tab
Definition: Keys.h:252
YSLib::UI::MLabel::ForeColor
Color ForeColor
默认前景色。
Definition: Label.h:77
YSLib::UI::wgt
IWidget & wgt
Definition: YControl.h:112
YSLib::UI::RoutedEventArgs::Direct
直接事件：仅当遍历至目标控件时触发。
Definition: YWidgetEvent.h:109
YSLib::UI::MLabel::UpdateClippedText
Drawing::GBrushUpdater< Drawing::TextState &, const String &, bool > UpdateClippedText
当前使用的剪切文本更新器。
Definition: Label.h:71
YSLib::Drawing::TextRenderer::ClipArea
Rect ClipArea
Definition: TextRenderer.h:403
YSLib::UI::OnKeyHeld
YF_API void OnKeyHeld(KeyEventArgs &&)
处理键接触保持事件。
Definition: YControl.cpp:109
YSLib::UI::MLabel
标签模块。
Definition: Label.h:61
YSLib::UI::Caret::CaretTimer
Timers::Timer CaretTimer
决定是否显示插入符的计时器。
Definition: TextBox.h:134
YSLib::UI::MLabel::AutoWrapLine
bool AutoWrapLine
启用自动换行。
Definition: Label.h:91
YSLib::Drawing::Point
GBinaryGroup< SPos > Point
屏幕二维点（直角坐标表示）。
Definition: YGDIBase.h:278
YSLib::UI::MLabel::Margin
Drawing::Padding Margin
文本和容器的间距。
Definition: Label.h:79
YSLib::UI::MLabel::GetAlignedPenOffset
Point GetAlignedPenOffset(const Size &) const
按参数指定的边界大小和当前状态计算笔的偏移位置。
Definition: Label.cpp:52
YSLib::Drawing::Padding::Top
SPos Top
Definition: YGDI.h:52
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:1022
platform::KeyCodes::DS::Backspace
Definition: Keys.h:251
YSLib::UI::MLabel::DefaultUpdateClippedText
static void DefaultUpdateClippedText(const PaintContext &, Drawing::TextState &, const String &, bool)
绘制剪切文本：使用指定的绘制上下文和文本状态。
Definition: Label.cpp:116
YSLib::Drawing::FillRect
c YF_API void FillRect(const Graphics &g, const Rect &r, Color c)
填充标准矩形。
Definition: YDraw.cpp:150
YSLib::Timers::Timer::RefreshRemainder
Duration RefreshRemainder()
刷新：对非零时间间隔判断有效性并都更新时间基点。
Definition: YTimer.cpp:108
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YSLib::IsInInterval
YB_STATELESS bool IsInInterval(_type i, _type b) ynothrow
判断 i 是否在左闭右开区间 [_type(0), b) 中。
Definition: YCoreUtilities.h:84
YSLib::UI::TextBox::GetPenOffset
Point GetPenOffset() const
取按字体和边距计算的起始笔偏移。
Definition: TextBox.cpp:284
YSLib::UI::FetchGUIState
GUIState & FetchGUIState() ynothrow
Definition: YGUI.cpp:508
YSLib::Drawing::x2
The boundary is out of the const Rect SDst SPos SPos SPos x2
Definition: YDraw.h:148
YSLib::UI::BackgroundPriority
yconstexpr const EventPriority BackgroundPriority(0xC0)
用户界面绘制优先级。
YSLib::UI::Widget::SPos
Renderer AView SPos
Definition: YWidget.h:459
YSLib::UI::TextBox::UpdateTextBoxClippedText
void UpdateTextBoxClippedText(const PaintContext &, TextState &)
Definition: TextBox.cpp:367
YSLib::UI::TextBox::Selection
TextSelection Selection
选择区域：结束位置指示插入符光标逻辑位置。
Definition: TextBox.h:225
YSLib::UI::TextBox::PaintDefaultCaret
void PaintDefaultCaret(PaintEventArgs &&)
绘制默认插入符。
Definition: TextBox.cpp:321
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:44
YSLib::Drawing::w
The boundary is out of the const Rect SDst w
Definition: YDraw.h:127
YSLib::Drawing::g
The boundary is out of the const Graphics & g
Definition: YDraw.h:161
YSLib::Drawing::TextState
文本状态。
Definition: TextBase.h:86
YSLib::UI::InvalidationUpdater::Invalidator
std::function< bool(IWidget &)> Invalidator
Definition: Animation.h:130
platform::KeyCodes::DS::Space
Definition: Keys.h:259
YSLib::UI::TextSelection::Position
GBinaryGroup< size_t > Position
位置：横坐标和纵坐标。
Definition: TextBox.h:174
YSLib::Drawing::FetchCharWidth
SDst FetchCharWidth(const Font &fnt, char32_t c)
Definition: TextLayout.cpp:72
YSLib::UI::GetLocationOf
pt pt Y const IWidget &wgt GetLocationOf
Definition: YWidget.h:153
ystdex::min
const _type & min(const _type &a, const _type &b, _fComp comp=less< _type >())
取较小的元素。
Definition: algorithm.hpp:527
YSLib::UI::HBrush
std::function< void(PaintEventArgs &&)> HBrush
画刷回调函数。
Definition: YComponent.h:81
YSLib::UI::TextBox::ExportCaretLocation
void ExportCaretLocation() const
导出插入符位置到公共 GUI 状态。
Definition: TextBox.cpp:303
placeholders
platform::SPos
std::int16_t SPos
屏幕坐标度量。
Definition: Video.h:43
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
platform::KeyCodes::DS::Shift
Definition: Keys.h:253
platform::KeyCategory::Navigation
表示导航键（如方向键和 PgUp ）、菜单键和 Esc 。
Definition: Keys.h:121
YSLib::UI::e
void e
Definition: YWidget.h:352
ystdex::state_guard
使用临时状态暂存对象的作用域守护。
Definition: scope_guard.hpp:273
YSLib::Drawing::GBinaryGroup< SPos >
platform::KeyCategory::Editing
表示编辑键（如回车、空格、退格、插入、删除和制表符）
Definition: Keys.h:123
YModules.h
YSLib::UI::KeyEventArgs
按键输入事件参数类。
Definition: YWidgetEvent.h:186
YSLib::UI::Caret::Stop
static void Stop() ynothrow
停止插入符光标动画。
Definition: TextBox.cpp:86
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
ystdex::swap
void swap(container_adaptor< _tSeqCon > &x, container_adaptor< _tSeqCon > &y)
Definition: container.hpp:179
YSLib::UI::Restart
_fCallable void Restart(_tAnimation &ani, IWidget &wgt, _fCallable f)
Definition: Animation.h:184
platform::KeyCodes::DS::Primary
static yconstexpr const NativeSet Primary
Definition: Keys.h:241
std
Definition: memory.hpp:1183
YSLib::UI::Control
控件。
Definition: YControl.h:275
YSLib::UI::TextBox::GetCaretPosition
TextSelection::Position GetCaretPosition(const Point &)
取指定点所在的插入符光标逻辑位置。
Definition: TextBox.cpp:260
YSLib::Drawing::FetchStringOffsets
pair< size_t, SDst > FetchStringOffsets(size_t max_width, const Font &fnt, _tIter s)
取迭代器指定的单行字符串在指定字体和宽度时的最多能显示的字符数和宽。
Definition: TextLayout.h:106
YSLib::Drawing::Padding::Left
SPos Left
空白距离：左、右、上、下。
Definition: YGDI.h:52
scope_guard.hpp
作用域守护。
YSLib::UI::IsFocusedCascade
YF_API bool IsFocusedCascade(const IWidget &, observer_ptr< const IWidget >={})
判断部件相对指针指定的部件是否具有级联焦点。
Definition: YFocus.cpp:121
YSLib::Drawing::GBinaryGroup::X
_type X
Definition: YGDIBase.h:63
YSLib::UI::TextBox::MaxLength
size_t MaxLength
用户界面输入文本的最大长度。
Definition: TextBox.h:236
CHRLib::c
c
Definition: CharacterProcessing.h:81
YSLib::UI::BorderArea::Right
YSLib::Drawing::TextRenderer
文本渲染器：简单实现。
Definition: TextRenderer.h:398
YSLib::UI::TextBox
文本框。
Definition: TextBox.h:205
YSLib::Drawing::char32_t
tr TextRegion &tr char32_t
Definition: TextLayout.h:92
YSLib::UI::TextSelection::Collapse
Collapse
Definition: TextBox.h:194
YSLib::UI::TextBox::SelectAll
void SelectAll()
全选操作。
Definition: TextBox.cpp:358
YSLib::RestrictUnsignedStrict
void RestrictUnsignedStrict(_type &u, _type b) ynothrow
约束无符号整数 u 在区间上界 b 内。
Definition: YCoreUtilities.h:236
YSLib::Drawing::PutText
void PutText(bool multi, _tParams &&...args)
打印文本。
Definition: TextRenderer.h:312
YSLib::UI::Caret::Check
bool Check(IWidget &)
检查是否需要对指定部件进行绘制。
Definition: TextBox.cpp:71
YSLib::UI::GetSizeOf
pt pt Y const IWidget &wgt const IWidget &wgt GetSizeOf
无效化：使相对部件的子部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.h:161
YSLib::UI::MHilightText
高亮文本模块。
Definition: Label.h:213
YSLib::UI::BorderArea::Left
YSLib::UI::MLabel::Font
Drawing::Font Font
字体。
Definition: Label.h:78
YSLib::UI::TextSelection::Range
Span Range
选择的范围。
Definition: TextBox.h:182
YSLib::UI::Caret::CaretBrush
HBrush CaretBrush
插入符画刷。
Definition: TextBox.h:139
YSLib::UI::TextBox::Refresh
void Refresh(PaintEventArgs &&) override
刷新：按指定参数绘制界面并更新状态。
Definition: TextBox.cpp:330
YSLib::Drawing::FetchStringWidth
SDst FetchStringWidth(const Font &fnt, _tIter s)
取迭代器指定的单行字符串在字体指定、无边界限制时的显示宽度。
Definition: TextLayout.h:197
CHRLib::p
const auto p(d)
YSLib::Text::String
YSLib 标准字符串（使用 UCS-2 作为内部编码）。
Definition: YString.h:46