QT程序的dpi导致显示异常处理方法

#include "mainwindow.h"

#include

#include

#include

#ifdef Q_OS_WIN

#include <windows.h>

// 定义必要的常量和函数类型

typedef enum _PROCESS_DPI_AWARENESS {

PROCESS_DPI_UNAWARE = 0,

PROCESS_SYSTEM_DPI_AWARE = 1,

PROCESS_PER_MONITOR_DPI_AWARE = 2

} PROCESS_DPI_AWARENESS;

typedef enum _DPI_AWARENESS_CONTEXT {

DPI_AWARENESS_CONTEXT_UNAWARE = -1,

DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = -2,

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = -3,

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4

} DPI_AWARENESS_CONTEXT;

// 设置DPI为系统处理(不依赖shellscalingapi.h)

void forceSystemDPIScaling()

{

// 尝试使用SetProcessDpiAwarenessContext (Windows 10 1703+)

HMODULE user32 = LoadLibraryA("user32.dll");

if (user32) {

// 定义函数指针类型

typedef BOOL (WINAPI *SetProcessDpiAwarenessContextFunc)(DPI_AWARENESS_CONTEXT);

SetProcessDpiAwarenessContextFunc pFunc =

(SetProcessDpiAwarenessContextFunc)GetProcAddress(user32, "SetProcessDpiAwarenessContext");

复制代码
    if (pFunc) {
        // 关键:让系统处理DPI缩放
        pFunc(DPI_AWARENESS_CONTEXT_UNAWARE);
        qDebug() << "Set DPI awareness context to UNAWARE";
        FreeLibrary(user32);
        return;
    }
    FreeLibrary(user32);
}

// 尝试使用SetProcessDpiAwareness (Windows 8.1+)
HMODULE shcore = LoadLibraryA("Shcore.dll");
if (shcore) {
    typedef HRESULT (WINAPI *SetProcessDpiAwarenessFunc)(PROCESS_DPI_AWARENESS);
    SetProcessDpiAwarenessFunc pFunc =
        (SetProcessDpiAwarenessFunc)GetProcAddress(shcore, "SetProcessDpiAwareness");

    if (pFunc) {
        pFunc(PROCESS_DPI_UNAWARE);
        qDebug() << "Set process DPI awareness to UNAWARE";
        FreeLibrary(shcore);
        return;
    }
    FreeLibrary(shcore);
}

// 最后回退:不调用SetProcessDPIAware(),因为我们要的是未感知
qDebug() << "Using default DPI handling (system managed)";

}

#endif

int main(int argc, char *argv\[\])

{

#ifdef Q_OS_WIN

// 设置DPI为系统处理

forceSystemDPIScaling();

#endif

复制代码
// 完全禁用Qt的DPI处理
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);


QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();

}

相关推荐
C^h5 小时前
c++ string
开发语言·c++
raindayinrain5 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的5 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的6 小时前
C 局部静态变量
c语言·开发语言·网络安全
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的7 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言7 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
TMedical8 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗