[英]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.