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

}

相关推荐
ximen502_2 分钟前
Python 语言知识总结
开发语言·python
m0_7381207210 分钟前
PHP代码审计基础——超全局变量(三)
开发语言·安全·网络安全·php
烟锁池塘柳016 分钟前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++
C+-C资深大佬34 分钟前
Java 变量:从入门到精通
java·开发语言·python
辞旧 lekkk35 分钟前
【Qt系统相关】鼠标事件
linux·开发语言·qt·学习·计算机外设·萌新
chouchuang1 小时前
day-027-面向对象-下
开发语言·python
誰能久伴不乏1 小时前
C++11 随机数生成——告别 rand()
开发语言·c++
海清河晏1111 小时前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio
kuonyuma1 小时前
java之动态代理
java·开发语言
KouFiee1 小时前
同名隐藏基础
开发语言·c++