繁体   English   中英

SFML:保持 RenderWindow 的部分区域未刷新

[英]SFML: keep a RenderWindow's partial region unrefreshed

我希望获得与 Winforms 中的 GraphicsPath 相同的效果,这允许保持 myForm 的某些特定区域未刷新。 菲:

myForm.Invalidate(new Region(graphicsPath));

我的最终目标是使用我将提供给外部应用程序的 HDC(设备上下文句柄)在未刷新的位置绘制内容。 (这目前使用 winforms 工作)。

我正在使用 SFML.Net 2.4 并以这种方式创建我的窗口:

 SFML.Graphics.RenderWindow  mySfmlWindow = new RenderWindow(myForm.Handle, settings);

但是,即使不调用,我仍然可以在 myForm 上创建 HDC:

mySfmlWindow.Clear(color);

,外部应用绘制的东西仍然是瞬间清除。

手动方法

您可以自己绘制所需的背景。 我有一个例子,我手动绘制了一半的窗口背景,而另一半没有清除。

在此处输入图片说明

左半部分被“清除”为灰色,只是为了表明这一点。

在代码中,我使用sf::RectangleShape来清除窗口,但如果您的形状更复杂,您可以使用sf::VertexArray


完整代码

int main(){
    sf::RenderWindow win(sf::VideoMode(640, 480), "SFML Test");

    sf::RectangleShape r1;
    r1.setOrigin(sf::Vector2f(25, 25));
    r1.setPosition(50, 50);
    r1.setSize(sf::Vector2f(50, 50));
    r1.setFillColor(sf::Color::Red);

    sf::RectangleShape r2;
    r2.setOrigin(sf::Vector2f(25, 25));
    r2.setPosition(400, 50);
    r2.setSize(sf::Vector2f(50, 50));
    r2.setFillColor(sf::Color::Blue);


    sf::RectangleShape updatedRegion;
    updatedRegion.setPosition(0, 0);
    updatedRegion.setSize(sf::Vector2f(320, 480));  // Half window
    updatedRegion.setFillColor(sf::Color(30,30,30));    // Dark gray just for the sake of the example

    while (win.isOpen())
    {
        sf::Event event;
        while (win.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                win.close();
            }
        }

        //win.clear();              // We skip the clearing process
        win.draw(updatedRegion);    // And do our own "clear"
        win.draw(r1);
        win.draw(r2);
        win.display();

        // Just some movement to test the concept
        r1.rotate(0.01);
        r2.rotate(0.01);

    }

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM