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

}

相关推荐
zhangzeyuaaa3 分钟前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
谢亮_vipxieliang1 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
思无邪661 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
H.莓飛2 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
零基础1233 小时前
Ubuntu 常用命令汇总
linux·运维·开发语言
外收内放3 小时前
Python基础语法练习题(57-58)
开发语言·python
时间的拾荒人3 小时前
Qt 界面美化实战:QSS 样式表
开发语言·qt·面试
杨运交4 小时前
[076][核心模块]构建优雅的Java异常处理框架:从错误码到全局异常处理
java·开发语言
可乐鸡翅yeah_4 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
小鹿的周先生4 小时前
第11章-Structured-Output
开发语言·人工智能·python