关于我的设置的信息
- 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 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 200%。如您所见,wxFrame 已正确渲染。
上图显示了在没有 HiDPI 感知资源文件的情况下渲染的测试 wxFrame。监视器缩放比例为 350%。如您所见,(除了模糊的文本)wxFrame 已正确渲染。
上图显示了使用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 感知资源文件时,是否有人知道为什么我的应用程序无法正确呈现?