实现自己的跨平台屏幕缩放解决方案。获取屏幕DPI信息和根据DPI计算缩放比率的思路对开发高DPI支持的应用,单一程序开启

计算缩放比率

float winDpiScaleEx()
{
#ifdef Q_OS_MAC
    return 1.0;
#else
    float rt = 0;
    if (rt == 0) {
        HDC screen = GetDC(NULL);
        FLOAT dpiX = static_cast<FLOAT>( GetDeviceCaps( screen, LOGPIXELSX ) );
        ReleaseDC( 0, screen );
        rt = dpiX / DEFAULT_DPI;
        if (rt > 1)
            return rt * 0.8; //这里缩小了缩放比率,因为1.5倍或2倍会变得特别大
        return rt;
    }
    return rt;
#endif
}

这段代码实现了跨平台获取屏幕DPI缩放比例的功能。主要分为两部分:

  1. macOS平台直接返回1.0,不做缩放。

  2. 其他平台(主要是Windows)获取屏幕DPI,并计算出缩放比率。
    具体分析代码:
    cpp
    #ifdef Q_OS_MAC
    return 1.0;
    #else
    这里使用了条件编译,针对macOS平台直接返回1.0。
    cpp
    float rt = 0;
    if (rt == 0) {
    HDC screen = GetDC(NULL);
    FLOAT dpiX = static_cast( GetDeviceCaps( screen, LOGPIXELSX ) );
    ReleaseDC( 0, screen );

     rt = dpiX / DEFAULT_DPI;  
    

对于其他平台,先检查是否已经计算过缩放比率rt。如果没有,则获取屏幕HDC,使用GetDeviceCaps获取屏幕DPI信息LOGPIXELSX。然后计算出缩放比率:屏幕DPI除以默认DPI 96。
cpp
if (rt > 1)
return rt * 0.8; //这里缩小了缩放比率,因为1.5倍或2倍会变得特别大
return rt;
}
return rt;
#endif
如果计算出的缩放比率大于1,则进一步将其缩小到0.8倍,因为过高的缩放比率会使界面变得很大。最后返回缩放比率rt。
所以,这段代码的主要作用是:

  1. 针对不同平台,获取不同的屏幕DPI缩放比率:
    • macOS平台不进行缩放,返回1.0
    • 其他平台如Windows获取实际屏幕DPI,计算出缩放比率,且对过高的比率进行一定缩小
  2. 缓存计算出的缩放比率rt,避免重复计算。
  3. 实现一个跨平台的屏幕DPI缩放解决方案。
    开发人员可以参考这段代码,实现自己的跨平台屏幕缩放解决方案。获取屏幕DPI信息和根据DPI计算缩放比率的思路对开发高DPI支持的应用很有帮助。
    总之,这段代码运用了条件编译和跨平台API,很好地实现了一个获取屏幕DPI缩放比率的跨平台解决方案。开发人员可以借鉴这个思路和代码,以在自己的应用中实现高效和优雅的高DPI支持。

控制程序只能打开一个

int main()
{
	QApplication::setAttribute(Qt::AA_DontShowIconsInMenus,false); //菜单图标不显示
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);//控制图片缩放质量
    
    QtSingleApplication app(argc, argv); //创建QtSingleApplication实例,检测是否已经运行,如果是则发送命令行参数并退出
    if (app.isRunning())
    {
//          app.sendMessage("raise_window_noop");
        QString message;
        if(qApp->arguments().size() >=2)
                message = qApp->arguments().at(1);
            app.sendMessage(message);
            return EXIT_SUCCESS;
    }
    QDir::setCurrent(QApplication::applicationDirPath()); //设置当前工作目录胃应用程序目录
    app.setQuitOnLastWindowClosed(false);  //设置关闭最后一个窗口时不退出应用程序
    app.addLibraryPath(app.applicationDirPath());  //

    QLibrary utils(app.applicationDirPath()+"/utils",&app);  
    utils.load();  //动态加载utils库
	
	QFont font;
    font.setPixelSize(FONTSIZE_NORMAL);
    font.setFamily("PingFang SC Regular");
    font.setWeight(QFont::Medium);
    app.setFont(font);
    PluginManager pm(&app);
    QObject::connect(&app,&QtSingleApplication::messageReceived,[&](const QString message){
        generateArgs(message.toUtf8());
       qDebug()<<message;
        emit pm.argumentsChanged();
    });

	QString message;
    if(qApp->arguments().size() >=2)
    {
        message = qApp->arguments().at(1);
    }

	generateArgs(message.toUtf8());   //解析命令行参数,并连接插件管理器,设置活动窗口 启动插件管理器pm
    QObject::connect(&pm,&PluginManager::setActiveWindow,[&](QWidget *widget){
        app.setActivationWindow(widget);
    });
    pm.restart();

    return app.exec();
}

你可能感兴趣的:(c++,qt,c++)