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

}

相关推荐
浪子明X4 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
Quz6 小时前
QML StackView:实现卡片堆叠效果
qt
Quz6 小时前
QML Drawer 抽屉导航详解
qt
xiangyun617 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun617 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山8 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay9 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
free-elcmacom9 小时前
C++学习<1>程序分区
开发语言·c++
醉颜凉10 小时前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语10 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重