You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio Community 2017中SFML教程图形显示异常求助

解决SFML图形垂直拉伸的问题

这种垂直拉伸的情况我之前在高DPI屏幕上踩过坑!大概率是系统显示缩放导致的,和VS2017或者SFML本身的基础配置关系不大,尤其是当你的显示器设置了125%/150%这类非100%的缩放比例时,很容易出现这个问题。下面给你几个靠谱的解决办法:

方法1:配置VS项目的高DPI感知

这是最简单的方法,不用改代码:

  • 右键你的VS项目 → 属性
  • 依次展开「配置属性」→「链接器」→「清单文件」
  • 找到「启用DPI感知」选项,把它改成「高DPI感知」(VS2017里对应的选项值是true)
  • 点击「确定」后重新编译运行,图形应该就能正常显示了

方法2:手动在代码中适配DPI缩放

如果方法1没生效,可以通过Windows API获取系统缩放比例,手动调整窗口和图形的尺寸:

#include <SFML/Graphics.hpp>
#include <windows.h> // 需要包含Windows系统头文件

int main() {
    // 获取当前系统的DPI缩放比例
    HWND desktopWnd = GetDesktopWindow();
    HDC desktopDC = GetDC(desktopWnd);
    float dpiScale = static_cast<float>(GetDeviceCaps(desktopDC, LOGPIXELSX)) / 96.0f;
    ReleaseDC(desktopWnd, desktopDC);

    // 根据缩放比例创建窗口(原200x200 × 缩放比例)
    sf::RenderWindow window(
        sf::VideoMode(static_cast<unsigned int>(200 * dpiScale), static_cast<unsigned int>(200 * dpiScale)), 
        "SFML works!"
    );

    sf::CircleShape shape(100 * dpiScale); // 图形尺寸也要乘以缩放比例
    shape.setFillColor(sf::Color::Green);
    shape.setOrigin(100 * dpiScale, 100 * dpiScale); // 别忘了调整原点,保证图形居中
    shape.setPosition(200 * dpiScale / 2, 200 * dpiScale / 2);

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

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

这段代码的核心是获取系统的DPI缩放比例,然后把窗口、图形的尺寸都乘以这个比例,确保显示效果和预期一致。

方法3:调整系统显示缩放设置(不推荐高分辨率屏幕)

右键桌面 → 显示设置 → 找到「缩放与布局」,把缩放比例调回100%。这个方法虽然能解决问题,但对于高分辨率屏幕来说,文字和图标会变得很小,体验不好,所以更推荐前两种方法。

另外补充一句:你用的SFML 2.4版本对高DPI的支持比较有限,如果有条件的话,升级到SFML 2.5及以上版本,新版本已经内置了对Windows高DPI的支持,配置起来会更省心~

内容的提问来源于stack exchange,提问作者Eric Fan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:38:22