【问题标题】:How can I copy a text from a sfml window?如何从 sfml 窗口复制文本?
【发布时间】:2021-04-17 08:59:58
【问题描述】:

我有一个显示文本的 sfml 窗口,现在我想让它可标记,以便您可以复制文本。 任何想法如何做到这一点?

【问题讨论】:

    标签: c++ windows sfml


    【解决方案1】:

    如果您只想复制所有内容,请使用

    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,然后如果按下左或右,则更新索引。

    对于后者,您需要处理鼠标事件和拖动。开始拖动时,设置一个索引,而在鼠标移动并拖动时设置另一个索引。

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 1970-01-01
      • 2017-06-11
      • 2013-12-11
      • 2016-05-15
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      相关资源
      最近更新 更多