首页 > 解决方案 > macOS 上的 wxWidgets 暗模式

问题描述

根据 3.1.3 ( https://raw.githubusercontent.com/wxWidgets/wxWidgets/v3.1.3/docs/changes.txt ) 的发行说明,暗模式支持已添加到 wxWidgets for Mojave+。

对于 wxSysColourChanged 的​​文档,它仍然声明这仅适用于 Windows,但我认为对 macOS 的暗模式支持也应该包括这个?暗模式只是 Windows UWP 应用程序的最新添加,而不是 Win32(有关论坛上的讨论,请参阅Windows 10 上的暗模式)。

在任何情况下,我都无法触发事件,尽管切换到暗模式确实可以正确更新 GUI 元素,例如。wxlistctrl 和 wxbutton 无需我手动强制执行颜色更改。我正在尝试捕获系统颜色更改事件,以便我可以手动重绘我自己的“所有者绘制的”自定义 GUI 元素正确地暗/亮。

我将构造函数中的 Bind 连接到我的事件,但没有任何效果:

Bind(wxEVT_SYS_COLOUR_CHANGED, &myFrame::OnSystemColourChanged, this);

void myFrame::OnSystemColourChanged(wxSysColourChangedEvent &event)
{
  wxSystemAppearance s = wxSystemSettings::GetAppearance();
  wxString dark = s.IsDark() ? "it's dark" : "it's light";
  wxString m("System colour changed - ");
  m += dark;
  ::wxMessageBox(m);
  event.Skip();
}

我已在论坛(此处)上将其作为查询打开,他们推荐了邮件列表,但我注意到 wxWidgets 问题在这里很快得到解决,特别是 VZ,所以希望如此!

我错过了一些检测颜色变化的方法吗?

标签: c++macoswxwidgets

解决方案


好的,我设法让代码命中。我通过添加一个 wxApp 级别的 HandleEvent 覆盖函数来调试它,以查看应用程序正在处理哪些事件(是的,所有事件都经过这里):

void myApp::HandleEvent(wxEvtHandler *handler, wxEventFunction func, wxEvent& event) const
{
  wxApp::HandleEvent(handler, func, event);
}

wxSysColourChanged 事件确实是通过这个。

我设法通过不同的连接方式让我的主框架的处理程序受到影响。代替

Bind(wxEVT_SYS_COLOUR_CHANGED, &myFrame::OnSystemColourChanged, this);

我改用这个:

Bind(wxEVT_SYS_COLOUR_CHANGED, wxSysColourChangedEventHandler(myFrame::OnSystemColourChanged), this);

我不知道为什么无法识别 &myFrame::OnSystemColourChanged。此外,我无法在我的事件处理程序中显示任何消息框。::wxMessageBox 和 wxMessageDialog 没有显示。cout 输出确实显示了,但没有弹出 GUI 对话框。无论如何,我都不会在这个处理程序中显示消息框,所以这不是问题,而是试图显示一条消息以用于调试/测试目的。


推荐阅读