【发布时间】:2021-04-17 08:59:58
【问题描述】:
我有一个显示文本的 sfml 窗口,现在我想让它可标记,以便您可以复制文本。 任何想法如何做到这一点?
【问题讨论】:
我有一个显示文本的 sfml 窗口,现在我想让它可标记,以便您可以复制文本。 任何想法如何做到这一点?
【问题讨论】:
如果您只想复制所有内容,请使用
sf::Clipboard::setString(your_string_here);
如果您想要更多功能,以下是我在 SFML 中编写代码编辑器时实现的一些功能。
我存储了两个索引,第一个是选择的开始位置,第二个是部分的结束位置。
所以在字符串Hello World! 中,如果您想选择World,您可以将开始索引设置为6,将结束索引设置为10 或11(取决于您是否包含最后一个字符)。
我使用sf::RectangleShape 渲染它,因为我的编辑器支持多行选择框,所以代码更复杂,但对于您的示例,您可能希望获取每个字符的位置。我使用了自己的文本渲染器,但 SFML 的 sf::Text::findCharacterPos() 应该可以提供帮助。
接下来是复制部分,这只是
sf::Clipboard::setString(getSelected());
getSelected() 在哪里
return std::string::substr(selection_begin, selection_end - selection_begin);
如果你也想粘贴,那也很简单:
eraseSelected();
insertStringAtCursor(sf::Clipboard::getString());
这也是简单的字符串操作(std::string::erase 和重置选择索引,以及std::string::insert)。
最后,让用户改变选择的内容,或者按住shift加方向键,或者点击拖拽都是常用的方式,前者比后者容易。
对于前者,检查是否按住 shift,然后如果按下左或右,则更新索引。
对于后者,您需要处理鼠标事件和拖动。开始拖动时,设置一个索引,而在鼠标移动并拖动时设置另一个索引。
【讨论】: