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
相关产品推荐
相关产品推荐

