1

关于我的设置的信息

  • wxWidgets:3.1.5(也尝试了来自github的最新源)
  • wxWidgets:在 msys2 (ucrt64) 下使用 gcc-11.2 构建
  • Windows 10 应用程序:在 msys2 (ucrt64) 下使用 gcc-11.2 构建
  • 监控原生分辨率:3840 x 2160
  • IDE:Eclipse 2021-09

我的问题

如果我构建我的应用程序并链接到一个没有使用 HiDPI 感知清单的资源文件,那么一切正常,但是正如人们所期望的那样,字体是像素化的。但是,一旦我与 HiDPI 感知资源文件链接,则控件的大小不会与其关联的文本成比例地调整。请参阅以下屏幕截图。

非 hidpi 感知资源文件 - 以 200% 缩放

上图显示了在没有 HiDPI 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 200%。如您所见,wxFrame 已正确渲染。

非 hidpi 感知资源文件 - 缩放 350%

上图显示了在没有 HiDPI 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 350%。如您所见,(除了模糊的文本)wxFrame 已正确渲染。

hidpi 感知资源文件 - 以 200% 缩放

上图显示了使用HiDPI 感知资源文件渲染的测试 wxFrame。监视器缩放比例为 200%。如您所见,wxFrame 渲染得很糟糕。这个 wxFrame 以 100% 的比例正确渲染。

这是一个最小的功能齐全的代码示例来演示我的问题。

#include <wx/wx.h>
#include <wx/frame.h>
#include <wx/sizer.h>
#include <wx/button.h>

class HiDPI_Test: public wxFrame
{
public:
    HiDPI_Test() :
            wxFrame(NULL, wxID_ANY, "HiDPI Test")
    {
        wxBoxSizer *sizer_master = new wxBoxSizer(wxHORIZONTAL);

        m_btn_1 = new wxButton(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
        m_btn_1->SetMinSize(wxSize(-1, 30));
        m_btn_1->SetMaxSize(wxSize(120, 30));
        m_btn_1->SetLabel("Button Label Test");

        m_btn_2 = new wxButton(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0);
        m_btn_2->SetMinSize(wxSize(-1, 30));
        m_btn_2->SetMaxSize(wxSize(120, 30));
        m_btn_2->SetLabel("Button Label Test");

        sizer_master->Add(m_btn_1, 0, wxALL | wxEXPAND, 0);
        sizer_master->Add(m_btn_2, 0, wxALL | wxEXPAND, 0);

        this->SetSizerAndFit(sizer_master);
        this->Layout();
        this->Centre(wxBOTH);
    }
private:
    wxButton *m_btn_1, *m_btn_2;

};

class HiDPI: public wxApp
{
public:
    bool OnInit() override
    {
        HiDPI_Test *mainApp = new HiDPI_Test();
        mainApp->Show();
        return true;
    }
};

wxIMPLEMENT_APP(HiDPI);

对 SetMinSize() 和 SetMaxSize() 的调用对我的整体 UI 设计至关重要。

我使用以下内容构建了 wxWidgets 资源文件:

windres --use-temp-file -ires.rc -ores.o -I/home/user/resource -DwxUSE_DPI_AWARE_MANIFEST=2

然后,我在构建应用程序时将生成的目标文件传递给链接器。

重要的是要补充一点,我的应用程序可以在 wxWidgets/GTK3 (Linux) 和 wxWidgets macOS/Cocoa 上正确呈现。也就是说,它可以在 macOS 和 Linux 上以任何比例值正常工作(没有像素化字体)。

当我在 Windows 10 上使用 HiDPI 感知资源文件时,是否有人知道为什么我的应用程序无法正确呈现?

4

1 回答 1

3

一般来说,以像素为单位使用大小是一个非常糟糕的主意,因为这不会考虑当前的字体大小,因此使用对话框单元或仅使用GetTextExtent("something")的结果会更好。

但是,如果您绝对想使用像素,则至少需要使用 将它们转换为适当的单位,有关更多信息FromDIP(),请参阅手册中的 HiDPI 概述。

如果你使用

        m_btn_1->SetMinSize(FromDIP(wxSize(-1, 30)));
        m_btn_1->SetMaxSize(FromDIP(wxSize(120, 30)));

您的代码在 200% 的缩放中按预期工作,至少与当前的 master 一起工作(我认为这也应该适用于 3.1.5,但从那时起已经有大量与高 DPI 相关的改进,所以我强烈建议使用 master/如果你关心高 DPI 支持,3.1.6 很快就会发布)。

于 2022-02-01T16:40:02.987 回答