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();

}

相关推荐
上海安当技术4 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
不才不才不不才4 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
mifengxing4 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
Yolanda_20225 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习
郝学胜-神的一滴5 小时前
Qt 高级编程 037:QSS按钮样式封神指南
开发语言·c++·qt·软件工程·用户界面
DFT计算杂谈5 小时前
SCIENTIFIC REPORTS 非 van der Waals可调二维磁性材料设计平台
开发语言·php
库拉库拉里5 小时前
深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
开发语言·c#
霍霍的袁5 小时前
【C++】string类 从 入门使用 到 底层深浅拷贝模拟实现
开发语言·c++·visual studio
酷在前行5 小时前
【R绘图】Nature Communications 半眼图复刻:分布、区间与多面板排版(保姆级教程)
android·开发语言·r语言
C++、Java和Python的菜鸟6 小时前
第10章 后端Web进阶(Maven高级)
开发语言·python