SFML: сохранить частичную область RenderWindow не обновленной - PullRequest
1 голос
/ 01 апреля 2019

Я ожидаю получить тот же эффект, что и GraphicsPath от Winforms, который позволяет сохранять некоторые определенные области myForm не обновленными.fi:

myForm.Invalidate(new Region(graphicsPath));

Моя конечная цель - рисовать объекты в не обновленном месте, используя HDC (дескриптор контекста устройства), который я предоставлю внешнему приложению.(В настоящее время это работает с использованием winforms).

Я использую SFML.Net 2.4 и создаю свое окно следующим образом:

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

Я все еще могу создать HDC на myForm, однако дажебез вызова:

mySfmlWindow.Clear(color);

, вещи, нарисованные внешним приложением, по-прежнему мгновенно очищаются.

1 Ответ

0 голосов
/ 02 апреля 2019

Ручной подход

Вы можете нарисовать желаемый фон самостоятельно. У меня есть пример, где я рисую половину фона окна вручную, в то время как другая половина не очищается.

enter image description here

Левая половина «очищена» серым цветом, чтобы показать точку.

В коде я использую 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;
}
...