Checkboxes in dark mode are incorrectly notified as buttons for screen readers

Quentin Cosendey <[email protected]> Wed, 20 Aug 2025 22:11:27 +0200
Newsgroups gmane.comp.lib.wxwindows.general
Message-ID <[email protected]>
Hello,

I have quite a simple and classic dialog box with text fields, 
checkboxes and buttons. Everything works as expected as long as the app 
is in light or unspecified appearance mode.
However, when the app is in dark mode, checkboxes are notified as 
buttons by screen readers (Jaws and NVDA), and their state checked or 
unchecked isn't announced. They continue to work properly, i.e. the 
state correctly switches when clicking or pressing space, but they keep 
being indicated as buttons without state to screen readers, as long as 
dark mode is on. So screen reader users can no longer know that these 
controls are indeed checkboxes, and if the checkboxes are checked or not.

Am I missing something ? Should I do something special for dark mode ? 
Is that a limitation of dark mode ? Or this is just a bug ?

I'm using WXWidgets 3.3.2 developement / master branch, last updated 
about 10-15 days ago, on Windows 11.

Everything was fine in v3.2.

I activate dark mode with:
SetAppearance(Appearance::Dark);
in wxApp::OnInit, according to user configuration.

My dialog box is pretty simple, some example code:

ConnectDialog::ConnectDialog (App& app0):
wxDialog(nullptr, wxID_ANY,
U(translate("connTitle")),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE),
app(app0)
{
auto usernameLabel = new wxStaticText(this, wxID_ANY, 
U(translate("login")));
username = new wxTextCtrl(this, ID_USERNAME, wxEmptyString,
wxDefaultPosition, wxDefaultSize, 0);
auto passwordLabel = new wxStaticText(this, wxID_ANY, 
U(translate("password")));
password = new wxTextCtrl(this, ID_PASSWORD, wxEmptyString, 
wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD);
rememberMe = new wxCheckBox(this, ID_REMEMBERME, 
U(translate("rememberpassword")));
autologin = new wxCheckBox(this, ID_AUTOLOGIN, 
U(translate("useAutoLogin")));
auto connectBtn = new wxButton(this, wxID_OK, U(translate("connection")));

...

auto dlgSizer = new wxFlexGridSizer(2, 5, 5);
dlgSizer->Add(usernameLabel, 0);
dlgSizer->Add(username, 0, wxEXPAND);
dlgSizer->Add(passwordLabel, 0);
dlgSizer->Add(password, 0, wxEXPAND);
dlgSizer->Add(new wxStaticText(this, wxID_ANY, wxEmptyString), 0);
dlgSizer->Add(rememberMe, 0, wxEXPAND);
dlgSizer->Add(new wxStaticText(this, wxID_ANY, wxEmptyString), 0);
dlgSizer->Add(autologin, 0, wxEXPAND);
dlgSizer->Add(connectBtn, 0);

...

SetSizerAndFit(dlgSizer);

username->SetFocus();
}


Thank you for your help.

-- 
Please read https://www.wxwidgets.org/support/mlhowto.htm before posting.
--- 
You received this message because you are subscribed to the Google Groups "wx-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion visit https://groups.google.com/d/msgid/wx-users/3431a5bc-a51b-4b13-a0a4-a6bb71c9dcd8%40bluewin.ch.